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

