Beispiel #1
0
        string ParseMemberReferenceExpression(MemberReferenceExpression expr, ExpressOption option)//成员引用表达式
        {
            string lefttype = ParseExpression(expr.Target, null);
            string _class = null;
            if (expr.Target is ThisReferenceExpression)
            {
                _class = getCurClassName();
            }
            else if (expr.Target is IdentifierExpression)
            {
                _class = getClassNameFromID((expr.Target as IdentifierExpression).Identifier);
            }
            else
            {
                logger.LogError("not parse this typefinder" + expr.Target.GetType().Name);
            }
            //根据左侧找到类型
            Append(expr.DotToken.ToString());
            //判断右侧是否是属性

            string idtype = ParseIdentifier(_class, expr.MemberNameToken , option, false);
            //Append(expr.Children[2].Code);
            return idtype;

        }
Beispiel #2
0
        string ParseExpression(AstNode expr, ExpressOption option)
        {

            if (expr is MemberReferenceExpression)
                return ParseMemberReferenceExpression(expr as MemberReferenceExpression, option);
            else if (expr is PrimitiveExpression)
                return ParsePrimitiveExpression(expr);
            else if (expr is BinaryOperatorExpression)
                return ParseBinaryOperatorExpression(expr);
            else if (expr is IdentifierExpression)
                return ParseIdentifierExpression(expr as IdentifierExpression, option);
            else if (expr is AssignmentExpression)
                return ParseBinaryOperatorExpression(expr);
            else if (expr is ExpressionStatement)
                return ParseExpressionStatement(expr);
            else if (expr is ThisReferenceExpression)
                return ParseThisReferenceExpression(expr);
            else if (expr is ObjectCreateExpression)
                return ParseObjectCreateExpression(expr);
            else if (expr is InvocationExpression)
                return ParseInvocationExpression(expr);
            else if (expr is LambdaExpression)
                return ParseLambdaExpression(expr);
            else
            {
                logger.LogError("not support Expression element:" + expr.GetType().Name + "|" + expr.NodeType + "|" + expr.StartLocation.Line);
                return null;
            }

        }
Beispiel #3
0
        string ParseAssignmentExpression(AstNode expr, ExpressOption option)
        {
            foreach (var v in expr.Children)
            {
                if (v is IdentifierExpression)
                {
                    ParseIdentifierExpression(v as IdentifierExpression, option);
                }
                else if (v is PrimitiveExpression)
                {
                    ParsePrimitiveExpression(v);
                }
                else if (v is Comment)
                {
                    Append(v.ToString().Replace("\r\n", ""));
                }
                else if (v is NewLineNode)
                {
                    AppendLine();
                }
                else if (v is CSharpTokenNode)
                {

                    if (v.ToString() == "{")//bodybegin
                    {
                        Append("{");
                    }
                    else if (v.ToString() == "}")//bodyend
                    {
                        Append("}");
                    }
                    else if (v.ToString() == ";")
                    {
                        Append(";");

                    }

                    else
                    {
                        Append(v.ToString());
                    }
                }
                else if (v is ExpressionStatement)
                {
                    ParseExpressionStatement(v);
                }
                else if (v is AssignmentExpression)
                {
                    ParseAssignmentExpression(v, option);
                }
                else
                {
                    logger.LogError("not support ParseAssignmentExpression element:" + v.GetType().Name + "|" + v.NodeType + "|" + v.StartLocation.Line);
                }


            }
            return null;
        }
