2012-08-30 10 views
8

Suponiendo que tengo un archivo de origen que tiene este aspecto:Encuentra Identificador de modelo semántico de

public class FieldReference 
{ 
    int field; 

    public FieldReference() 
    { 
     field = 1; 
    } 
} 

estoy usando un SyntaxRewriter para visitar todos los identificadores en este archivo. En el método VisitIdentifierName, quiero buscar el identificador en el modelo semántico, para descubrir si un identificador se refiere a un miembro de la clase actual.

Esto es lo que tengo hasta ahora:

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

Sin embargo no puedo encontrar una manera de buscar el identificador en el modelo Symantic - no haya sobrecarga del método SemanticModel.GetDeclaredSymbol que acepta un IdentifierNameSyntax .

¿Alguna idea de cómo debo hacer esto?

Respuesta

9

Debe usar SemanticModel.GetSymbolInfo en la expresión (en este caso particular, el IdentifierNameSyntax).

GetDeclaredSymbol es para ir desde el punto de declaración (int field; anterior) a un símbolo. Para realizar la lógica de enlace del compilador y ver a qué símbolo se une una expresión en particular, use GetSymbolInfo.

+0

Gracias Kevin, no estoy seguro de cómo lo he pasado por alto. ¡Todo es muy nuevo para mí, supongo! – Grokys

+0

hmm, esto parece estar roto en la versión actual de vista previa de Roslyn. Vea las muestras proyecto => ConvertToAutoPropertyCS => Dentro de PropertyRewriter => VisitFieldDeclaration (campo FieldDeclarationSyntax) No hay forma de obtener el símbolo para el parámetro de campo. – mynkow

+0

Debido a que una declaración de campo puede declarar más de un símbolo, necesita usar realmente VariableDeclaratorSyntax. –

Cuestiones relacionadas