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メソッドを使用することをお勧めします。しかし、アセンブリは廃止されたように見えます。
私は参考文献を数えていますが、そのカウンタへのアクセスはさらに良い解決策になるかもしれませんが、私はそれが不可能であると推測しています。
誰かが重複投稿を示唆する前に、この投稿はthis、thisまたはthisの重複ではありません。私の投稿は、Roslynコンパイラのアナライザーに特有のものです。
あなたがリンクしているアナライザーコードはかなり面白く見えますが、あなたがどのような種類の内部スコープを参照しているのか分かりません。コードアクセシビリティ、プロジェクトワイド、ソリューションワイド、参照されていないアセンブリであり、共有ソースプロジェクトではありませんか? –
単一のプロジェクトで使用されていないと判断されるタイプのフラグのみを設定します。したがって、プライベートまたは内部のタイプまたはメンバーのフラグが立てられます。パブリックタイプは、別のプロジェクトで参照を見つけることができないため、フラグは付けられません。 –
Roslynの "プロジェクト"の定義は、実際には "コンパイラの呼び出し"です。共有プロジェクトの場合は、ファイルを実際にコンパイルする2つ以上の「実際の」プロジェクトにファイルを提供することによって動作します。したがって、共有ファイルを含めて、これらの「実際の」プロジェクトを分析しています。 –