4 mai 2015
Groupe .NET/ASP.NET
Sujets: Roslyn - La plateforme de compilation .NET
Conférencier: Kevin Avignon
Roslyn est la nouvelle plateforme .NET de compilation créé par Microsoft. En exploitant Roslyn, il devient nettement plus facile de traverser un fichier source (.cs ou .vb) et instaurer de nouvelles règles d'affaires ou de validation comme il était fait avec FxCop. Un des nombreux bienfaits de Roslyn, c'est que les règles d'affaires développer en C# ou VB.NET fonctionnent autant dans un langage que dans l'autre.
Plan de la présentation:
- Qu'est-ce que Roslyn
- Quelles sont les librairies effectuant du code analysis ?
- Introduction sur le Syntax Tree et Syntax Nodes
- Comment utiliser le Syntax Visualizer
- Bâtir son premier analyzer en C#
- Qu'est-ce qu'un code fix
- Les pièges à éviter en faisant de l'analyse
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 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
6. 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
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 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
9. 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
10. ◦ 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
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
13. 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
19. ◦ Représentation syntaxique du 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é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
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
25. ◦ Il faut beaucoup d’éléments pour
initialiser un objet
▫ VariableDeclarationSyntax
▫ LocalVariableDeclarationSyntax
▫ EqualsClauseSyntax
▫ ObjectCreationExpressionSyntax
▫ Possiblement AnonymousExpressionSyntax
L'initialisation d'un objet
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
31. 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
32. 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
35. 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
36. Outil très puissant
Valide rapidement ce qui faut
o Symbol
o SyntaxNode
o Trivia
o Token
Ne pas employer Syntax Visualizer
37. ◦ 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)
38. ◦ À 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()
39. ◦ Les patrons GoF peuvent procurer de
bonnes façons de refactorer le code
▫ Stratégie
▫ Template
▫ Visiteur
Walker
Se refamiliariser avec GoF