我正在使用 Roslyn 开发代码分析器,我当前的任务是查找程序集中未使用的所有内部方法。
我从 a 开始MethodDeclarationSyntax
并从中获取符号。然后我使用 in 中的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.
...
}
我在这里看到了类似的代码,但在该示例中,方法符号是使用以下方法获得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
是相同的。但是,使用Equals
返回的简单比较false
。
有谁知道返回的两个符号之间有什么区别以及如何获得“正确”的符号?或者也许完全有更好的方法?我所有的研究似乎都指向FindCallersAsync
,但我就是无法让它发挥作用。