Semantic Model
Introduction#
In contrast to the Syntax API the exposes all kinds of syntax level information, the semantic model gives our code more “meaning” and allows us to answer questions like “What names are in scope at this location?”, “What members are accessible from this method?”, “What variables are used in this block of text?”, “What does this name/expression refer to?“.
Remarks#
- Querying the Semantic Model is more costly than querying the Syntax Tree, due to the fact that it most commonly triggers a compilation.
Getting the Semantic Model
There qutie a fiew ways to get the sematic model.
-
From a
Document
classDocument document = ...; SemanticModel semanticModel = await document.GetSemanticModelAsync();
-
From a
Compilation
classCSharpCompilation compilation = ...; var semanticModel = await compilation.GetSemanticModel(syntaxTree);
-
From an
AnalysisContext
. Fro example inside aDiagnosticAnalyzer
you can do:public override void Initialize(AnalysisContext context) { context.RegisterSemanticModelAction(x => { var semanticModel = x.SemanticModel; // Do magical magic here. }); }
Get all the references to a method
var syntaxRoot = await document.GetSyntaxRootAsync();
var semanticModel = await document.GetSemanticModelAsync();
var sampleMethodInvocation = syntaxRoot
.DescendantNodes()
.OfType<InvocationExpressionSyntax>()
.First();
var sampleMethodSymbol = semanticModel.GetSymbolInfo(sampleMethodInvocation).Symbol;
var referencesToSampleMethod = await SymbolFinder.FindReferencesAsync(sampleMethodSymbol, document.Project.Solution);