Accueil Nos publications Blog Tutorial : Création d’un analyseur de code (Roslyn / .NET)

Tutorial : Création d’un analyseur de code (Roslyn / .NET)

header-reveal-2

Comme le titre l’indique, on va parler aujourd’hui des analyseurs de code et plus précisément des analyseurs Roslyn, le fameux compilateur .NET.

L’idée derrière cet article est de creuser un peu et voir ce qu’il y a sous le capot d’une des fonctionnalités les plus utilisées de Visual Studio : la fameuse lampe jaune.

Bien évidemment, je ne parle pas de l’ampoule de votre salon, mais de celle qu’on voit régulièrement sur la barre gauche de Visual Studio.

«Action Rapide » ou « Quick Action » est une des fonctionnalités les plus utilisées sur cet IDE et on ne peut pas vivre sans. Ce raccourci vous permet de faire plusieurs opérations sur votre code (générer des méthodes ou des classes, supprimer des propriétés non utilisées, alerter sur une optimisation de code, proposer un fix…).

Cette ampoule est généralement accompagnée par des lignes rouges sur le code pour signaler à l’utilisateur qu’il y a quelque chose qui cloche avec ce bout de code.

Pour avoir toutes ces fonctionnalités, dans les coulisses l’équipe Visual Studio a mis en place un mécanisme qui se déclenche pour analyser le code et propose par la suite à l’utilisateur des améliorations potentielles et fixes via des actions rapides.

Et on adore ça…

Dans cet article on va créer notre premier analyseur Roslyn qui va nous signaler une amélioration sur notre code. Le but est de souligner une opération de retour qui inclut une création de tableau vide avec la syntaxe new int[0] et proposer à l’utilisateur d’utiliser la syntaxe Array.Empty .

Avant qu’on commence, je vais vous présenter les différents outils et API qu’on va utiliser tout au long de notre tutoriel.

Le compilateur .NET, Roslyn, inclut des API et mécanismes qui permettent de faire plusieurs opérations sur notre code :

  • Analyser la structure de notre code
  • Construire des arbres syntaxiques
  • Récupérer les différentes opérations et metadata associées
  • ect.

Dans ce mini tutoriel on va utiliser principalement 3 API pour construire notre Analyzer et proposer par la suite une amélioration sur le code utilisateur :

  • Syntax Tree
  • Sementic Model
  • IOperation

Ne vous inquiétez pas, je vais vous donner quelques définitions avant de commencer pour partir sur des bases solides.

Syntax Tree API

La Syntax Tree API nous permet de construire une arborescence de syntaxe qui est une représentation fidèle de notre code C#. Cette structure de données est utilisée par le compilateur pour comprendre notre code et différencier les différents symboles utilisés (déclarations, opérateurs, ponctuation, espace vide…).

Voici un exemple d’un arbre syntaxique du code new int[0]

  • Les nodes sont de type SyntaxNode, ils peuvent représenter des déclarations, des instructions, des clauses et des expressions.
  • Les tokens sont de type SyntaxToken, ils peuvent représenter un mot clé, un identificateur, un opérateur ou un signe de ponctuation individuel.
  • Les trivias sont de type SyntaxTrivia, ils peuvent représenter les éléments d’information non significatifs comme les espaces et les commentaires.

Visual Studio propose une fenêtre qui nous permet de visualiser cet arbre et d’avoir plus de détails sur chaque nœud. View > Other Windows > Syntax Visualizer

Semantic Model API

Le Semantic Model est l’API qui peut répondre à toutes nos questions concernant les nœuds de la Syntax Tree évoquée précédemment. Cette API expose toutes les informations connues par le compilateur et peut répondre par exemple à ces questions :

  • Où est-ce que cet élément est déclaré dans le code source ?
  • Dans quel espace de nom et quel est le type de ce symbole ?
  • Quelle est la dimension d’un tableau ? …

IOperation API

L’API IOperation est une des évolutions du compilateur Roslyn qui expose des méthodes pour récupérer et cibler des opérations bien précises dans notre code.

On peut citer par exemple des opérations de création de tableau, un switch case, une déclaration d’une fonction locale…
Pour plus de détails vous pouvez trouver la liste complète des opérations supportées par le compilateur ICI

Allez on a trop parlé, on passe à l’action maintenant.

Etape 1 : Installation de l’environnement

Pour cet article on va utiliser Visual 2019 avec le kit “Visual studio extension development”

1 – Pour ajouter/supprimer des fonctionnalités dans votre Visual Studio, il faut ouvrir votre installer Visual Studio (vous pouvez utiliser la barre de recherche Windows).