Beispiel #4
0
        //各种Statement

        void ParseBlockStatement(AstNode block, ExpressOption option)
        {
            this.PushValueLayer();
            if (option != null && option.insetfunc != null)
            {
                this.DefineValue("value", option.insetfunc);
                option = null;
            }
            foreach (var v in block.Children)
            {
                if (v is Comment)
                {
                    Append(v.ToString().Replace("\r\n", ""));
                }
                else if (v is NewLineNode)
                {
                    AppendLine();
                }
                else if (v is CSharpTokenNode)
                {
                    if (v.ToString() == "{")//bodybegin
                    {
                        Append("{");
                        space += 4;
                    }
                    else if (v.ToString() == "}")//bodyend
                    {
                        space -= 4;
                        Append("}");
                    }
                    else
                    {
                        Append(v.ToString());
                    }
                }
                else if (v is ReturnStatement)
                {
                    ParseReturnStatement(v);
                }
                else if (v is ExpressionStatement)
                {
                    ParseExpressionStatement(v);
                }
                else if (v is VariableDeclarationStatement)
                {
                    ParseVariableDeclarationStatement(v);
                }
                else
                {
                    logger.LogError("not support BlockStatement element:" + v.GetType().Name + "|" + v.NodeType + "|" + v.StartLocation.Line);
                }
            }
            this.PopValueLayer();
        }
Beispiel #5
0
        string ParseBinaryOperatorExpression(AstNode expr)//二值表达式
        {


            ExpressOption option = null;
            List<AstNode> child = new List<AstNode>(expr.Children);

            if (child[1].ToString() == "=")//赋值转换特殊处理
            {
                option = new ExpressOption();
                option.leftPropSet = true;

                ParseExpression(child[0], option);

                if (option.touch > 0)
                {
                    Append("(");
                }
                else
                {
                    Append("=");
                }
                string rtype = ParseExpression(child[2], null);

                if (rtype != "number" && rtype != "bool" && ((child[2] is ObjectCreateExpression) == false) && proj.types[rtype].classtype == "struct")
                {
                    Append(".Clone()");
                }
                if (option.touch > 0)
                {
                    Append(");");
                }
            }
            else
            {
                string ltype = ParseExpression(child[0], null);
                Append(child[1].ToString());
                string rtype = ParseExpression(child[2], null);
                if (ltype == rtype)
                    return rtype;
                else
                    throw new Exception("not parse this.");
            }
            return null;
            //Append(expr.ToString());

        }
Beispiel #6
0
        string ParseIdentifierExpression(IdentifierExpression expr, ExpressOption option)//名称表达式
        {
            //走这个表达式的时候说明是独立的一个调用
            return ParseIdentifier(getCurClassName(), expr.IdentifierToken, option, true);

            //string classtype = null;
            //if (option != null && option.leftPropSet)
            //{
            //    if (isProp(null, expr.Children[0].Code))
            //    {
            //        Append("this.set_" + expr.Children[0].Code);
            //        option.touch++;

            //    }
            //    else
            //    {
            //        Append(getMemberFullname(null, expr.Children[0].Code, out classtype));
            //    }
            //}
            //else if (option != null && option.memberCall)
            //{
            //    MethodInfo method = this.getMethodInfoByMember(getCurClassName(), expr.Children[0].Code, option.paramType.ToArray());
            //    //var method = proj.types[getCurClassName()].methods[expr.Children[0].Code];
            //    if (method._static == false)
            //    {
            //        Append("this." + method.olname);
            //    }
            //    else
            //    {
            //        Append(getCurClassName() + "." + method.olname);
            //    }
            //    //Append(expr.Children[0].Code);
            //}
            //else
            //{
            //    Append(getMemberFullname(null, expr.Children[0].Code, out classtype));
            //}
            //return classtype;
        }
