// 检查语法错误 protected ABnfGuessError CheckErrorElement(ABnfElement element, bool full_check) { if (element is ABnfErrorElement) { var error_element = element as ABnfErrorElement; return(new ABnfGuessError(element, error_element.GetValue())); } // 判断语义错误 if (full_check) { var error = element.GetReference().CheckError(); if (error != null) { return(error); } } if (!(element is ABnfNodeElement node)) { return(null); } foreach (var child in node.GetChilds()) { var error = CheckErrorElement(child, full_check); if (error != null) { return(error); } } return(null); }
private void AnalysisClassificationTag(ABnfElement element, List <ALanguageClassifierInfo> list, bool blur) { if (element is ABnfErrorElement) { return; } var type = element.GetReference().QueryClassificationTag(out bool blur_temp); if (type != null) { for (int line = element.GetStartLine(); line <= element.GetEndLine(); ++line) { var info = new ALanguageClassifierInfo(); info.line = line; info.start = element.GetStart(); info.end = element.GetEnd(); info.blur = blur || blur_temp; info.type = type; list.Add(info); } return; } var node = element as ABnfNodeElement; if (node != null) { foreach (var child in node.GetChilds()) { AnalysisClassificationTag(child, list, blur || blur_temp); } } }
protected void AnalysisError(ABnfElement element) { if (element is ABnfErrorElement) { return; } var error = element.GetReference().CheckError(); if (error != null) { if (error.GetElement() != null && error.GetElement().GetFile() == this) { AddAnalysisErrorInfo(error.GetElement(), error.GetError()); } } var node = element as ABnfNodeElement; if (node == null) { return; } foreach (var child in node.GetChilds()) { AnalysisError(child); } }
// 解析缩进 public int GetFormateIndentation(int offset) { m_indent_root = GetIndentRoot(); if (m_indent_root == null) { return(0); } ABnfElement target = null; // 获取元素 var element = m_indent_root.GetException(offset); if (element != null) { // 获取类型 var node = element as ABnfNodeElement; if (node == null) { node = element.GetParent(); } if (node != null) { target = node; } } int?indent = null; if (target != null) { indent = target.GetReference().GetFormateIndentation(offset, element); } if (!indent.HasValue) { return(0); } return(indent.Value); }
public override int GetFormateIndentation(int offset, ABnfElement select) { if (m_format_indent >= 0) { return(m_format_indent); } ABnfElement parent = m_element.GetParent(); if (parent == null) { m_format_indent = 0; return(m_format_indent); } if (m_element is ALittleScriptAllExprElement || m_element is ALittleScriptLineCommentElement || m_element is ALittleScriptBlockCommentElement) { m_format_indent = parent.GetReference().GetFormateIndentation(offset, null); if (parent is ALittleScriptForExprElement || parent is ALittleScriptWhileExprElement || parent is ALittleScriptIfExprElement || parent is ALittleScriptElseIfExprElement || parent is ALittleScriptElseExprElement || parent is ALittleScriptClassBodyDecElement || parent is ALittleScriptEnumBodyDecElement || parent is ALittleScriptStructBodyDecElement || parent is ALittleScriptMethodBodyDecElement || parent is ALittleScriptForBodyElement || parent is ALittleScriptWhileBodyElement || parent is ALittleScriptDoWhileBodyElement || parent is ALittleScriptIfBodyElement || parent is ALittleScriptElseIfBodyElement || parent is ALittleScriptElseBodyElement || parent is ALittleScriptWrapExprElement) { m_format_indent += ALanguageSmartIndentProvider.s_indent_size; } return(m_format_indent); } else if (m_element is ALittleScriptClassElementDecElement || m_element is ALittleScriptEnumVarDecElement || m_element is ALittleScriptStructVarDecElement || m_element is ALittleScriptStructOptionDecElement) { m_format_indent = parent.GetReference().GetFormateIndentation(offset, null) + ALanguageSmartIndentProvider.s_indent_size; return(m_format_indent); } else if (m_element is ALittleScriptMethodParamDecElement || m_element is ALittleScriptOpNewListStatElement) { var element = m_element as ABnfNodeElement; var childs = element.GetChilds(); if (childs.Count > 0) { m_format_indent = childs[0].GetStartIndent(); return(m_format_indent); } } else if (m_element is ALittleScriptOp8Element || m_element is ALittleScriptOp7Element || m_element is ALittleScriptOp6Element || m_element is ALittleScriptOp5Element || m_element is ALittleScriptOp4Element || m_element is ALittleScriptOp3Element || m_element is ALittleScriptOp2Element) { m_format_indent = parent.GetReference().GetFormateIndentation(offset, null) + ALanguageSmartIndentProvider.s_indent_size; return(m_format_indent); } m_format_indent = parent.GetReference().GetFormateIndentation(offset, null); return(m_format_indent); }
public override int GetDesiredIndentation(int offset, ABnfElement select) { ABnfElement parent = m_element.GetParent(); if (parent == null) { if (m_desire_indent >= 0) { return(m_desire_indent); } m_desire_indent = 0; return(m_desire_indent); } if (m_element is ALittleScriptClassBodyDecElement || m_element is ALittleScriptStructBodyDecElement || m_element is ALittleScriptEnumBodyDecElement || m_element is ALittleScriptMethodBodyDecElement || m_element is ALittleScriptForBodyElement || m_element is ALittleScriptWhileBodyElement || m_element is ALittleScriptDoWhileBodyElement || m_element is ALittleScriptIfBodyElement || m_element is ALittleScriptElseIfBodyElement || m_element is ALittleScriptElseBodyElement || m_element is ALittleScriptWrapExprElement) { if (m_desire_indent < 0) { m_desire_indent = parent.GetReference().GetDesiredIndentation(offset, null); } if (select is ABnfStringElement && select.GetElementText() == "{") { return(m_desire_indent); } int find = m_element.FindForwardFirstEnterAndHaveNotSpaceOrTab(); if (find < 0 || offset <= find || offset > m_element.GetEnd()) { return(m_desire_indent + ALanguageSmartIndentProvider.s_indent_size); } return(m_desire_indent); } else if (m_element is ALittleScriptMethodParamDecElement || m_element is ALittleScriptOpNewListStatElement) { if (m_desire_indent >= 0) { return(m_desire_indent); } var element = m_element as ABnfNodeElement; var childs = element.GetChilds(); if (childs.Count > 0) { m_desire_indent = childs[0].GetStartIndent(); return(m_desire_indent); } } else if (m_element is ALittleScriptOp8Element || m_element is ALittleScriptOp7Element || m_element is ALittleScriptOp6Element || m_element is ALittleScriptOp5Element || m_element is ALittleScriptOp4Element || m_element is ALittleScriptOp3Element || m_element is ALittleScriptOp2Element) { if (m_desire_indent >= 0) { return(m_desire_indent); } m_desire_indent = parent.GetReference().GetDesiredIndentation(offset, null) + ALanguageSmartIndentProvider.s_indent_size; return(m_desire_indent); } if (m_desire_indent >= 0) { return(m_desire_indent); } m_desire_indent = parent.GetReference().GetDesiredIndentation(offset, null); return(m_desire_indent); }
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); }
public override ABnfGuessError GuessTypes(ABnfElement element, out List <ABnfGuess> guess_list) { guess_list = null; var error = ALittleScriptIndex.inst.GetGuessError(element); if (error != null) { return(error); } guess_list = ALittleScriptIndex.inst.GetGuessTypeList(element); if (guess_list != null && guess_list.Count > 0) { bool is_changed = false; foreach (var guess in guess_list) { if (guess.IsChanged()) { is_changed = true; break; } } if (!is_changed) { return(null); } } var reference = element.GetReference(); if (reference == null) { error = new ABnfGuessError(element, "ALittleReference对象创建失败 element:" + element); ALittleScriptIndex.inst.AddGuessError(element, error); return(error); } error = reference.GuessTypes(out guess_list); if (error != null) { ALittleScriptIndex.inst.AddGuessError(element, error); return(error); } if (guess_list == null) { guess_list = new List <ABnfGuess>(); } // 如果是两个,并且一个是register,一个不是。那么就要把register那个删掉 if (!reference.MultiGuessTypes() && guess_list.Count == 2 && guess_list[0].GetValue() == guess_list[1].GetValue() && guess_list[0] is ALittleScriptGuess && guess_list[1] is ALittleScriptGuess) { if ((guess_list[0] as ALittleScriptGuess).is_register && !(guess_list[1] as ALittleScriptGuess).is_register) { guess_list.RemoveAt(0); } else if (!(guess_list[0] as ALittleScriptGuess).is_register && (guess_list[1] as ALittleScriptGuess).is_register) { guess_list.RemoveAt(1); } } foreach (var guess in guess_list) { if (guess == null) { error = new ABnfGuessError(element, "guess列表出现null:" + element); ALittleScriptIndex.inst.AddGuessError(element, error); return(error); } } ALittleScriptIndex.inst.AddGuessTypeList(element, guess_list); return(null); }