2017-08-09 3 views
1

La documentation de Roslyn donne l'exemple ci-dessous pour compiler du code et afficher des erreurs de compilation. Je me demandais si quelqu'un connaît un moyen d'effectuer une analyse de code statique sur le code contenu dans la variable sourceCode dans l'exemple ci-dessous. J'ai ajouté StyleCop.Analyzers à mon projet de test mais je ne vois pas à ce stade comment cela pourrait être utilisé pour effectuer une analyse de style (par exemple la lisibilité). Est-il possible de faire cela avec StyleCop.Analyzers ou existe-t-il une autre approche? Toute suggestion reçue avec gratitude.Analyse de code statique sur le code en mémoire de Roslyn

Merci.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using Microsoft.CodeAnalysis; 
using Microsoft.CodeAnalysis.CSharp; 
using Microsoft.CodeAnalysis.CSharp.Syntax; 

namespace SemanticsCS 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var sourceCode = @"using System; 
       using System.Collections.Generic; 
       using System.Text; 

       namespace HelloWorld 
       { 
        class Program 
        { 
         static void Main(string[] args) 
         { 
          Console.WriteLine(""Hello, World!""); 
         } 
        } 
       }"; 
      SyntaxTree tree = CSharpSyntaxTree.ParseText(sourceCode); 

      var root = (CompilationUnitSyntax)tree.GetRoot(); 
      var compilation = CSharpCompilation.Create("HelloWorld") 
               .AddReferences(
                MetadataReference.CreateFromFile(
                 typeof(object).Assembly.Location)) 
               .AddSyntaxTrees(tree); 

      using (var ms = new MemoryStream()) 
      { 
       EmitResult result = compilation.Emit(ms); 
       if (!result.Success) 
       { 
        IEnumerable<Diagnostic> failures = result.Diagnostics.Where(diagnostic => 
         diagnostic.IsWarningAsError || 
         diagnostic.Severity == DiagnosticSeverity.Error); 

        foreach (Diagnostic diagnostic in failures) 
        { 
         Console.WriteLine(diagnostic.ToString()); 
         Console.Error.WriteLine("{0}({1})", diagnostic.GetMessage(), diagnostic.Id); 
        } 
       } 
      } 
     } 
    } 
} 
+0

Cette règle analyse le code C# lorsque vous essayez de compiler des sources. Vous pouvez récupérer cette information si vous regardez le fichier '.csproj' et trouvez que quelque chose ressemble à ceci' '. Donc, StyleCop.Analyzers ne peut pas analyser la chaîne statique ou dynamique (sourceCode1 + sourceCode2) qui contient un code. –

+0

Merci @GeorgeAlexandria – eslsys

Répondre

2

En fait, c'est absolument possible. Vous devez ajouter une référence d'analyseur à votre Roslyn Compilation, en utilisant le WithAnalyzers method. Pour ce faire, vous devez ajouter une référence normale à StyleCop.Analy‌zers à votre projet, puis créer des instances des différents DiagnosticAnalyzer s. Comme ils sont internal, vous aurez besoin de réflexion. StyleCop.Analyzers est un ensemble de règles et d'analyse pour votre code de projet.

+0

Il est très utile d'informations, parce que je ne savais pas sur ['CompilationWithAnalyzers'] (http://source.roslyn.io/#Microsoft.CodeAnalysis/DiagnosticAnalyzer/CompilationWithAnalyzers.cs,105), donc donné le pas correct suggestion. Merci. –

+0

C'est génial, merci beaucoup @Slaks - comme George je ne connaissais pas CompilationWithAnalyzers mais j'ai senti que c'était sûrement possible. – eslsys