roslynModèle sémantique

Introduction

Contrairement à l'API Syntaxe, le modèle sémantique donne plus de "sens" à notre code et nous permet de répondre à des questions telles que "Quels noms sont à cet endroit?", "Quels sont les membres accessibles à partir de cette méthode? "," Quelles variables sont utilisées dans ce bloc de texte? "," A quoi ce nom / expression fait-il référence? ".

Remarques

  • Interroger le modèle sémantique est plus coûteux que l'interrogation de l'arbre de syntaxe, car il déclenche le plus souvent une compilation.

Obtenir le modèle sémantique

Il y a un moyen d'obtenir le modèle sématique.

  • À partir d'une classe de Document

    Document document = ...;
    SemanticModel semanticModel = await document.GetSemanticModelAsync();
    
  • À partir d'un cours de Compilation

    CSharpCompilation compilation = ...;
    var semanticModel = await compilation.GetSemanticModel(syntaxTree);
    
  • Depuis un AnalysisContext . Exemple Fro dans un DiagnosticAnalyzer vous pouvez faire:

    public override void Initialize(AnalysisContext context)
    {
        context.RegisterSemanticModelAction(x =>
        {
            var semanticModel = x.SemanticModel;
            // Do magical magic here.
        });
    }
    

Obtenez toutes les références à une méthode

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);