roslynArbre de syntaxe

Introduction

L’une des principales parties du compilateur Roslyn est l’API Syntax. Il expose les arbres de syntaxe utilisés par les compilateurs pour comprendre les programmes Visual Basic et C #.

Remarques

  • L'arbre de syntaxe est un arbre d'analyse dans le contexte du compilateur Roslyn.

Obtenir l'arborescence de la syntaxe à partir d'un document.

Si vous avez déjà accès à votre classe Document depuis votre espace de travail ( Utilisation des espaces de travail ), il est facile d'accéder à la racine de votre arbre de syntaxe.

 Document document = ... // Get document from workspace or other source 

 var syntaxRoot = await document.GetSyntaxRootAsync();

Déplacement de l'arbre de syntaxe à l'aide de LINQ

Vous pouvez facilement naviguer dans un arbre de syntaxe en utilisant LINQ. Par exemple, il est facile d’obtenir tous les nœuds ClassDeclarationSyntax (classes déclarées), qui ont un nom commençant par la lettre A :

var allClassesWithNameStartingWithA = syntaxRoot.DescendantNodes()
    .OfType<ClassDeclarationSyntax>()
    .Where(x => x.Identifier.ToString().StartsWith("A"));

Ou obtenir toutes les classes qui ont des attributs:

var allClassesWithAttriutes = syntaxRoot.DescendantNodes()
    .OfType<ClassDeclarationSyntax>()
    .Where(x => x.AttributeLists.Any(y => y.Attributes.Any()));

Déplacement de l'arbre de syntaxe à l'aide d'un CSharpSyntaxWalker

La classe CSharpSyntaxWalker est hors de la mise en œuvre du modèle Visitor, que nous pouvons utiliser pour parcourir notre arbre de syntaxe. Voici un exemple simple de Syntax Walker qui recueille tous les struct -s qui ont un nom, en commençant par la lettre A :

public class StructCollector : CSharpSyntaxWalker
{
    public StructCollector()
    {
        this.Structs = new List<StructDeclarationSyntax>();
    }

    public IList<StructDeclarationSyntax> Structs { get; }

    public override void VisitStructDeclaration(StructDeclarationSyntax node)
    {
        if (node.Identifier.ToString().StartsWith("A"))
        {
            this.Structs.Add(node);
        }
    }
}

Nous pouvons utiliser notre SyntaxWalker de la manière suivante:

var structCollector = new StructCollector();
structCollector.Visit(syntaxRoot); // Or any other syntax node
Console.WriteLine($"The number of structs that have a name starting with the letter 'A' is {structCollector.Structs.Count}");