Roslyn 从 InvocationExpression 获取方法声明
Roslyn Get Method Declaration from InvocationExpression
我正在制作一个 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 获取方法声明的最简单方法是什么?我应该只使用符号查找器吗?如果它失败,请使用搜索导入的程序集,还是有更简单更好的方法?
如果您需要调用方法的声明,您可以按如下方式获取。
第一步,你找出调用的是什么方法:
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);
我正在制作一个 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 获取方法声明的最简单方法是什么?我应该只使用符号查找器吗?如果它失败,请使用搜索导入的程序集,还是有更简单更好的方法?
如果您需要调用方法的声明,您可以按如下方式获取。
第一步,你找出调用的是什么方法:
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);