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

13

我想进行一些非常基本的代码生成(将服务 API 规范转换为用于与服务通信的一些 C# 类)。我发现了这个问题,它似乎建议我调用Syntax.CompilationUnit()来创建一个新的CompilationUnityntax,但是我无法使这段代码编译通过;我找不到任何可以找到的语法类中的CompilationUnit方法(也找不到任何相关文档):(

CSharpSyntaxTree.Create似乎需要一个CSharpSyntaxNode,但我也无法弄清楚如何创建其中之一 :/

我正在使用带有最新 Microsoft.CodeAnalysis NuGet 包(1.0.0-rc2)的 VS 2015 RC。


1
你的问题激发了我对(新的?)roslyn API 进行简短介绍。请点击此处查看:http://www.vannevel.net/2015/06/07/a-few-important-roslyn-api-helpers/。 - Jeroen Vannevel
@JeroenVannevel 很遗憾,你的链接已经失效了 :o( - mike
@mike:我无法编辑我的先前评论,但您可以在此处找到该帖子:https://vannevel.net/posts/a-few-important-roslyn-api-helpers/ - Jeroen Vannevel
1个回答

12

看起来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())
                            )
                    )
            );

是的。我注意到许多示例使用静态using语句来包含SyntaxFactory,例如using static Microsoft.CodeAnalysis.SyntaxFactory;,这允许调用所有成员而不必指定静态类型名称。 - SimperT
using static Microsoft.CodeAnalysis.CSharp.SyntaxFactory; - mike

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接