簡體   English   中英

使用Roslyn查找特定方法的所有方法調用

[英]Find all method calls for a specific method using Roslyn

我正在使用Roslyn編寫代碼分析器,我當前的任務是找到程序集中未使用的所有內部方法。

我從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.

    ...
}

我在這里看到過類似的代碼,但在該示例中,方法符號是使用InvocationExpressionSyntax上的GetSymbolInfo獲得的:

//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應該是相同的。 但是,使用Equals進行簡單比較會返回false

有沒有人知道返回的兩個符號之間有什么區別,以及如何獲得有效的“正確”符號? 或者也許完全有更好的方法? 我的所有研究似乎都指向FindCallersAsync ,但我無法讓它工作。

我對本文的理解是,從GetDeclaredSymbol和GetSymbolInfo返回的符號應該是相同的。 但是,使用Equals進行簡單比較會返回false。

這是因為它們不是同一個符號; 它們來自完全不同的編輯,可能會也可能不會有所不同。 一個來自正在積極編譯的編譯器,一個來自MSBuildWorkspace。

從根本上說,不支持在分析器中使用MSBuildWorkspace。 完全。 不要那樣做。 這不僅非常慢,而且還有各種正確性問題,特別是如果您在Visual Studio中運行分析器。 如果您的目標是在解決方案中的任何位置找到未使用的方法,那么我們並不真正支持將其作為分析器實現,因為這涉及跨項目分析。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM