public bool InitTestClassGenContext(TestClassGenContext context, GenProxyClass item) { context.TargetName = item.TargetName; context.TargetDir = item.TargetDir; context.SyntaxGenerator = SyntaxGenerator.GetGenerator(m_Project); return(true); }
public SyntaxNode GenFunctionBoby(TestClassGenContext context, IMethodSymbol methodSymbol, INamedTypeSymbol typeSymbol, SyntaxGenerator syntaxGen) { // void foo() {}; var variableIdentifier = syntaxGen.IdentifierName("m_Val"); List <SyntaxNode> statements = new List <SyntaxNode>(); statements.Add(syntaxGen.ReturnStatement(syntaxGen.IdentifierName("0"))); return(syntaxGen.MethodDeclaration("Foo", null, null, null, Accessibility.Public, DeclarationModifiers.None, statements));; }
public void GenCode() { foreach (var item in mCodeGenConfig.ProxyClassItems) { Console.WriteLine("生成{0}类中", item.TargetName); TestClassGenContext context = new TestClassGenContext(); if (InitTestClassGenContext(context, item)) { PreformProxyClassGeneration(context); } } }
public void PreformProxyClassGeneration(TestClassGenContext context) { var typeSymbol = context.TypeSymbol; var syntaxGen = context.SyntaxGenerator; // Generate using var usingDirectives = new SyntaxNode[] { syntaxGen.NamespaceImportDeclaration("System") }; // Generate normal method var normalMethodNodes = new List <SyntaxNode>(); for (int i = 0; i < 1; ++i) { normalMethodNodes.Add(GenFunctionBoby(context, null, typeSymbol, syntaxGen)); } var classDefin = syntaxGen.ClassDeclaration(context.TargetName, typeParameters: null, accessibility: Accessibility.Public, modifiers: DeclarationModifiers.None, baseType: null, interfaceTypes: null, members: normalMethodNodes); usingDirectives[0] = AddComment(usingDirectives[0]); SyntaxNode namespaceDeclaration = null; var finalNode = syntaxGen.CompilationUnit(usingDirectives.Union(new SyntaxNode[] { namespaceDeclaration ?? classDefin })).NormalizeWhitespace(); var path = Path.Combine(context.TargetDir, context.TargetName); path = Path.ChangeExtension(path, ".cs"); string str = SimplifyGenCode(context.TargetName, finalNode); using (var sw = File.CreateText(path)) { sw.Write(str); Console.ForegroundColor = ConsoleColor.Red; Console.Write("代码生成完毕"); Console.ReadKey(); } }