void ExportEnum(EnumDeclarationSyntax c) { string name = ""; string nameSpace = ""; NamespaceDeclarationSyntax namespaceDeclarationSyntax = c.Parent as NamespaceDeclarationSyntax; if (namespaceDeclarationSyntax != null) { nameSpace = namespaceDeclarationSyntax.Name.ToString(); } else { nameSpace = ModelData.GloableNamespaceName; } name = c.Identifier.Text; if (step == ECompilerStet.ScanType) { type_list.Add(new ULTypeInfo()); types.Push(type_list[type_list.Count - 1]); currentType.Namespace = nameSpace; currentType.Name = name; currentType.IsEnum = true; ModelData.UpdateType(currentType); } else { types.Push(ModelData.FindTypeByFullName(nameSpace + "." + name)); } if (step == ECompilerStet.ScanMember) { //导出所有变量 var virableNodes = c.ChildNodes().OfType <EnumMemberDeclarationSyntax>(); foreach (var v in virableNodes) { var dB_Member = new ULMemberInfo(); dB_Member.Name = v.Identifier.Text; dB_Member.IsStatic = false; dB_Member.DeclareTypeName = currentType.FullName; dB_Member.MemberType = ULMemberInfo.EMemberType.Enum; currentType.Members.Add(dB_Member); } } types.Pop(); }
void ExportMethod(BaseMethodDeclarationSyntax v) { MethodDeclarationSyntax method = v as MethodDeclarationSyntax; var methodInfo = new Model.ULMemberInfo(); methodInfo.DeclareTypeID = this.type.ID; methodInfo.Name = method.Identifier.ValueText; methodInfo.IsStatic = ContainModifier(method.Modifiers, "static"); methodInfo.Modifier = GetModifier(method.Modifiers); var memberType = GetTypeInfo(method.ReturnType); methodInfo.TypeID = memberType != null ? memberType.ID : ""; methodInfo.MemberType = ULMemberInfo.EMemberType.Method; type.Members.Add(methodInfo); if (memberType != null) { methodInfo.Graph.Outputs.Add(new ULArg() { Name = "ret", TypeID = memberType.ID }); } foreach (var a in method.ParameterList.Parameters) { if (ContainModifier(a.Modifiers, "ref")) { methodInfo.Graph.Outputs.Add(GetArgument(a)); methodInfo.Graph.Args.Add(GetArgument(a)); } else if (ContainModifier(a.Modifiers, "out")) { methodInfo.Graph.Outputs.Add(GetArgument(a)); } else { methodInfo.Graph.Args.Add(GetArgument(a)); } } CompileNode_ExportBody exportBody = new CompileNode_ExportBody(); exportBody.Parent = this; exportBody.ExportBody(v.Body, methodInfo.Graph); }
void ExportVariable(BaseFieldDeclarationSyntax v) { if (step == ECompilerStet.ScanMember) { var vtype = GetType(v.Declaration.Type); foreach (var ve in v.Declaration.Variables) { var dB_Member = new ULMemberInfo(); dB_Member.Name = ve.Identifier.Text; dB_Member.IsStatic = ContainModifier(v.Modifiers, "static") || ContainModifier(v.Modifiers, "const"); dB_Member.DeclareTypeName = currentType.FullName; dB_Member.TypeName = vtype.FullName; if (v is FieldDeclarationSyntax) { dB_Member.MemberType = ULMemberInfo.EMemberType.Field; } else if (v is EventFieldDeclarationSyntax) { dB_Member.MemberType = ULMemberInfo.EMemberType.Event; } else { Console.Error.WriteLine("无法识别的类成员 " + v); } dB_Member.Modifier = GetModifier(v.Modifiers); //if (ve.Initializer != null) // dB_Member.field_initializer = ExportExp(ve.Initializer.Value); //dB_Member.attributes = ExportAttributes(v.AttributeLists); //Metadata.DB.SaveDBMember(dB_Member, _con, _trans); //Model.AddMember(type.static_full_name, dB_Member); currentType.Members.Add(dB_Member); } } }
void ToMember(ULMemberInfo memberInfo) { BeginAppendLine(); if (memberInfo.Modifier == EModifier.Public) { Append("public "); } else if (memberInfo.Modifier == EModifier.Protected) { Append("protected "); } else { Append("private "); } if (memberInfo.IsStatic) { Append("static "); } var memberType = Data.GetType(memberInfo.TypeID); Append(memberType != null ? memberType.Name : "void"); Append(" "); Append(memberInfo.Name); switch (memberInfo.MemberType) { case ULMemberInfo.EMemberType.Field: Append(";"); break; case ULMemberInfo.EMemberType.Property: Append("{ get; set;}"); break; case ULMemberInfo.EMemberType.Method: Append("("); if (memberInfo.Graph != null) { int arg_count = memberInfo.Graph.Args.Count + memberInfo.Graph.Outputs.Count; if (memberType != null) { arg_count -= 1; } for (int i = 0; i < memberInfo.Graph.Args.Count; i++) { Append(Data.GetType(memberInfo.Graph.Args[i].TypeID).Name + " " + memberInfo.Graph.Args[i].Name); if (i < arg_count - 1) { Append(","); } } for (int i = 0; i < memberInfo.Graph.Outputs.Count; i++) { if (memberInfo.Graph.Outputs[i].Name != "ret") { Append("out " + Data.GetType(memberInfo.Graph.Outputs[i].TypeID).Name + " " + memberInfo.Graph.Outputs[i].Name); if (i + memberInfo.Graph.Args.Count < arg_count - 1) { Append(","); } } } } Append(")"); break; } EndAppendLine(); if (memberInfo.MemberType == ULMemberInfo.EMemberType.Method) { AppendLine("{"); ToGraph(memberInfo.Graph); AppendLine("}"); } }
void ExportProperty(BasePropertyDeclarationSyntax v) { var v_type = GetType(v.Type); if (v_type == null) { Console.Error.WriteLine("无法识别的类型 " + v); return; } string name = ""; if (v is PropertyDeclarationSyntax) { name = ((PropertyDeclarationSyntax)v).Identifier.Text; } else if (v is EventDeclarationSyntax) { name = ((EventDeclarationSyntax)v).Identifier.Text; } else if (v is IndexerDeclarationSyntax) { name = "Index"; } if (step == ECompilerStet.ScanMember) { var property = new ULMemberInfo(); property.Name = name; property.DeclareTypeName = currentType.FullName; property.MemberType = ULMemberInfo.EMemberType.Property; property.IsStatic = ContainModifier(v.Modifiers, "static") || ContainModifier(v.Modifiers, "const"); property.Modifier = GetModifier(v.Modifiers); property.TypeName = v_type.FullName; currentType.Members.Add(property); foreach (var ve in v.AccessorList.Accessors) { var dB_Member = new ULMemberInfo(); dB_Member.DeclareTypeName = currentType.FullName; dB_Member.TypeName = v_type.FullName; dB_Member.IsStatic = property.IsStatic; dB_Member.Modifier = property.Modifier; //dB_Member.method_abstract = ContainModifier(v.Modifiers, "abstract"); //dB_Member.method_virtual = ContainModifier(v.Modifiers, "virtual"); //dB_Member.method_override = ContainModifier(v.Modifiers, "override"); if (ve.Keyword.Text == "get") { dB_Member.MemberType = ULMemberInfo.EMemberType.PropertyGet; dB_Member.Name = property.Name_PropertyGet; if (v is IndexerDeclarationSyntax) { IndexerDeclarationSyntax indexerDeclarationSyntax = v as IndexerDeclarationSyntax; dB_Member.Args = new List <ULMemberInfo.MethodArg>(); foreach (var a in indexerDeclarationSyntax.ParameterList.Parameters) { dB_Member.Args.Add(GetArgument(a)); } } } else if (ve.Keyword.Text == "set") { dB_Member.MemberType = ULMemberInfo.EMemberType.PropertySet; dB_Member.Name = property.Name_PropertySet; if (v is IndexerDeclarationSyntax) { IndexerDeclarationSyntax indexerDeclarationSyntax = v as IndexerDeclarationSyntax; dB_Member.Args = new List <ULMemberInfo.MethodArg>(); foreach (var a in indexerDeclarationSyntax.ParameterList.Parameters) { dB_Member.Args.Add(GetArgument(a)); } var arg = new ULMemberInfo.MethodArg(); arg.ArgName = "value"; arg.TypeName = v_type.FullName; dB_Member.Args.Add(arg); } else { var arg = new ULMemberInfo.MethodArg(); arg.ArgName = "value"; arg.TypeName = v_type.FullName; dB_Member.Args.Add(arg); } } else if (ve.Keyword.Text == "add") { dB_Member.MemberType = ULMemberInfo.EMemberType.PropertyAdd; dB_Member.Name = property.Name_PropertyAdd; var arg = new ULMemberInfo.MethodArg(); arg.ArgName = "value"; arg.TypeName = v_type.FullName; dB_Member.Args.Add(arg); } else if (ve.Keyword.Text == "remove") { dB_Member.MemberType = ULMemberInfo.EMemberType.PropertyRemove; dB_Member.Name = property.Name_PropertyRemove; var arg = new ULMemberInfo.MethodArg(); arg.ArgName = "value"; arg.TypeName = v_type.FullName; dB_Member.Args.Add(arg); } currentType.Members.Add(dB_Member); } } else if (step == ECompilerStet.Compile) { currentMember = currentType.Members.Find(m => m.Name == name); foreach (var ve in v.AccessorList.Accessors) { if (ve.Keyword.Text == "get") { currentMember = currentType.Members.Find(m => m.Name == currentMember.Name_PropertyGet); ExportBody(ve.Body); } else if (ve.Keyword.Text == "set") { currentMember = currentType.Members.Find(m => m.Name == currentMember.Name_PropertySet); ExportBody(ve.Body); } else if (ve.Keyword.Text == "add") { currentMember = currentType.Members.Find(m => m.Name == currentMember.Name_PropertyAdd); ExportBody(ve.Body); } else if (ve.Keyword.Text == "remove") { currentMember = currentType.Members.Find(m => m.Name == currentMember.Name_PropertyRemove); ExportBody(ve.Body); } } } }
void ToMember(ULMemberInfo memberInfo) { BeginAppendLine(); //if (memberInfo.ExportType == EExportType.Public) //{ // Append("public "); //} //else if (memberInfo.ExportType == EExportType.Protected) //{ // Append("protected "); //} //else //{ // Append("private "); //} Append("function "); if (memberInfo.IsStatic) { Append("static "); } Append(" "); Append(memberInfo.Name); switch (memberInfo.MemberType) { case ULMemberInfo.EMemberType.Field: Append(";"); break; //case ULMemberInfo.EMemberType.Property: // Append("{ get; set;}"); // break; case ULMemberInfo.EMemberType.Method: Append("("); if (!memberInfo.IsStatic) { Append("self"); if (memberInfo.Args.Count > 0) { Append(","); } } for (int i = 0; i < memberInfo.Args.Count; i++) { Append(memberInfo.Args[i].ArgName); if (i != memberInfo.Args.Count - 1) { Append(","); } } Append(")"); break; } EndAppendLine(); if (memberInfo.MemberType == ULMemberInfo.EMemberType.Method) { ToStatement(memberInfo.MethodBody); } }