Kevin Avignon: Roslyn - La plateforme de compilation .NET
-
Upload
msdevmtl -
Category
Technology
-
view
132 -
download
1
Transcript of Kevin Avignon: Roslyn - La plateforme de compilation .NET
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ésentation1. Introduction sur Roslyn2. Librairies utilisant Roslyn3. Introduction sur Syntax & Symbol4. Comment employer le Syntax Visualizer5. Bâtir son premier analyzer en C#6. Qu'est-ce qu'un code fix provider7. Les pièges à éviter en faisant de l'analyse8. 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 commeIaaS ou Paas ou SaaSConsidéré comme un service Windows
“Reengineering” du compilateur .NET Expose differentes phase de la compilatio
n 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 syntaxi
que
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 providerExploite le Diagnostic AnalyzerRefactor le “mauvais” codeManière rapide de corriger une erreurDonne une bonne estimation de la marche à suivreNé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 declarationo 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 fauto Symbolo SyntaxNodeo Triviao 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