Beispiel #7
0
        void ParseClassMember_Property(AstNode property)
        {
            string  returntype = "";
            string  methodname = "";
            int     getpublic  = 0;
            int     setpublic  = 0;
            bool    bstatic    = false;
            bool    get        = false;
            bool    set        = false;
            AstNode getBlock   = null;
            AstNode setBlock   = null;

            foreach (var v in property.Children)
            {
                if (v is Comment)
                {
                    Append(v.ToString().Replace("\r\n", ""));
                }
                else if (v is CSharpModifierToken)
                {
                    if (v.ToString() == "public")
                    {
                        getpublic = setpublic = 1;
                    }
                    else if (v.ToString() == "private")
                    {
                        getpublic = setpublic = -1;
                    }
                    else if (v.ToString() == "static")
                    {
                        bstatic = true;
                    }
                    else
                    {
                        logger.LogWarnning("not support modifier,skip it:" + v.ToString() + "|" + v.StartLocation.Line);
                    }
                }
                else if (v is PrimitiveType)
                {
                    returntype = Tools.getPrimitiveTypeName(v.ToString());
                }
                else if (v is MemberType)
                {
                    returntype = getMemberTypeName(v.ToString());
                }
                else if (v is Identifier)
                {
                    methodname = v.ToString();
                }
                else if (v is CSharpTokenNode)
                {
                    if (v.ToString() == "{")//param begin;
                    {
                        //property begin;
                    }
                    else if (v.ToString() == "}")//paramend;
                    {
                        //property End;
                        var typeinfo = proj.types[getCurClassName()];
                        if (typeinfo.classtype == "interface")
                        {//接口不嵌入代码
                            if (get)
                            {
                                if (getpublic < 0)
                                {
                                    Append("private ");
                                }
                                else if (getpublic > 0)
                                {
                                    Append("public ");
                                }
                                if (bstatic)
                                {
                                    Append("static ");
                                }

                                //只能转化成函数了,typescript interface 不支持访问器
                                Append("get_" + methodname + "():" + returntype + ";");
                                AppendLine();
                            }
                            if (set)
                            {
                                if (setpublic < 0)
                                {
                                    Append("private ");
                                }
                                else if (setpublic > 0)
                                {
                                    Append("public ");
                                }
                                if (bstatic)
                                {
                                    Append("static ");
                                }

                                Append("set_" + methodname + "(value:" + returntype + ");");
                                AppendLine();
                            }
                        }
                        else
                        {//嵌入代码
                            if (getBlock == null && setBlock == null)
                            {
                                Append("_" + methodname + ":" + returntype + ";");
                                AppendLine();
                            }
                            if (get)
                            {
                                if (getpublic < 0)
                                {
                                    Append("private ");
                                }
                                else if (getpublic > 0)
                                {
                                    Append("public ");
                                }
                                if (bstatic)
                                {
                                    Append("static ");
                                }

                                Append("get_" + methodname + "():" + returntype);
                                AppendLine();
                                if (getBlock != null)
                                {
                                    ParseBlockStatement(getBlock, null);
                                    AppendLine();
                                }
                                else
                                {//自动嵌入
                                    Append("{"); AppendLine();
                                    Append("   return this._" + methodname + ";"); AppendLine();
                                    Append("}"); AppendLine();
                                }
                            }
                            if (set)
                            {
                                if (setpublic < 0)
                                {
                                    Append("private ");
                                }
                                else if (setpublic > 0)
                                {
                                    Append("public ");
                                }
                                if (bstatic)
                                {
                                    Append("static ");
                                }

                                Append("set_" + methodname + "(value:" + returntype + ")");
                                AppendLine();
                                if (setBlock != null)
                                {
                                    ExpressOption option = new ExpressOption();
                                    option.insetfunc = returntype;
                                    ParseBlockStatement(setBlock, option);
                                    AppendLine();
                                }
                                else
                                {//自动嵌入
                                    Append("{"); AppendLine();
                                    Append("   this._" + methodname + "=value;"); AppendLine();
                                    Append("}"); AppendLine();
                                }
                            }
                        }
                    }

                    else
                    {
                        Append(v.ToString());
                    }
                }
                else if (v is NewLineNode)
                {
                    //AppendLine();
                }
                else if (v is Accessor)
                {
                    bool _get = false;
                    foreach (var sv in v.Children)
                    {
                        int m = 0;
                        if (sv is CSharpModifierToken)
                        {
                            if (sv.ToString() == "public")
                            {
                                m = 1;
                            }
                            else if (sv.ToString() == "private")
                            {
                                m = -1;
                            }
                        }
                        else if (sv is CSharpTokenNode)
                        {
                            if (sv.ToString() == "get")
                            {
                                _get = true;
                                get  = true;
                                if (m != 0)
                                {
                                    getpublic = m;
                                }
                            }
                            else if (sv.ToString() == "set")
                            {
                                _get = false;
                                set  = true;
                                if (m != 0)
                                {
                                    setpublic = m;
                                }
                            }
                        }
                        else if (sv is BlockStatement)
                        {
                            if (_get)
                            {
                                getBlock = sv;
                            }
                            else
                            {
                                setBlock = sv;
                            }
                        }
                    }
                }
                else
                {
                    logger.LogError("not support class property element:" + v.GetType().Name + "|" + v.NodeType + "|" + v.StartLocation.Line);
                }
            }
        }
