Kevin Avignon: Roslyn - La plateforme de compilation .NET

Post on 30-Jul-2015

132 views 1 download

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