// 函数调用参数提示
        public void QuerySignatureHelp(int offset)
        {
            // 获取元素
            var element = GetException(offset);

            if (element == null)
            {
                return;
            }

            // 获取类型
            ABnfNodeElement node = element as ABnfNodeElement;

            if (node == null)
            {
                node = element.GetParent();
            }
            if (node == null)
            {
                return;
            }

            var info = node.GetReference().QuerySignatureHelp(out int start, out int length);

            if (info == null)
            {
                return;
            }
            if (info.param_list.Count == 0)
            {
                return;
            }

            Application.Current.Dispatcher.Invoke(() =>
            {
                if (m_view.TextBuffer.Properties.TryGetProperty(nameof(ALanguageSignatureHelpSource), out ALanguageSignatureHelpSource source))
                {
                    source.RefreshSignatureHelp(m_view, start, length, info);
                    if (m_view.Properties.TryGetProperty(nameof(ALanguageController), out ALanguageController controller))
                    {
                        controller.StartSignatureHelp(start);
                    }
                }
                else
                {
                    if (m_view.Properties.TryGetProperty(nameof(ALanguageController), out ALanguageController controller))
                    {
                        controller.StartSignatureHelp(start);
                    }
                    if (m_view.TextBuffer.Properties.TryGetProperty(nameof(ALanguageSignatureHelpSource), out source))
                    {
                        source.RefreshSignatureHelp(m_view, start, length, info);
                    }
                }
            });
        }
        // 拾取高亮
        public void PeekHighlightWord(int offset, long version)
        {
            ABnfElement element = GetException(offset);

            if (element == null)
            {
                return;
            }
            if (element is ABnfErrorElement)
            {
                return;
            }

            var    target = element;
            string value  = element.GetElementText();

            if (!m_left_pairs.ContainsKey(value) && !m_right_pairs.ContainsKey(value))
            {
                target = null;
            }

            ABnfNodeElement node = element as ABnfNodeElement;

            if (node == null)
            {
                node = element.GetParent();
            }
            if (node == null)
            {
                return;
            }

            if (node.GetReference().PeekHighlightWord())
            {
                target = node;
            }

            if (target == null)
            {
                return;
            }

            var list = new List <ALanguageHighlightWordInfo>();

            QueryHighlightWordTag(element, list);
            Application.Current.Dispatcher.Invoke(() =>
            {
                if (m_view.Properties.TryGetProperty(nameof(ALanguageHighlightWordTagger), out ALanguageHighlightWordTagger tagger))
                {
                    tagger.Refresh(version, list);
                }
            });
        }
        // 跳转
        public void GotoDefinition(int offset)
        {
            var element = GetException(offset);

            if (element == null)
            {
                return;
            }
            if (element is ABnfErrorElement)
            {
                return;
            }

            ABnfNodeElement node = element as ABnfNodeElement;

            if (node == null)
            {
                node = element.GetParent();
            }
            if (node == null)
            {
                return;
            }

            var target = node.GetReference().GotoDefinition();

            if (target == null)
            {
                return;
            }

            string full_path = target.GetFullPath();
            int    start     = target.GetStart();
            int    length    = target.GetLength();

            Application.Current.Dispatcher.Invoke(() =>
            {
                if (m_view.Properties.TryGetProperty(nameof(UIViewItem), out UIViewItem info))
                {
                    info.JumpToView(full_path, start, length);
                }
            });
        }
        // 高亮标签
        public void QueryHighlightWordTag(ABnfElement element, List <ALanguageHighlightWordInfo> info_list)
        {
            // 找到对应的配对
            string value = element.GetElementText();

            if (m_left_pairs.TryGetValue(value, out string right_pair))
            {
                var parent = element.GetParent();
                if (parent == null)
                {
                    return;
                }

                // 找到所在的位置
                var childs = parent.GetChilds();
                int index  = childs.IndexOf(element);
                if (index < 0)
                {
                    return;
                }

                // 往后找到对应的匹配
                for (int i = index + 1; i < childs.Count; ++i)
                {
                    if (childs[i].GetElementText() == right_pair)
                    {
                        var info = new ALanguageHighlightWordInfo();
                        info.start = element.GetStart();
                        info.end   = element.GetEnd();
                        info_list.Add(info);

                        info       = new ALanguageHighlightWordInfo();
                        info.start = childs[i].GetStart();
                        info.end   = childs[i].GetEnd();
                        info_list.Add(info);

                        break;
                    }
                }
                return;
            }

            // 找到对应的配对
            if (m_right_pairs.TryGetValue(value, out string left_pair))
            {
                var parent = element.GetParent();
                if (parent == null)
                {
                    return;
                }

                // 找到所在的位置
                var childs = parent.GetChilds();
                int index  = childs.IndexOf(element);
                if (index < 0)
                {
                    return;
                }

                // 往前找到对应的匹配
                for (int i = index - 1; i >= 0; --i)
                {
                    if (childs[i].GetElementText() == left_pair)
                    {
                        var info = new ALanguageHighlightWordInfo();
                        info.start = element.GetStart();
                        info.end   = element.GetEnd();
                        info_list.Add(info);

                        info       = new ALanguageHighlightWordInfo();
                        info.start = childs[i].GetStart();
                        info.end   = childs[i].GetEnd();
                        info_list.Add(info);

                        break;
                    }
                }
                return;
            }

            ABnfNodeElement node = element as ABnfNodeElement;

            if (node == null)
            {
                node = element.GetParent();
            }
            if (node == null)
            {
                return;
            }

            // 找到高亮配对
            node.GetReference().QueryHighlightWordTag(info_list);
        }
        // 获取信息
        public void QueryQuickInfo(int offset)
        {
            // 获取元素
            var element = GetException(offset);

            if (element == null)
            {
                return;
            }

            if (element is ABnfErrorElement)
            {
                return;
            }

            // 获取类型
            ABnfNodeElement node = element as ABnfNodeElement;

            if (node == null)
            {
                node = element.GetParent();
            }
            if (node == null)
            {
                return;
            }
            element = node;

            var info = node.GetReference().QueryQuickInfo();

            if (info == null)
            {
                return;
            }

            int start  = element.GetStart();
            int length = element.GetLength();

            Application.Current.Dispatcher.Invoke(() =>
            {
                if (m_view.TextBuffer.Properties.TryGetProperty(nameof(ALanguageQuickInfoSource), out ALanguageQuickInfoSource source))
                {
                    source.RefreshQuickInfo(start, length, info);
                    if (m_view.Properties.TryGetProperty(nameof(ALanguageController), out ALanguageController controller))
                    {
                        controller.StartQuickInfo(start);
                    }
                }
                else
                {
                    if (m_view.Properties.TryGetProperty(nameof(ALanguageController), out ALanguageController controller))
                    {
                        controller.StartQuickInfo(start);
                    }
                    if (m_view.TextBuffer.Properties.TryGetProperty(nameof(ALanguageQuickInfoSource), out source))
                    {
                        source.RefreshQuickInfo(start, length, info);
                    }
                }
            });
        }
        private bool QueryCompletionImpl(string input, int offset, out int start, out int length, out List <ALanguageCompletionInfo> list)
        {
            list   = new List <ALanguageCompletionInfo>();
            start  = offset;
            length = 1;

            // 获取元素
            var element = GetException(offset);

            if (element == null)
            {
                var new_input = m_factory.ShowKeyWordCompletion(input, element);
                if (new_input != null)
                {
                    m_abnf.QueryKeyWordCompletion(new_input, list);
                }
                return(true);
            }

            if (element is ABnfErrorElement)
            {
                var new_input = m_factory.ShowKeyWordCompletion(input, element);
                if (new_input != null)
                {
                    m_abnf.QueryKeyWordCompletion(new_input, list);
                }
                return(true);
            }

            if (element.GetLength() != 0)
            {
                start  = element.GetStart();
                length = element.GetLength();
            }

            ABnfNodeElement node = element as ABnfNodeElement;

            if (node == null)
            {
                node = element.GetParent();
            }
            if (node == null)
            {
                var new_input = m_factory.ShowKeyWordCompletion(input, node);
                if (new_input != null)
                {
                    m_abnf.QueryKeyWordCompletion(new_input, list);
                }
                return(true);
            }

            {
                var new_input = m_factory.ShowKeyWordCompletion(input, node);
                if (new_input != null)
                {
                    m_abnf.QueryKeyWordCompletion(new_input, list);
                }
            }
            var result = node.GetReference().QueryCompletion(offset, list);

            if (list.Count == 0)
            {
                return(result);
            }

            list.Sort(delegate(ALanguageCompletionInfo a, ALanguageCompletionInfo b) { return(a.display.CompareTo(b.display)); });
            return(true);
        }