5

私は Roslyn を使用してコード アナライザーに取り組んでおり、現在のタスクは、アセンブリで使用されていないすべての内部メソッドを見つけることです。

a から始めて、MethodDeclarationSyntaxそこからシンボルを取得します。次に、 のFindCallersAsyncメソッドを使用SymbolFinderしますが、アセンブリのどこかで問題のメソッドを呼び出している場合でも、空のコレクションが返されます。以下のコードを参照してください。

protected override void Analyze(SyntaxNodeAnalysisContext context)
{
    NodeToAnalyze = context.Node;
    var methodDeclaration = NodeToAnalyze as MethodDeclarationSyntax;

    if (methodDeclaration == null)
        return;

    var methodSymbol = context.SemanticModel.GetDeclaredSymbol(methodDeclaration) as ISymbol;

    if (methodSymbol.DeclaredAccessibility != Accessibility.Internal)
        return;

    var solutionPath = GetSolutionPath();

    var msWorkspace = MSBuildWorkspace.Create();
    var solution = msWorkspace.OpenSolutionAsync(solutionPath).Result;

    var callers = SymbolFinder.FindCallersAsync(symbol, solution).Result;  // Returns empty collection.

    ...
}

ここで同様のコードを見たことがありますが、その例では、メソッド シンボルは on を使用GetSymbolInfoして取得されInvocationExpressionSyntaxます。

//Get the syntax node for the first invocation to M()
var methodInvocation = doc.GetSyntaxRootAsync().Result.DescendantNodes().OfType<InvocationExpressionSyntax>().First();
var methodSymbol = model.GetSymbolInfo(methodInvocation).Symbol;
//Finds all references to M()
var referencesToM = SymbolFinder.FindReferencesAsync(methodSymbol,  doc.Project.Solution).Result;

ただし、私の場合、宣言から呼び出し (存在する場合) を見つける必要があります。最初に呼び出しを取得し、呼び出しからメソッドへのシンボルを渡すと、GetSymbolInfo正しく返されるため、問題はsymbolパラメーターにあり、solution.

宣言の基になるシンボルを取得しようとしているので、 を使用することはできませんがGetSymbolInfo、代わりに使用します (ここでGetDeclaredSymbol提案されているように)。

この記事からの私の理解では、 と から返されるシンボルは同じGetDeclaredSymbolGetSymbolInfoなければなりません。ただし、 return を使用した単純なEquals比較false

返された2つのシンボルの違いと、機能する「正しい」シンボルを取得する方法を知っている人はいますか? それとも、完全に優れたアプローチがあるのでしょうか? 私のすべての研究は を指しているようですがFindCallersAsync、それを機能させることができません。

4

1 に答える 1