Page 76 - CSharp/C#
P. 76

Chapter 2: .NET Compiler Platform (Roslyn)




        Examples



        Create workspace from MSBuild project


        First obtain the Microsoft.CodeAnalysis.CSharp.Workspaces nuget before continuing.


         var workspace = Microsoft.CodeAnalysis.MSBuild.MSBuildWorkspace.Create();
         var project = await workspace.OpenProjectAsync(projectFilePath);
         var compilation = await project.GetCompilationAsync();

         foreach (var diagnostic in compilation.GetDiagnostics()
             .Where(d => d.Severity == Microsoft.CodeAnalysis.DiagnosticSeverity.Error))
         {
             Console.WriteLine(diagnostic);
         }


        To load existing code to the workspace, compile and report errors. Afterwards the code will be
        located in memory. From here, both the syntactic and semantic side will be available to work with.


        Syntax tree


        A Syntax Tree is an immutable data structure representing the program as a tree of names,
        commands and marks (as previously configured in the editor.)

        For example, assume a Microsoft.CodeAnalysis.Compilation instance named compilation has been
        configured. There are multiple ways to list the names of every variable declared in the loaded
        code. To do so naively, take all pieces of syntax in every document (the DescendantNodes method)
        and use Linq to select nodes that describe variable declaration:


         foreach (var syntaxTree in compilation.SyntaxTrees)
         {
             var root = await syntaxTree.GetRootAsync();
             var declaredIdentifiers = root.DescendantNodes()
                 .Where(an => an is VariableDeclaratorSyntax)
                 .Cast<VariableDeclaratorSyntax>()
                 .Select(vd => vd.Identifier);

             foreach (var di in declaredIdentifiers)
             {
                 Console.WriteLine(di);
             }
         }


        Every type of C# construct with a corresponding type will exist in the syntax tree. To quickly find
        specific types, use the Syntax Visualizer window from Visual Studio. This will interpret the current
        opened document as a Roslyn syntax tree.


        Semantic model



        https://riptutorial.com/                                                                               22
   71   72   73   74   75   76   77   78   79   80   81