Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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). 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; I can't find a CompilationUnit method on any of the Syntax classes I can find (nor can I locate any docs on this) :(

CSharpSyntaxTree.Create appears to need a CSharpSyntaxNode, but I can't figure out how to create one of them either :/

I'm using VS 2015 RC with the latest Microsoft.CodeAnalysis NuGet package (1.0.0-rc2).

like image 876
Danny Tuppeny Avatar asked Jun 06 '15 17:06

Danny Tuppeny


People also ask

What is a syntax tree C#?

A syntax tree is a data structure used by the C# and Visual Basic compilers to understand C# and Visual Basic programs. Syntax trees are produced by the same parser that runs when a project is built or a developer hits F5.


1 Answers

Seems that Syntax is now 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())
                            )
                    )
            );
like image 96
Danny Tuppeny Avatar answered Sep 28 '22 04:09

Danny Tuppeny