// 函数调用参数提示 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); }