2016-02-14 34 views
2

我正在寫一個Roslyn分析器來在某種類的某種類中的特定方法中使用某個庫方法時引發診斷,但是我無法檢索父代中的符號或祖先語法節點。Roslyn:檢索父代或祖先中的符號SyntaxNode

例如,

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

這是分析的SyntaxNodeSyntaxKind.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); 
    ... 

所以我的問題是代碼,是有可能從一個祖先SyntaxNode檢索SymbolInfo

我的方法正確嗎?還是應該嘗試其他方法?

+1

因爲您正在處理聲明節點('MethodDeclarationSyntax'),所以使用'semanticModel.GetDeclaredSymbol()' –

回答