2012-08-30 14 views
8

Supponendo Ho un file di origine che assomiglia a questo:Trova Identifier nel Semantic Modello

public class FieldReference 
{ 
    int field; 

    public FieldReference() 
    { 
     field = 1; 
    } 
} 

Sto usando uno SyntaxRewriter per visitare tutti gli identificatori in questo file. Nel metodo VisitIdentifierName, voglio cercare l'identificatore nel modello semantico, per scoprire se un identificatore si riferisce a un membro della classe corrente.

Questo è quello che ho finora:

public override SyntaxNode VisitIdentifierName(IdentifierNameSyntax node) 
{ 
    SemanticModel model = this.compilation.GetSemanticModel(this.src); 
    // ?? look up identifier in compilation here ?? 
    return base.VisitIdentifierName(node); 
} 

Tuttavia non posso trovare via per cercare l'identificatore nel modello Symantic - non c'è overload del metodo SemanticModel.GetDeclaredSymbol che accetta un IdentifierNameSyntax .

Qualche idea su come dovrei farlo?

risposta

9

È necessario utilizzare SemanticModel.GetSymbolInfo nell'espressione (in questo caso lo IdentifierNameSyntax).

GetDeclaredSymbol è per passare dal punto di dichiarazione (int field; sopra) a un simbolo. Per eseguire la logica di binding del compilatore e vedere a quale simbolo si lega una particolare espressione, utilizzare GetSymbolInfo.

+0

Grazie Kevin, non sono sicuro di come ho trascurato quello. Tutto solo molto nuovo per me, credo! – Grokys

+0

hmm, questo sembra rotto nella versione di anteprima corrente di Roslyn. Vedi il progetto samples => ConvertToAutoPropertyCS => Inside the PropertyRewriter => VisitFieldDeclaration (FieldDeclarationSyntax campo) Non c'è modo di ottenere il simbolo per il parametro field. – mynkow

+0

Poiché una dichiarazione di campo può dichiarare più di un simbolo, è necessario utilizzare effettivamente VariableDeclaratorSyntax. –