Roslyn: La plateforme de compilation
.NET
Kevin Avignon
AVANT DE COMMENCER LA PRÉSENTATION
Qui suis-je ?
 Étudiant en génie des technologies de l’information (ÉTS)
 Membre de MSDEVMTL depuis Oct. ‘14
 Contributeur de la librairie Code Cracker (CC) sur Github
 Bloggeur .NET sur le site www.diveintodotnet.com
 Participant au Google Summer of Code 2015 avec Mono Project
(Xamarin) et la librairie NRefactory
 Rédacteur pour le Visual Studio Magazine
Plan de la présentation
1. Introduction sur Roslyn
2. Librairies utilisant Roslyn
3. Introduction sur Syntax & Symbol
4. Comment employer le Syntax Visualizer
5. Bâtir son premier analyzer en C#
6. Qu'est-ce qu'un code fix provider
7. Les pièges à éviter en faisant de l'analyse
8. Q&A
1. Introduction sur Roslyn
Les pré-requis
• Visual Studio 2015 Ultimate CTP 6 ou
Visual Studio 2015 RC
• .NET Compiler Platform SDK Templates
• .NET Compiler Platform Syntax Visualizer
• Soit en NuGet package ou VSIX
Qu'est-ce que Roslyn ?
• Roslyn est le nom du projet Open source de Microsoft
• Beaucoup plus gros qu'un simple API
– Compilateur
• Compiler as a Service
– Scripts
– Différentes stacks d'IDE
– Analyse sémantique du code
 Un CaaS n’est pas comme
IaaS ou Paas ou SaaS
Considéré comme un service Windows
 “Reengineering” du compilateur .NET
 Expose differentes phase de la
compilation du code
Compiler as a Service
Une plateforme de compilation
• Ensemble d'APIS
– Bâtie au-dessus des compilateur C# &
VB.NET
– Permet l'inspection de code source
– Permet la transformation de code source
◦ Ancienne manière dite “black box”
▫ Écriture du code
▫ Écriture de tests
▫ Génération d’assemblies, dlls, etc
▫ Refactor le code selon les besoins du client
La vie avant Roslyn
◦ Accès à la dite black box
 Information sémantique & syntaxique
◦ Les langages .NET sont en mesure de consommer et
générer du code au runtime
◦ Accepter un arbre syntaxique
◦ Générer un arbre syntaxique
Une nouvelle vie
Consommation de code (String)
Diagnostic Analyzer
• Analyse du code source
– Cible l'erreur indiquée
– Envoie un message à l'utilisateur
– Se concentre sur différents morceaux du
fichier
– Fonctionne en compilation-time
2. Librairies utilisant Roslyn
◦ CC0001 - Always Use Var Analyzer +
refactoring
◦ CC0007 - If Return Always Analyzer +
refactoring
◦ CC0008 - Object Initializer analyzer +
refactoring
Code Cracker (Github)
AP1000 - Do not use async in Run method
Code analysis for Azure - Microsoft
 ConvertToConstant
 Variable locale -> const
 ConvertIfStatementToConditionalTernaryExpression
 (if -> ?:)
 ConvertIfStatementToNullCoalescingExpression
 (if -> ??)
 ForCanBeConvertedToForeach
 (for -foreach)
NRefactory - Mono Project
3. Introduction sur Syntax & Symbol
◦ Représentation syntaxique du code (.NET)
 Produit par le compilateur
◦ Construit par divers éléments
 Syntax nodes
 Syntax tokens
 Syntax trivia
L’arbre syntaxique
◦ Nodes (noeuds): Élements principaux de l’arbre
syntaxique
 Représente une multitude de construction syntaxique
ObjectCreationExpressionSyntax, InvocationExpressionSyntax,etc
 token et trivia dépendent du noeud courant
 Ne dépendent pas d’un langage spécifique
Syntax Node - I
o Se définit avec un span de character
 TextSpan : [Début, Longueur]
 Ne prend pas en compte le trivia
o Un noeud a connaissance de ces enfants & descendants
 IEnumerable<SyntaxNode>
Syntax Node - II
 Syntax Token
