2015-09-14 6 views
6

Visual Studio 2015ソリューションで他の型から参照されていない型を探すコードアナライザをプログラミングしようとしています。Visual Studioコードアナライザ:参照がゼロの型を探す

私の問題は、参照されていないタイプのリストを見つける方法を見つけることができないということです。

下記のコードからわかるようにDOMを試しましたが、どこをナビゲートするのかわからず、現在のコードはすでに遅いようです。

using Microsoft.CodeAnalysis; 
using Microsoft.CodeAnalysis.CSharp; 
using Microsoft.CodeAnalysis.CSharp.Syntax; 
using Microsoft.CodeAnalysis.Diagnostics; 
using System.Collections.Immutable; 
using System.Linq; 

namespace AlphaSolutions.CodeAnalysis 
{ 
    [DiagnosticAnalyzer(LanguageNames.CSharp)] 
    public class ZeroReferencesDiagnosticAnalyzer : DiagnosticAnalyzer 
    { 
     public const string DiagnosticId = "ZeroReferences"; 

     private static DiagnosticDescriptor rule = new DiagnosticDescriptor(
      DiagnosticId, 
      title: "Type has zero code references", 
      messageFormat: "Type '{0}' is not referenced within the solution", 
      category: "Naming", 
      defaultSeverity: DiagnosticSeverity.Warning, 
      isEnabledByDefault: true, 
      description: "Type should have references." 
      ); 

     public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics 
     { 
      get 
      { 
       return ImmutableArray.Create(rule); 
      } 
     } 

     public override void Initialize(AnalysisContext context) 
     { 
      context.RegisterSyntaxNodeAction(this.AnalyzeSyntaxNode, SyntaxKind.ClassDeclaration); 
     } 

     private void AnalyzeSyntaxNode(SyntaxNodeAnalysisContext obj) 
     { 
      var classDeclaration = obj.Node as ClassDeclarationSyntax; 
      if(classDeclaration == null) 
      { 
       return; 
      } 

      var identifierNameSyntaxes = classDeclaration 
       .DescendantNodes() 
       .OfType<IdentifierNameSyntax>() 
       .ToArray() 
       ; 
      if (identifierNameSyntaxes.Length == 0) 
      { 
       return; 
      } 

      //SymbolFinder.FindReferencesAsync(namedTypeSymbol, solution); 
     } 
    } 
} 

私もSymbolFinder.FindReferencesAsync(namedTypeSymbol, solution)を試してみましたが、私はSolutionへの参照を取得する方法を見つけ出すことはできません。

Microsoft Answersの返信では、Roslyn.ServicesアセンブリのFindReferencesメソッドを使用することをお勧めします。しかし、アセンブリは廃止されたように見えます。

私は参考文献を数えていますが、そのカウンタへのアクセスはさらに良い解決策になるかもしれませんが、私はそれが不可能であると推測しています。

誰かが重複投稿を示唆する前に、この投稿はthisthisまたはthisの重複ではありません。私の投稿は、Roslynコンパイラのアナライザーに特有のものです。

答えて

5

Roslyn診断アナライザでは現在、ソリューション全体(つまりプロジェクト間)分析を行うことができません。そのため、Solutionというオブジェクトは提供されません。これは部分的にはパフォーマンス上の考慮事項でした。FindReferencesAsyncをどこでも呼び出そうとすれば、CPUはかなり激しく動かなくなります。 CodeLensには、使用していたCPUの量に関するフィードバックが多かったため、同じ量のCPUを消費する10個の診断を望まなかった。 (あなたの貧弱なノートパソコンのバッテリーを想像してください...)

これは限られていても問題ありません。内部にあるプロジェクトで使われていない内部タイプを見つけると言うと、this analyzer we wrote awhile backを見てください。

+0

あなたがリンクしているアナライザーコードはかなり面白く見えますが、あなたがどのような種類の内部スコープを参照しているのか分かりません。コードアクセシビリティ、プロジェクトワイド、ソリューションワイド、参照されていないアセンブリであり、共有ソースプロジェクトではありませんか? –

+0

単一のプロジェクトで使用されていないと判断されるタイプのフラグのみを設定します。したがって、プライベートまたは内部のタイプまたはメンバーのフラグが立てられます。パブリックタイプは、別のプロジェクトで参照を見つけることができないため、フラグは付けられません。 –

+0

Roslynの "プロジェクト"の定義は、実際には "コンパイラの呼び出し"です。共有プロジェクトの場合は、ファイルを実際にコンパイルする2つ以上の「実際の」プロジェクトにファイルを提供することによって動作します。したがって、共有ファイルを含めて、これらの「実際の」プロジェクトを分析しています。 –

関連する問題