ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2019-11-19 03:07:17  阅读:528  来源: 互联网

标签:roslyn roslyn-code-analysis c


我正在使用Roslyn在代码分析器上工作,当前的任务是查找程序集中未使用的所有内部方法.

我从MethodDeclarationSyntax开始并从中获取符号.然后,我在SymbolFinder中使用FindCallersAsync方法,但是即使我在程序集中某处对有问题的方法进行调用时,它也会返回一个空集合.请参见下面的代码.

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.

    ...
}

我已经看到类似的代码here,但是在该示例中,方法符号是使用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中传递了符号,则对方法的调用将正确返回-因此问题似乎出在符号参数而不是解决方案上.

由于我试图获取声明的基础符号,因此无法使用GetSymbolInfo,而应使用GetDeclaredSymbol(如建议的here).

我对this文章的理解是,从GetDeclaredSymbol和GetSymbolInfo返回的符号应该相同.但是,使用Equals进行的简单比较将返回false.

有谁知道返回的两个符号之间有什么区别,以及如何获得有效的“正确”符号?还是完全有更好的方法?我所有的研究似乎都指向FindCallersAsync,但我无法使其正常工作.

解决方法:

My understanding from this article is that the symbols returned from GetDeclaredSymbol and GetSymbolInfo should be the same. However, a simple comparison using Equals returns false.

这是因为它们不是相同的符号.它们来自完全不同的编译,可能相同也可能不同.一种来自主动编译的编译器,另一种来自MSBuildWorkspace.

从根本上讲,不支持在分析器中使用MSBuildWorkspace.完全可以不要那样做这不仅真的很慢,而且还存在各种正确性问题,尤其是在Visual Studio中运行分析器时.如果您的目标是在解决方案中的任何地方查找未使用的方法,那么我们实际上也不支持将其用作分析器,因为这涉及跨项目分析.

标签:roslyn,roslyn-code-analysis,c
来源: https://codeday.me/bug/20191119/2032918.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有