【发布时间】:2017-07-27 21:59:18
【问题描述】:
我正在制作一个 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 获取方法声明的最简单方法是什么?我应该只使用符号查找器,如果它失败,请使用搜索导入的程序集还是有更简单更好的方法?
【问题讨论】:
-
我建议你结合使用
_semanticModel.GetDeclaredSymbol(...)和SymbolFinder.FindSourceDefinitionAsync。如果源文件中不存在声明,则最后一个方法返回 null,第一个方法可以通过调用节点检索声明。