Пример #1
0
        // 检查语法错误
        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);
        }
Пример #2
0
        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);
                }
            }
        }
Пример #3
0
        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);
            }
        }
Пример #4
0
        // 解析缩进
        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);
        }