Почему resolveBinding() возвращает значение null, хотя я установил ResolveBindings(true) в своем ASTParser?

Я пишу подключаемый модуль Eclipse, который использует ASTParser JDT AST для анализа метода. Я ищу в этом методе создание объекта определенного типа.

Когда я нахожу ClassInstanceCreation, я вызываю для него getType(), чтобы увидеть, какой тип создается. Я хочу быть уверен, что полностью разрешенный тип, с которым мы имеем дело, — это тот, который я думаю, поэтому я передаю результирующий объект Type объекту resolveBinding(). Я получаю null обратно, хотя ошибок компиляции нет и несмотря на то, что я вызвал setResolveBindings(true) на своем ASTParser. Я дал своему ASTParser (через setSource()) ICompilationUnit, который содержит мой метод, поэтому синтаксический анализатор имеет доступ ко всему контексту рабочей области.

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

Почему resolveBinding() возвращает null? Как я могу получить информацию о привязке?


person Woody Zenfell III    schedule 13.04.2010    source источник


Ответы (1)


В нижней части обзора ASTParser.setKind(), тщательно скрытого от людей, занимающихся устранением неполадок resolveBinding() и setResolveBindings(), находится утверждение.

Информация о привязке вычисляется только тогда, когда kind равно K_COMPILATION_UNIT.

(из документ Java в Интернете)

Я не понимаю навскидку, почему это так, но, похоже, это довольно четко указывает на то, что должно быть по-другому!

person Woody Zenfell III    schedule 13.04.2010
comment
У меня есть аналогичный случай, когда тип K_COMPILATION_UNIT, но все же resolveBinding() возвращает null. Есть идеи, почему? - person Dana; 06.05.2013
comment
Просто поздний комментарий о том, почему это так: если вы анализируете что-то меньшее, чем единица компиляции, у вас нет операторов импорта, и, следовательно, разрешение привязки, вероятно, не удастся. - person Stephan Herrmann; 21.12.2017