Kevin Avignon: Roslyn - La plateforme de compilation .NET

41
Roslyn: La plateforme de compilation .NET Kevin Avignon

Transcript of Kevin Avignon: Roslyn - La plateforme de compilation .NET

Page 1: Kevin Avignon: Roslyn - La plateforme de compilation .NET

Roslyn: La plateforme de compilation .NET

Kevin Avignon

Page 2: Kevin Avignon: Roslyn - La plateforme de compilation .NET

AVANT DE COMMENCER LA PRÉSENTATION

Page 3: Kevin Avignon: Roslyn - La plateforme de compilation .NET

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

Page 4: Kevin Avignon: Roslyn - La plateforme de compilation .NET

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

Page 5: Kevin Avignon: Roslyn - La plateforme de compilation .NET

1. Introduction sur Roslyn

Page 6: Kevin Avignon: Roslyn - La plateforme de compilation .NET

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

Page 7: Kevin Avignon: Roslyn - La plateforme de compilation .NET

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

Page 8: Kevin Avignon: Roslyn - La plateforme de compilation .NET

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

Page 9: Kevin Avignon: Roslyn - La plateforme de compilation .NET

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

Page 10: Kevin Avignon: Roslyn - La plateforme de compilation .NET

◦ 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

Page 11: Kevin Avignon: Roslyn - La plateforme de compilation .NET

◦ 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

Page 12: Kevin Avignon: Roslyn - La plateforme de compilation .NET

Consommation de code (String)

Page 13: Kevin Avignon: Roslyn - La plateforme de compilation .NET

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

Page 14: Kevin Avignon: Roslyn - La plateforme de compilation .NET

2. Librairies utilisant Roslyn

Page 15: Kevin Avignon: Roslyn - La plateforme de compilation .NET

◦ CC0001 - Always Use Var Analyzer +

refactoring

◦ CC0007 - If Return Always Analyzer +

refactoring

◦ CC0008 - Object Initializer analyzer +

refactoring

Code Cracker (Github)

Page 16: Kevin Avignon: Roslyn - La plateforme de compilation .NET

AP1000 - Do not use async in Run method

Code analysis for Azure - Microsoft

Page 17: Kevin Avignon: Roslyn - La plateforme de compilation .NET

ConvertToConstant Variable locale -> const

ConvertIfStatementToConditionalTernaryExpression (if -> ?:)

ConvertIfStatementToNullCoalescingExpression (if -> ??)

ForCanBeConvertedToForeach

(for -foreach)

NRefactory - Mono Project

Page 18: Kevin Avignon: Roslyn - La plateforme de compilation .NET

3. Introduction sur Syntax & Symbol

Page 19: Kevin Avignon: Roslyn - La plateforme de compilation .NET

◦ Représentation syntaxique du code (.NET)

Produit par le compilateur

◦ Construit par divers éléments

Syntax nodes

Syntax tokens

Syntax trivia

L’arbre syntaxique

Page 20: Kevin Avignon: Roslyn - La plateforme de compilation .NET

◦ 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

Page 21: Kevin Avignon: Roslyn - La plateforme de compilation .NET

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

Page 22: Kevin Avignon: Roslyn - La plateforme de compilation .NET

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

Page 23: Kevin Avignon: Roslyn - La plateforme de compilation .NET

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

Page 24: Kevin Avignon: Roslyn - La plateforme de compilation .NET

4. Comment employer le Syntax Visualizer

Page 25: Kevin Avignon: Roslyn - La plateforme de compilation .NET

◦ Il faut beaucoup d’éléments pour initialiser un objet▫ VariableDeclarationSyntax▫ LocalVariableDeclarationSyntax▫ EqualsClauseSyntax▫ ObjectCreationExpressionSyntax▫ Possiblement AnonymousExpressionSyntax

L'initialisation d'un objet

Page 26: Kevin Avignon: Roslyn - La plateforme de compilation .NET

Valider le type d’une syntaxe (démo)

Page 27: Kevin Avignon: Roslyn - La plateforme de compilation .NET

5. Bâtir son premier analyzer en C#

Page 28: Kevin Avignon: Roslyn - La plateforme de compilation .NET

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

Page 29: Kevin Avignon: Roslyn - La plateforme de compilation .NET

Always Use Var Diagnostic Analyzer (démo)

Page 30: Kevin Avignon: Roslyn - La plateforme de compilation .NET

6. Qu'est-ce qu'un code fix provider ?

Page 31: Kevin Avignon: Roslyn - La plateforme de compilation .NET

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

Page 32: Kevin Avignon: Roslyn - La plateforme de compilation .NET

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

Page 33: Kevin Avignon: Roslyn - La plateforme de compilation .NET

Always Use Var Code Fix Provider (démo)

Page 34: Kevin Avignon: Roslyn - La plateforme de compilation .NET

7. Les pièges à éviter en faisant de l’analyse

Page 35: Kevin Avignon: Roslyn - La plateforme de compilation .NET

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

Page 36: Kevin Avignon: Roslyn - La plateforme de compilation .NET

Outil très puissant

Valide rapidement ce qui fauto Symbolo SyntaxNodeo Triviao Token

Ne pas employer Syntax Visualizer

Page 37: Kevin Avignon: Roslyn - La plateforme de compilation .NET

◦ 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)

Page 38: Kevin Avignon: Roslyn - La plateforme de compilation .NET

◦ À 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()

Page 39: Kevin Avignon: Roslyn - La plateforme de compilation .NET

◦ Les patrons GoF peuvent procurer de bonnes façons de refactorer le code▫ Stratégie▫ Template▫ Visiteur

Walker

Se refamiliariser avec GoF

Page 40: Kevin Avignon: Roslyn - La plateforme de compilation .NET

8. Q & A

Page 41: Kevin Avignon: Roslyn - La plateforme de compilation .NET

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