2010-04-13 2 views
6

J'écris un plug-in Eclipse qui utilise le protocole ASTParser de JDT AST pour analyser une méthode. Je cherche dans cette méthode pour la création d'un type particulier d'objet.Pourquoi resolveBinding() renvoie-t-il une valeur nulle même si j'ai défini ResolveBindings (true) sur mon ASTParser?

Lorsque je trouve un ClassInstanceCreation, j'appelle le getType() pour voir quel type est instancié. Je veux être sûr que le type entièrement résolu traité ici est celui que je pense qu'il est, donc je dis l'objet Type résultant à resolveBinding(). Je reçois null même s'il n'y a pas d'erreurs de compilation et même si j'ai appelé setResolveBindings(true) sur mon ASTParser. J'ai donné mon ASTParser (via setSource()) le ICompilationUnit qui contient ma méthode, donc l'analyseur a accès au contexte entier de l'espace de travail.

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

Pourquoi resolveBinding() retour null? Comment puis-je obtenir les informations de liaison?

Répondre

5

Niché au bas de la liste des ASTParser.setKind(), soigneusement caché des gens de dépannage resolveBinding() et setResolveBindings(), est la déclaration

informations de liaison est calculée uniquement lorsque kind est K_COMPILATION_UNIT.

(de the online Javadoc)

Je ne comprends pas pourquoi ce serait désinvolture le cas, mais il ne semble indiquer assez clairement ce qui doit être différent!

+0

J'ai un cas similaire où le type est K_COMPILATION_UNIT mais toujours resolveBinding() renvoie null. Une idée pourquoi? – Dana

+0

La réponse semble être: http://stackoverflow.com/a/5803778/48369 – Dana

+1

Juste un commentaire tardif sur * "pourquoi ce serait le cas" *: si vous parser quelque chose de plus petit qu'une unité de compilation alors vous n'avez pas importer des instructions, et donc la résolution obligatoire est susceptible d'échouer. –

Questions connexes