Roslyn从InvocationExpression获取方法声明

时间:2017-07-27 21:59:19

标签: c# roslyn

我正在制作一个roslyn演示,用于从属性

生成编译器警告

我有一个分析器来分析方法调用,如下所示:

public override void Initialize(AnalysisContext context)
{
    context.RegisterSyntaxNodeAction(AnalyzerInvocation, SyntaxKind.InvocationExpression);
}

private static void AnalyzerInvocation(SyntaxNodeAnalysisContext context)
{
    var invocation = (InvocationExpressionSyntax)context.Node;
}

我正在试图弄清楚如何获取方法声明,我知道我可以使用SymbolFinder来搜索方法声明

var model = compilation.GetSemanticModel(tree);

//Looking at the first method symbol
var methodSyntax = tree.GetRoot().DescendantNodes().OfType<MethodDeclarationSyntax>()
   .First(/*TODO: Execute Find for related symbol */);

这个选项既昂贵又烦人,而且它可以解决错误的可能性,因为如果你的调用方法来自程序集会怎样。

从InvocationExpressionSyntax获取方法声明的最简单方法是什么?我应该只使用符号查找器吗?如果它失败了,请使用scour导入的程序集,还是有更简单的方法?

1 个答案:

答案 0 :(得分:7)

如果您需要声明要调用的方法,可以按如下方式进行:

在第一步中,您将找到被调用的方法:

var methodSymbol = context
    .SemanticModel
    .GetSymbolInfo(invocation, context.CancellationToken)
    .Symbol as IMethodSymbol;

请记住,methodSymbol可能为null的原因有多种(例如,您正在调用委托,而不是方法),因此请对此进行测试。

然后你可以找到声明语法引用,并取第一个:

var syntaxReference = methodSymbol
    .DeclaringSyntaxReferences
    .FirstOrDefault();

这也可以为空,例如当你从另一个程序集中调用一个方法时,请测试它。

最后:

var declaration = syntaxReference.GetSyntax(context.CancellationToken);

这为您提供了语法。如果您需要该声明的语义模型,可以使用

获取
var semanticModel = context.Compilation.GetSemanticModel(declaration.SyntaxTree);