– Représente des petits fragments de code
– Keywords (int, lock, abstract)
– Identifiants (noms de variables
• Syntax Trivia
– Représente le trivia dans l'arbre syntaxique
• End of line trivia
• Whitespace trivia
Syntax Tokens & Syntax Trivia
ISymbol & ITypeSymbol
• ISymbol
– Représentation dans l'arbre syntaxique
• namespace, classe, struct
– Information sur les noeuds exposée par le compilateur
– Permet de valider le type d'un noeud
• ITypeSymbol
– Représentation de l'information d'implémentation
– Accès aux bases type d'un noeud
– Accès aux interfaces implémentées par un noeud
4. Comment employer le Syntax Visualizer
◦ Il faut beaucoup d’éléments pour
initialiser un objet
▫ VariableDeclarationSyntax
▫ LocalVariableDeclarationSyntax
▫ EqualsClauseSyntax
▫ ObjectCreationExpressionSyntax
▫ Possiblement AnonymousExpressionSyntax
L'initialisation d'un objet
Valider le type d’une syntaxe (démo)
5. Bâtir son premier analyzer en C#
o Node: SyntaxNode
 Noued (s) spécifié dans l’analyse
o Semantic Model: SemanticModel
 Garde en mémoire (cache) les symbols locaux
 Résolver un symbol en runtime
 Information sémantique concernant les noeuds dans l’arbre
o ReportDiagnostic: Action<Diagnostic>
 DiagnosticDescriptor
 Rule
 Location
SyntaxNodeAnalysisContext struct
Always Use Var Diagnostic Analyzer
(démo)
6. Qu'est-ce qu'un code fix provider ?
o Les raisons pour implémenter cet analyzer
 Améliore la lisibilité
 Rend le code plus uniforme
 Assez facile à implémenter
o Fonctionnement
1. Rechercher tous les local variables
2. Valider celles de type “var”
3. Envoyer une erreur si jamais != var
Always use var for local variables
Code fix provider
Exploite le Diagnostic Analyzer
Refactor le “mauvais” code
Manière rapide de corriger une erreur
Donne une bonne estimation de la marche à suivre
Nécéssite de manipuler l’arbre syntaxique
• Ajout d'un syntax node
• Délétion d'un syntax node
• modification d’un syntax node
Always Use Var Code Fix Provider
(démo)
7. Les pièges à éviter en faisant de l’analyse
 Lorsqu’il s’agit d’une declaration
o GetDeclaredSymbol <- SemanticModel
 Classe
 Enum
 Variable (locale, champs, propriété, anonyme)
 Interface
 Struct
 Sinon
 GetSymbolInfo <- SemanticModel
Résolver un symbol
 Outil très puissant
 Valide rapidement ce qui faut
o Symbol
o SyntaxNode
o Trivia
o Token
Ne pas employer Syntax Visualizer
◦ Préférable de développer en TDD
◦ Tenter de penser aux edge cases
▫ Les plus susceptibles de briser votre logique
◦ Réduction du temps en QA
Ne pas faire de unit tests (TDD)
◦ À utiliser dans de rares circonstances
▫ MetadataName
▫ typeof
▫ Retrouver l'objet TypeInfo avec SemanticModel.GetTypeInfo()
◦ Effet sur la performance de l’analyzer
▫ Retraverse l’arbre à chaque invocation pour créer un string
▫ Ne place aucune information en cache.
Employer la méthode ToDisplayString()
◦ Les patrons GoF peuvent procurer de
bonnes façons de refactorer le code
▫ Stratégie
▫ Template
▫ Visiteur
 Walker
Se refamiliariser avec GoF
8. Q & A
1. https://github.com/dotnet/roslyn
2. http://www.infoworld.com/article/2621132/microsoft-net/microsoft-s-roslyn--reinventing-the-compiler-as-we-
know-it.html
3. http://www.i-programmer.info/professional-programmer/i-programmer/7154-c-guru-an-interview-with-eric-
lippert.html
4. http://davefancher.com/2014/11/12/i-can-analyze-code-and-so-can-you/
5. http://www.dreamincode.net/forums/blog/217/entry-4754-wrote-my-first-roslyn-diagnostic-and-code-fix-today/
(VB.NET Analyzer + Code Fix)
6. http://blog.jetbrains.com/dotnet/2014/04/10/resharper-and-roslyn-qa/
7. https://channel9.msdn.com/Events/TechDays/Techdays-2012-the-Netherlands/2293
8. https://channel9.msdn.com/coding4fun/blog/The-future-of-NET-today-The-NET-Compiler-Platform
9. https://msdn.microsoft.com/en-us/magazine/dn904670.aspx
Sources

Kevin Avignon: Roslyn - La plateforme de compilation .NET

  • 1.
    Roslyn: La plateformede compilation .NET Kevin Avignon
  • 2.
    AVANT DE COMMENCERLA PRÉSENTATION
  • 3.
    Qui suis-je ? Étudiant en génie des technologies de l’information (ÉTS)  Membre de MSDEVMTL depuis Oct. ‘14  Contributeur de la librairie Code Cracker (CC) sur Github  Bloggeur .NET sur le site www.diveintodotnet.com  Participant au Google Summer of Code 2015 avec Mono Project (Xamarin) et la librairie NRefactory  Rédacteur pour le Visual Studio Magazine
  • 4.
    Plan de laprésentation 1. Introduction sur Roslyn 2. Librairies utilisant Roslyn 3. Introduction sur Syntax & Symbol 4. Comment employer le Syntax Visualizer 5. Bâtir son premier analyzer en C# 6. Qu'est-ce qu'un code fix provider 7. Les pièges à éviter en faisant de l'analyse 8. Q&A
  • 5.
  • 6.
    Les pré-requis • VisualStudio 2015 Ultimate CTP 6 ou Visual Studio 2015 RC • .NET Compiler Platform SDK Templates • .NET Compiler Platform Syntax Visualizer • Soit en NuGet package ou VSIX
  • 7.
    Qu'est-ce que Roslyn? • Roslyn est le nom du projet Open source de Microsoft • Beaucoup plus gros qu'un simple API – Compilateur • Compiler as a Service – Scripts – Différentes stacks d'IDE – Analyse sémantique du code
  • 8.
     Un CaaSn’est pas comme IaaS ou Paas ou SaaS Considéré comme un service Windows  “Reengineering” du compilateur .NET  Expose differentes phase de la compilation du code Compiler as a Service
  • 9.
    Une plateforme decompilation • Ensemble d'APIS – Bâtie au-dessus des compilateur C# & VB.NET – Permet l'inspection de code source – Permet la transformation de code source
  • 10.
    ◦ Ancienne manièredite “black box” ▫ Écriture du code ▫ Écriture de tests ▫ Génération d’assemblies, dlls, etc ▫ Refactor le code selon les besoins du client La vie avant Roslyn
  • 11.
    ◦ Accès àla dite black box  Information sémantique & syntaxique ◦ Les langages .NET sont en mesure de consommer et générer du code au runtime ◦ Accepter un arbre syntaxique ◦ Générer un arbre syntaxique Une nouvelle vie
  • 12.
  • 13.
    Diagnostic Analyzer • Analysedu code source – Cible l'erreur indiquée – Envoie un message à l'utilisateur – Se concentre sur différents morceaux du fichier – Fonctionne en compilation-time
  • 14.
  • 15.
    ◦ CC0001 -Always Use Var Analyzer + refactoring ◦ CC0007 - If Return Always Analyzer + refactoring ◦ CC0008 - Object Initializer analyzer + refactoring Code Cracker (Github)
  • 16.
    AP1000 - Donot use async in Run method Code analysis for Azure - Microsoft
  • 17.
     ConvertToConstant  Variablelocale -> const  ConvertIfStatementToConditionalTernaryExpression  (if -> ?:)  ConvertIfStatementToNullCoalescingExpression  (if -> ??)  ForCanBeConvertedToForeach  (for -foreach) NRefactory - Mono Project
  • 18.
    3. Introduction surSyntax & Symbol
  • 19.
    ◦ Représentation syntaxiquedu code (.NET)  Produit par le compilateur ◦ Construit par divers éléments  Syntax nodes  Syntax tokens  Syntax trivia L’arbre syntaxique
  • 20.
    ◦ Nodes (noeuds):Élements principaux de l’arbre syntaxique  Représente une multitude de construction syntaxique ObjectCreationExpressionSyntax, InvocationExpressionSyntax,etc  token et trivia dépendent du noeud courant  Ne dépendent pas d’un langage spécifique Syntax Node - I
  • 21.
    o Se définitavec un span de character  TextSpan : [Début, Longueur]  Ne prend pas en compte le trivia o Un noeud a connaissance de ces enfants & descendants  IEnumerable<SyntaxNode> Syntax Node - II
  • 22.
     Syntax Token –Représente des petits fragments de code – Keywords (int, lock, abstract) – Identifiants (noms de variables • Syntax Trivia – Représente le trivia dans l'arbre syntaxique • End of line trivia • Whitespace trivia Syntax Tokens & Syntax Trivia
  • 23.
    ISymbol & ITypeSymbol •ISymbol – Représentation dans l'arbre syntaxique • namespace, classe, struct – Information sur les noeuds exposée par le compilateur – Permet de valider le type d'un noeud • ITypeSymbol – Représentation de l'information d'implémentation – Accès aux bases type d'un noeud – Accès aux interfaces implémentées par un noeud
  • 24.
    4. Comment employerle Syntax Visualizer
  • 25.
    ◦ Il fautbeaucoup d’éléments pour initialiser un objet ▫ VariableDeclarationSyntax ▫ LocalVariableDeclarationSyntax ▫ EqualsClauseSyntax ▫ ObjectCreationExpressionSyntax ▫ Possiblement AnonymousExpressionSyntax L'initialisation d'un objet
  • 26.
    Valider le typed’une syntaxe (démo)
  • 27.
    5. Bâtir sonpremier analyzer en C#
  • 28.
    o Node: SyntaxNode Noued (s) spécifié dans l’analyse o Semantic Model: SemanticModel  Garde en mémoire (cache) les symbols locaux  Résolver un symbol en runtime  Information sémantique concernant les noeuds dans l’arbre o ReportDiagnostic: Action<Diagnostic>  DiagnosticDescriptor  Rule  Location SyntaxNodeAnalysisContext struct
  • 29.
    Always Use VarDiagnostic Analyzer (démo)
  • 30.
    6. Qu'est-ce qu'uncode fix provider ?
  • 31.
    o Les raisonspour implémenter cet analyzer  Améliore la lisibilité  Rend le code plus uniforme  Assez facile à implémenter o Fonctionnement 1. Rechercher tous les local variables 2. Valider celles de type “var” 3. Envoyer une erreur si jamais != var Always use var for local variables
  • 32.
    Code fix provider Exploitele Diagnostic Analyzer Refactor le “mauvais” code Manière rapide de corriger une erreur Donne une bonne estimation de la marche à suivre Nécéssite de manipuler l’arbre syntaxique • Ajout d'un syntax node • Délétion d'un syntax node • modification d’un syntax node
  • 33.
    Always Use VarCode Fix Provider (démo)
  • 34.
    7. Les piègesà éviter en faisant de l’analyse
  • 35.
     Lorsqu’il s’agitd’une declaration o GetDeclaredSymbol <- SemanticModel  Classe  Enum  Variable (locale, champs, propriété, anonyme)  Interface  Struct  Sinon  GetSymbolInfo <- SemanticModel Résolver un symbol
  • 36.
     Outil trèspuissant  Valide rapidement ce qui faut o Symbol o SyntaxNode o Trivia o Token Ne pas employer Syntax Visualizer
  • 37.
    ◦ Préférable dedévelopper en TDD ◦ Tenter de penser aux edge cases ▫ Les plus susceptibles de briser votre logique ◦ Réduction du temps en QA Ne pas faire de unit tests (TDD)
  • 38.
    ◦ À utiliserdans de rares circonstances ▫ MetadataName ▫ typeof ▫ Retrouver l'objet TypeInfo avec SemanticModel.GetTypeInfo() ◦ Effet sur la performance de l’analyzer ▫ Retraverse l’arbre à chaque invocation pour créer un string ▫ Ne place aucune information en cache. Employer la méthode ToDisplayString()
  • 39.
    ◦ Les patronsGoF peuvent procurer de bonnes façons de refactorer le code ▫ Stratégie ▫ Template ▫ Visiteur  Walker Se refamiliariser avec GoF
  • 40.
  • 41.
    1. https://github.com/dotnet/roslyn 2. http://www.infoworld.com/article/2621132/microsoft-net/microsoft-s-roslyn--reinventing-the-compiler-as-we- know-it.html 3.http://www.i-programmer.info/professional-programmer/i-programmer/7154-c-guru-an-interview-with-eric- lippert.html 4. http://davefancher.com/2014/11/12/i-can-analyze-code-and-so-can-you/ 5. http://www.dreamincode.net/forums/blog/217/entry-4754-wrote-my-first-roslyn-diagnostic-and-code-fix-today/ (VB.NET Analyzer + Code Fix) 6. http://blog.jetbrains.com/dotnet/2014/04/10/resharper-and-roslyn-qa/ 7. https://channel9.msdn.com/Events/TechDays/Techdays-2012-the-Netherlands/2293 8. https://channel9.msdn.com/coding4fun/blog/The-future-of-NET-today-The-NET-Compiler-Platform 9. https://msdn.microsoft.com/en-us/magazine/dn904670.aspx Sources