6

Roslyn アナライザーを作成して、特定の種類のクラスの特定のメソッド内で特定のライブラリ メソッドが使用されているときに診断を生成しますが、親または先祖の構文ノードでシンボルを取得できません。

例えば、

class C
{
    void M()
    {
        MyLibrary.SomeMethod();
    }
}

そして、これはのを分析するためのコードSyntaxNodeですSyntaxKind.InvocationExpression

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);
    ...

SymbolInfoだから私の質問は、祖先から取得することは可能ですかSyntaxNode?

私のアプローチは正しいですか、それとも別のアプローチを試す必要がありますか?

4

1 に答える 1

5

ありがとうジェロン・ヴァネベル!私は使用する必要がありましたsemanticModel.GetDeclaredSymbol()

于 2016-02-15T12:12:20.410 に答える