Roslyn:在父级或祖先 SyntaxNode 中检索符号

本文关键字:SyntaxNode 检索 符号 祖先 Roslyn | 更新日期: 2023-09-27 18:34:29

我正在编写一个 Roslyn 分析器,以便在某种类的某个方法中使用某个库方法时引发诊断,但我无法检索父语法节点或祖先语法节点中的符号。

例如

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.

我的方法是否正确,还是应该尝试另一种方法?

Roslyn:在父级或祖先 SyntaxNode 中检索符号

谢谢杰罗恩·范内维尔!我需要使用semanticModel.GetDeclaredSymbol()