public override string FastGoto(ALanguageServer server, Dictionary <string, ProjectInfo> projects, string text) { // 按::切割 char[] sy = { ':', '.' }; string[] split = text.Split(sy); var temp_split = new List <string>(); foreach (var c in split) { if (c != "") { temp_split.Add(c); } } if (temp_split.Count == 0) { return(null); } var package = ""; string name = temp_split[temp_split.Count - 1]; temp_split.RemoveAt(temp_split.Count - 1); package = string.Join(".", temp_split); ABnfElement element = null; // 获取所有工程 foreach (var pair in projects) { if (GeneralOptions.Instance.ProjectTeam == ProjectTeamTypes.LW) { if (name.EndsWith("_struct")) { name = name.Substring(0, name.Length - "_struct".Length); } else if (name.EndsWith("_dirty")) { name = name.Substring(0, name.Length - "_dirty".Length); } } var project = pair.Value as AProtobufProjectInfo; if (project == null) { continue; } if (package == "") { element = project.FindElementInAllPackage(name); if (element != null) { break; } } else { element = project.FindElement(package, name); if (element != null) { break; } } } // 把package当做 enum枚举名,name当做枚举项名 if (element == null) { if (temp_split.Count == 1 || temp_split.Count == 2) { foreach (var pair in projects) { var project = pair.Value as AProtobufProjectInfo; if (project == null) { continue; } if (temp_split.Count == 1) { element = project.FindElementInAllPackage(temp_split[0]); if (element != null) { break; } } else if (temp_split.Count == 2) { element = project.FindElement(temp_split[0], temp_split[1]); if (element != null) { break; } } } } else if (GeneralOptions.Instance.ProjectTeam == ProjectTeamTypes.LW && temp_split.Count == 0) { if (name.EndsWith("_struct") || name.EndsWith("_dirty")) { var sub_name = name; if (sub_name.EndsWith("_struct")) { sub_name = sub_name.Substring(0, sub_name.Length - "_struct".Length); } else if (sub_name.EndsWith("_dirty")) { sub_name = sub_name.Substring(0, sub_name.Length - "_dirty".Length); } foreach (var pair in projects) { var project = pair.Value as AProtobufProjectInfo; if (project == null) { continue; } element = project.FindElementInAllPackage(sub_name); if (element != null) { break; } } } if (element == null) { foreach (var pair in projects) { var project = pair.Value as AProtobufProjectInfo; if (project == null) { continue; } element = project.FindElementInAllPackage(name); if (element != null) { break; } } } if (element == null) { foreach (var pair in projects) { var project = pair.Value as AProtobufProjectInfo; if (project == null) { continue; } element = project.FindElement("", "EMsgErrorCode"); if (element != null) { break; } } } } if (element is AProtobufEnumElement) { var body_dec = (element as AProtobufEnumElement).GetEnumBody(); if (body_dec != null) { foreach (var pair in body_dec.GetEnumVarList()) { if (pair.GetEnumVarName().GetElementText() == name) { element = pair.GetEnumVarName(); break; } } } } } if (element == null) { return("找不到在包(" + package + ")的协议或枚举(" + name + ")"); } if (element is AProtobufMessageElement) { element = (element as AProtobufMessageElement).GetMessageName(); } else if (element is AProtobufEnumElement) { element = (element as AProtobufEnumElement).GetEnumName(); } string full_path = element.GetFullPath(); int start = element.GetStart(); int length = element.GetLength(); Application.Current.Dispatcher.Invoke(() => { ALanguageUtility.OpenFile(m_open_document, m_adapters_factory , full_path, start, length); }); return(null); }
public override ALanguageSignatureInfo QuerySignatureHelp(out int start, out int length) { start = 0; length = 0; ABnfElement parent = m_element; while (parent != null) { if (parent is ALittleScriptPropertyValueMethodCallElement) { var refe = parent.GetReference() as ALittleScriptPropertyValueMethodCallReference; if (refe == null) { return(null); } var error = refe.GuessPreType(out ABnfGuess guess); if (error != null) { return(null); } var guess_functor = guess as ALittleScriptGuessFunctor; if (guess_functor == null) { return(null); } var info = new ALanguageSignatureInfo(); for (int i = 0; i < guess_functor.param_name_list.Count; ++i) { string type = ""; if (i < guess_functor.param_nullable_list.Count && guess_functor.param_nullable_list[i]) { type = "[Nullable] "; } if (i < guess_functor.param_list.Count) { type += guess_functor.param_list[i].GetValue(); } var param = new ALanguageParameterInfo(); param.name = type + " " + guess_functor.param_name_list[i]; info.param_list.Add(param); } if (guess_functor.param_tail != null) { var param = new ALanguageParameterInfo(); param.name = guess_functor.param_tail.GetValue(); info.param_list.Add(param); } start = parent.GetStart(); length = parent.GetLengthWithoutError(); var method_call = parent as ALittleScriptPropertyValueMethodCallElement; var string_list = method_call.GetStringList(); if (string_list.Count > 1) { start = string_list[0].GetStart(); length = parent.GetLength() - (string_list[0].GetStart() - parent.GetStart()) - 1; } return(info); } else if (parent is ALittleScriptOpNewStatElement) { var custom_type = (parent as ALittleScriptOpNewStatElement).GetCustomType(); if (custom_type == null) { return(null); } var error = custom_type.GuessType(out ABnfGuess guess); if (error != null) { return(null); } if (guess is ALittleScriptGuessTemplate) { var guess_template = guess as ALittleScriptGuessTemplate; if (guess_template.template_extends != null) { guess = guess_template.template_extends; } } if (guess is ALittleScriptGuessClass) { var class_dec = ((ALittleScriptGuessClass)guess).class_dec; var ctor = ALittleScriptUtility.FindFirstCtorDecFromExtends(class_dec, 100); if (ctor == null) { return(null); } var param_dec = ctor.GetMethodParamDec(); if (param_dec == null) { return(null); } var param_one_dec_list = param_dec.GetMethodParamOneDecList(); if (param_one_dec_list.Count == 0) { return(null); } var info = new ALanguageSignatureInfo(); for (int i = 0; i < param_one_dec_list.Count; ++i) { var param_one_dec = param_one_dec_list[i]; var tail_dec = param_one_dec.GetMethodParamTailDec(); if (tail_dec != null) { var param_info = new ALanguageParameterInfo(); param_info.name = tail_dec.GetElementText(); info.param_list.Add(param_info); continue; } var nullable = ALittleScriptUtility.IsNullable(param_one_dec.GetModifierList()); var all_type = param_one_dec.GetAllType(); if (all_type == null) { return(null); } error = all_type.GuessType(out ABnfGuess all_type_guess); if (error != null) { return(null); } var param = new ALanguageParameterInfo(); param.name = all_type_guess.GetValue(); if (param_one_dec.GetMethodParamNameDec() != null) { if (nullable) { param.name += " [Nullable]"; } param.name += " " + param_one_dec.GetMethodParamNameDec().GetElementText(); } info.param_list.Add(param); } start = parent.GetStart(); length = parent.GetLengthWithoutError(); var new_stat = parent as ALittleScriptOpNewStatElement; var string_list = new_stat.GetStringList(); if (string_list.Count > 1) { start = string_list[0].GetStart(); length = parent.GetLength() - (string_list[0].GetStart() - parent.GetStart()) - 1; } return(info); } return(null); } if (parent is ALittleScriptMethodBodyDecElement) { return(null); } if (parent is ALittleScriptAllExprElement) { return(null); } parent = parent.GetParent(); } return(null); }