私は 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
提案されているように)。
この記事からの私の理解では、 と から返されるシンボルは同じGetDeclaredSymbol
でGetSymbolInfo
なければなりません。ただし、 return を使用した単純なEquals
比較false
。
返された2つのシンボルの違いと、機能する「正しい」シンボルを取得する方法を知っている人はいますか? それとも、完全に優れたアプローチがあるのでしょうか? 私のすべての研究は を指しているようですがFindCallersAsync
、それを機能させることができません。