private bool InitInterfaceGenContext(InterfaceGenContext context, GenInterface item) { context.TargetName = item.TargetName; context.TargetDir = item.TargetDir; context.TypeSymbol = mCompilation.GetTypeByMetadataName(item.FullyQualifiedMetadataName); if (context.TypeSymbol == null) { Console.WriteLine("Cannot get type from FullyQualifiedMetadataName " + item.FullyQualifiedMetadataName); return(false); } context.SyntaxGenerator = SyntaxGenerator.GetGenerator(mProject); context.MethodSymbols.AddRange(GetPublicMethodForGeneration(context.TypeSymbol)); context.NormalMethodSymbols.AddRange(context.MethodSymbols.Where((sym) => { return(sym.MethodKind == MethodKind.Ordinary && !IsMethodImplementedForInterfaceMember(sym)); })); context.PropertySymbols.AddRange(context.MethodSymbols.Where((sym) => !IsMethodImplementedForInterfaceMember(sym) && (sym.MethodKind == MethodKind.PropertyGet || sym.MethodKind == MethodKind.PropertySet)) .Select((sym) => sym.AssociatedSymbol) .Distinct() .OfType <IPropertySymbol>() .ToArray()); return(true); }
public void GenCode() { bool reGenXLuaCode = false; foreach (var item in mCodeGenConfig.ProxyClassItems) { Console.WriteLine("生成{0}代理类中", item.TargetName); ProxyClassGenContext context = new ProxyClassGenContext(); if (InitProxyClassGenContext(context, item)) { PerformProxyClassGeneration(context); if (context.DelegateCallMethodSymbols.Count != 0) { reGenXLuaCode = true; } } } foreach (var item in mCodeGenConfig.InterfaceItems) { Console.WriteLine("生成{0} Interface中", item.TargetName); InterfaceGenContext context = new InterfaceGenContext(); if (InitInterfaceGenContext(context, item)) { PerformInterfaceGeneration(context); } } Console.Write("代码生成完毕"); if (reGenXLuaCode) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine(",注意,请在UnityEditor中执行XLua/Generate Code"); Console.ResetColor(); } else { Console.WriteLine(); } }
public void PerformInterfaceGeneration(InterfaceGenContext context) { var syntaxGen = context.SyntaxGenerator; var typeSymbol = context.TypeSymbol; var normalMethodNodes = new List <SyntaxNode>(context.NormalMethodSymbols.Count); foreach (var method in context.NormalMethodSymbols) { var methodDeclaration = syntaxGen.MethodDeclaration(method); normalMethodNodes.Add(methodDeclaration); } var propertyMethodNodes = new List <SyntaxNode>(context.PropertySymbols.Count); foreach (var p in context.PropertySymbols) { var propertyDeclaration = syntaxGen.PropertyDeclaration(p) as PropertyDeclarationSyntax; propertyMethodNodes.Add(propertyDeclaration); } var members = propertyMethodNodes.Union(normalMethodNodes); var interfaceDefinition = syntaxGen.InterfaceDeclaration(context.TargetName, accessibility: typeSymbol.DeclaredAccessibility, members: members); var namespaceDeclaration = syntaxGen.NamespaceDeclaration(typeSymbol.ContainingNamespace.Name, interfaceDefinition); var usingDirective = syntaxGen.NamespaceImportDeclaration("System"); usingDirective = AddComment(usingDirective); var finalNode = syntaxGen.CompilationUnit(usingDirective, namespaceDeclaration).NormalizeWhitespace(); var path = Path.Combine(context.TargetDir, context.TargetName); path = Path.ChangeExtension(path, ".cs"); var str = SimplifyGeneratedCode(context.TargetName, finalNode); using (var sw = File.CreateText(path)) { sw.Write(str); } }