2010-04-13 12 views
6

Sto scrivendo un plug-in Eclipse che utilizza JDT AST's ASTParser per analizzare un metodo. Sto guardando all'interno di quel metodo per la creazione di un particolare tipo di oggetto.Perché resolveBinding() restituisce null anche se setResolveBindings (true) sul mio ASTParser?

Quando trovo un ClassInstanceCreation, chiamo getType() su di esso per vedere quale tipo viene istanziato. Voglio essere sicuro che il tipo completamente risolto che viene trattato sia quello che penso sia, quindi dico all'oggetto Type risultante a resolveBinding(). Ricevo null indietro anche se non ci sono errori di compilazione e anche se ho chiamato setResolveBindings(true) sul mio ASTParser. Ho dato il mio ASTParser (via setSource()) allo ICompilationUnit che contiene il mio metodo, quindi il parser ha accesso all'intero contesto dell'area di lavoro.

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

Perché resolveBinding() ritorno null? Come posso ottenere le informazioni vincolanti?

risposta

5

Nascosto in fondo la panoramica di ASTParser.setKind(), accuratamente nascosto alla gente la risoluzione dei problemi e resolveBinding()setResolveBindings(), è la dichiarazione

Un'informazione vincolante viene calcolata solo quando kind è K_COMPILATION_UNIT.

(da the online Javadoc)

Non capisco estemporaneo perché questo sarebbe il caso, ma sembra indicare piuttosto chiaramente ciò che deve essere diverso!

+0

Ho un caso simile in cui il tipo è K_COMPILATION_UNIT ma risolvendo comunqueBinding() restituisce null. Qualche idea del perché? – Dana

+0

La risposta sembra essere: http://stackoverflow.com/a/5803778/48369 – Dana

+1

Solo un commento in ritardo su * "perché questo sarebbe il caso" *: se si analizza qualcosa di più piccolo di un'unità di compilazione, allora non si ha dichiarazioni di importazione, e quindi è probabile che la risoluzione vincolante fallisca. –

Problemi correlati