2010-04-13 37 views
6

Estoy escribiendo un complemento de Eclipse que usa JDT AST ASTParser para analizar un método. Estoy buscando dentro de ese método para la creación de un tipo particular de objeto.¿Por qué resolveBinding() devuelve null a pesar de que establecí ResolucionesResultadas (verdadero) en mi ASTParser?

Cuando encuentro un ClassInstanceCreation, llamo al getType() para ver de qué tipo se está creando una instancia. Quiero estar seguro de que el tipo totalmente resuelto que se trata allí es el que creo que es, así que le digo al objeto resultante Type al resolveBinding(). Recibo null a pesar de que no hay errores de compilación y aunque llamé al setResolveBindings(true) en mi ASTParser. Di mi ASTParser (a través de setSource()) el ICompilationUnit que contiene mi método, por lo que el analizador tiene acceso a todo el contexto del espacio de trabajo.

final IMethod method = ...; 
final ASTParser parser = ASTParser.newParser(AST.JLS3); 
parser.setResolveBindings(true); 
parser.setSource(method.getCompilationUnit()); 
parser.setSourceRange(method.getSourceRange().getOffset(), method.getSourceRange().getLength()); 
parser.setKind(ASTParser.K_CLASS_BODY_DECLARATIONS); 
final TypeDeclaration astRoot = (TypeDeclaration) parser.createAST(null); 
final ClassInstanceCreation classInstanceCreation = walkAstAndFindMyExpression(astRoot); 
final Type instantiatedType = classInstanceCreation.getType(); 
System.out.println("BINDING: " + instantiatedType.resolveBinding()); 

¿Por qué resolveBinding() retorno null? ¿Cómo puedo obtener la información vinculante?

Respuesta

5

Escondido en la parte inferior de la visión general de ASTParser.setKind(), cuidadosamente oculto a la gente de solución de problemas y resolveBinding()setResolveBindings(), es la declaración

información vinculante únicamente cuando se calcula kind es K_COMPILATION_UNIT.

(desde the online Javadoc)

No entiendo improvisada por qué esto sería el caso, pero parece señalar con bastante claridad en lo que tiene que ser diferente!

+0

Tengo un caso similar donde el tipo es K_COMPILATION_UNIT pero aún resolveBinding() devuelve nulo. ¿Alguna idea de por qué? – Dana

+0

La respuesta parece ser: http://stackoverflow.com/a/5803778/48369 – Dana

+1

Solo un último comentario sobre * "por qué este sería el caso" *: si analiza algo más pequeño que una unidad de compilación, entonces no tiene importar declaraciones, y por lo tanto, la resolución vinculante es probable que falle. –

Cuestiones relacionadas