Roslyn:检索父级或祖先 SyntaxNode 中的符号
Roslyn: Retrieving Symbol in parent or ancestor SyntaxNode
我正在编写一个 Roslyn 分析器,以便在某种 class 的某种方法中使用某种库方法时引发诊断,但我无法检索父语法或祖先语法中的符号节点。
例如,
class C
{
void M()
{
MyLibrary.SomeMethod();
}
}
这是分析SyntaxKind.InvocationExpression
的SyntaxNode
的代码
private void AnalyzeNode(SyntaxNodeAnalysisContext context)
{
var invocationExpression = context.Node as InvocationExpressionSyntax;
var methodSymbol = context.SemanticModel.GetSymbolInfo(invocationExpression).Symbol as IMethodSymbol;
if (methodSymbol == null) { return; }
// check if it is the library method I am interested in. No problems here
if (!methodSymbol.Name.Equals("SomeMethod") ||
!methodSymbol.ContainingSymbol.ToString().Equals("MyNamespace.MyLibrary"))
{ return; }
// this retrieves outer method "M".
var outerMethodSyntax = invocationExpression.FirstAncestorOrSelf<MethodDeclarationSyntax>();
if (outerMethodSyntax == null) { return; }
// symbol.Symbol is always null here
var symbol = context.SemanticModel.GetSymbolInfo(outerMethodSyntax);
...
所以我的问题是,是否可以从祖先 SyntaxNode
.
中检索 SymbolInfo
我的方法正确还是我应该尝试其他方法?
谢谢Jeroen Vannevel!我需要使用 semanticModel.GetDeclaredSymbol()
我正在编写一个 Roslyn 分析器,以便在某种 class 的某种方法中使用某种库方法时引发诊断,但我无法检索父语法或祖先语法中的符号节点。
例如,
class C
{
void M()
{
MyLibrary.SomeMethod();
}
}
这是分析SyntaxKind.InvocationExpression
SyntaxNode
的代码
private void AnalyzeNode(SyntaxNodeAnalysisContext context)
{
var invocationExpression = context.Node as InvocationExpressionSyntax;
var methodSymbol = context.SemanticModel.GetSymbolInfo(invocationExpression).Symbol as IMethodSymbol;
if (methodSymbol == null) { return; }
// check if it is the library method I am interested in. No problems here
if (!methodSymbol.Name.Equals("SomeMethod") ||
!methodSymbol.ContainingSymbol.ToString().Equals("MyNamespace.MyLibrary"))
{ return; }
// this retrieves outer method "M".
var outerMethodSyntax = invocationExpression.FirstAncestorOrSelf<MethodDeclarationSyntax>();
if (outerMethodSyntax == null) { return; }
// symbol.Symbol is always null here
var symbol = context.SemanticModel.GetSymbolInfo(outerMethodSyntax);
...
所以我的问题是,是否可以从祖先 SyntaxNode
.
SymbolInfo
我的方法正确还是我应该尝试其他方法?
谢谢Jeroen Vannevel!我需要使用 semanticModel.GetDeclaredSymbol()