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; }
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; } }
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; }
//各种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(); }
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()); }
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; }
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); } } }
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); }
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; }