2017-08-09 28 views
1

Roslynのドキュメントでは、いくつかのコードをコンパイルしてコンパイルエラーを表示する方法として以下の例を挙げています。Roslynメモリ内コードの静的コード解析

下の例の変数sourceCodeに含まれるコードでスタティックコード分析を実行する方法を知っている人がいるかどうかは疑問でした。私はテストプロジェクトにStyleCop.Analyzersを追加しましたが、この段階でどのようにスタイル分析(例:可読性)を実行するのかを見ることはできません。

これをStyleCop.Analyzersで実行することは可能ですか、それとも別の方法がありますか?どんな提案も感謝して受け取りました。

ありがとうございました。

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

StyleCop.Analyzersは、一連のルールであり、プロジェクトコードを分析します。このルールは、ソースをコンパイルするときにC#コードを分析します。 '.csproj'ファイルを見て、このようなものが見つかると、この情報を取り戻すことができます。' 'したがって、StyleCop.Analyzersは、コードを含む静的または動的(sourceCode1 + sourceCode2)文字列を分析することはできません。 –

+0

ありがとう@GeorgeAlexandria – eslsys

答えて

2

実際、これは絶対に可能です。

WithAnalyzers methodを使用してRoslyn Compilationにアナライザーリファレンスを追加する必要があります。

この作業を行うには、StyleCop.Analy‌zersへの標準参照をプロジェクトに追加してから、さまざまなDiagnosticAnalyzerのインスタンスを作成する必要があります。彼らはinternalなので、Reflectionが必要です。

+0

私は['CompilationWithAnalyzers'](http://source.roslyn.io/#Microsoft.CodeAnalysis/DiagnosticAnalyzer/CompilationWithAnalyzers.cs,105)について知りませんでしたので、これは非常に有用な情報です。提案。ありがとう。 –

+0

ジョージのように、私はCompilationWithAnalyzersについて知りませんでしたが、確かに可能だと感じました。 – eslsys

関連する問題