Beispiel #8
0
        string ParseIdentifier(string classname, Identifier expr, ExpressOption option, bool bfromthis)//名称表达式
        {
            string classtype = null;

            if (option != null && option.leftPropSet)
            {
                if (isProp(classname, expr.Name))
                {
                    if (bfromthis)
                    {
                        Append("this.set_" + expr.Name);
                    }
                    else
                    {
                        Append("set_" + expr.Name);
                    }
                    option.touch++;
                }
                else
                {
                    if (bfromthis)
                    {
                        Append(getMemberFullname(classname, expr.Name, out classtype));
                    }
                    else
                    {
                        Append(getMemberName(classname, expr.Name, out classtype));
                    }
                }
            }
            else if (option != null && option.memberCall)
            {
                MethodInfo method = this.getMethodInfoByMember(classname, expr.Name, option.paramType.ToArray());
                //var method = proj.types[getCurClassName()].methods[expr.Children[0].Code];
                if (bfromthis)
                {
                    if (method._static == false)
                    {
                        Append("this." + method.olname);
                    }
                    else
                    {
                        Append(classname + "." + method.olname);
                    }
                }
                else
                {
                    Append(method.olname);
                }
                var type = proj.types[classname];
            }
            else
            {
                if (bfromthis)
                {
                    Append(getMemberFullname(classname, expr.Name, out classtype));
                }
                else
                {
                    Append(getMemberName(classname, expr.Name, out classtype));
                }
            }
            return(classtype);
        }
Beispiel #9
0
        string ParseInvocationExpression(AstNode expr)//处理函数调用
        {
            string returntype = null;
            ExpressOption option = new ExpressOption();
            option.paramType = null;
            option.memberCall = true;
            StringBuilder old = null;
            foreach (var v in expr.Children)
            {
                if (v is IdentifierExpression)
                {
                    if (option.paramType == null)
                    {
                        Append("");
                        continue;//delaycall
                    }
                    else
                    {
                        option.paramType.Add(ParseIdentifierExpression(v as IdentifierExpression, null));
                    }
                }
                else if (v is MemberReferenceExpression)
                {
                    if (option.paramType == null)
                    {
                        Append("");
                        continue;//delaycall
                    }
                    else
                    {
                        option.paramType.Add(ParseMemberReferenceExpression(v as MemberReferenceExpression, null));
                    }
                }
                if (v is CSharpTokenNode)
                {
                    if (v.ToString() == "(")
                    {//将参数处理到自定义的地方
                        old = this.builder;
                        this.builder = new StringBuilder();
                        option.paramType = new List<string>();
                    }
                    Append(v.ToString());
                    if (v.ToString() == ")")
                    {
                        string callbody = this.builder.ToString();
                        this.builder = old;


                        //此时再去处理
                        foreach (var vv in expr.Children)
                        {
                            if (vv is IdentifierExpression)
                            {


                                ParseIdentifierExpression(vv as IdentifierExpression, option);
                                break;
                            }
                            else if (vv is MemberReferenceExpression)
                            {


                                ParseMemberReferenceExpression(vv as MemberReferenceExpression, option);
                                break;
                            }
                        }
                        Append(callbody);
                    }
                }
                else if (v is PrimitiveExpression)
                {
                    option.paramType.Add(ParsePrimitiveExpression(v));
                }
                else
                {
                    logger.LogError("not support ParseInvocationExpression element:" + v.GetType().Name + "|" + expr.NodeType + "|" + expr.StartLocation.Line);

                }
            }


            return returntype;
        }