简体   繁体   English

如何从头开始构建Roslyn语法树?

[英]How to build a Roslyn syntax tree from scratch?

I want to do some very basic code-gen (converting a service API spec to some C# classes for communicating with the service). 我想做一些非常基本的代码生成(将服务API规范转换为某些C#类以与服务进行通信)。 I found this question that seems to suggest I can call Syntax.CompilationUnit() to create a new CompilationUnityntax , however I'm unable to make this code compile; 我发现这个问题似乎表明我可以调用Syntax.CompilationUnit()来创建一个新的CompilationUnityntax ,但是我无法编译这个代码; I can't find a CompilationUnit method on any of the Syntax classes I can find (nor can I locate any docs on this) :( 我找不到任何我能找到的语法类的CompilationUnit方法(我也找不到任何文档):(

CSharpSyntaxTree.Create appears to need a CSharpSyntaxNode , but I can't figure out how to create one of them either :/ CSharpSyntaxTree.Create似乎需要一个CSharpSyntaxNode ,但我无法弄清楚如何创建其中一个:/

I'm using VS 2015 RC with the latest Microsoft.CodeAnalysis NuGet package (1.0.0-rc2). 我正在使用VS 2015 RC和最新的Microsoft.CodeAnalysis NuGet包(1.0.0-rc2)。

Seems that Syntax is now SyntaxFactory : 似乎Syntax现在是SyntaxFactory

var comp = SyntaxFactory.CompilationUnit()
        .AddMembers(
            SyntaxFactory.NamespaceDeclaration(SyntaxFactory.IdentifierName("ACO"))
                    .AddMembers(
                    SyntaxFactory.ClassDeclaration("MainForm")
                        .AddMembers(
                            SyntaxFactory.PropertyDeclaration(SyntaxFactory.ParseTypeName("System.Windows.Forms.Timer"), "Ticker")
                                    .AddAccessorListAccessors(
                                    SyntaxFactory.AccessorDeclaration(SyntaxKind.GetAccessorDeclaration).WithSemicolonToken(SyntaxFactory.Token(SyntaxKind.SemicolonToken)),
                                    SyntaxFactory.AccessorDeclaration(SyntaxKind.SetAccessorDeclaration).WithSemicolonToken(SyntaxFactory.Token(SyntaxKind.SemicolonToken))),
                            SyntaxFactory.MethodDeclaration(SyntaxFactory.ParseTypeName("void"), "Main")
                                    .AddModifiers(SyntaxFactory.Token(SyntaxKind.PublicKeyword))
                                    .WithBody(SyntaxFactory.Block())
                            )
                    )
            );

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM