Создание модуля компиляции с привязками типов - PullRequest
3 голосов
/ 15 января 2011

Я работаю с AST API в java и пытаюсь создать модуль компиляции с привязками типов. Я написал следующий код:

private static CompilationUnit parse(ICompilationUnit unit) {
 ASTParser parser = ASTParser.newParser(AST.JLS3);
 parser.setKind(ASTParser.K_COMPILATION_UNIT);
 parser.setSource(unit);
 parser.setResolveBindings(true);
 CompilationUnit compiUnit = (CompilationUnit) parser.createAST(null);
 return compiUnit;
}

К сожалению, когда я запускаю этот код в режиме отладки и проверяю compiUnit, я обнаруживаю, что compiUnit.ast.resolver.isRecoveringBindings имеет значение false.
Может кто-нибудь придумать причину, по которой это не будет true, как я указал?
Спасибо

Ответы [ 2 ]

2 голосов
/ 18 января 2011

Вы смешиваете две части API: разрешение привязки и восстановление привязки.Из JavaDoc для setBindingsRecovery:

void org.eclipse.jdt.core.dom.ASTParser.setBindingsRecovery(boolean enabled)

Requests that the compiler should perform bindings recovery. When bindings recovery is enabled the compiler returns incomplete bindings.

Default to false.

This should be set to true only if bindings are resolved. It has no effect if there is no binding resolution.

Parameters:
enabled true if incomplete bindings are expected, and false if only complete bindings are expected.

Итак, да.Ожидается, что для восстановления привязок установлено значение false, поскольку это значение по умолчанию.Однако, поскольку вы явно устанавливаете привязки для разрешения, для объекта AST это должно быть установлено в true.Вы должны проверить метод AST.hasBindingsResolved(), чтобы увидеть, можете ли вы получить свои привязки.

Чтобы быть ясным: разрешение привязок заключается в том, чтобы парсер / компилятор вычислял привязки типов при создании AST во время восстановления привязоко включении привязок для частичного вычисления.Честно говоря, я не совсем уверен, с чем помогает восстановление привязок, но я совершенно уверен, что это не то, что вам нужно.

1 голос
/ 15 января 2011

Хорошо, похоже, что либо compiUnit.ast.resolver.isRecoveringBindings не означает, что это означает, либо оно просто неверно (API Java AST не самый стабильный ...). В любом случае, работа с модулем компиляции позже показала, что он разрешает привязку типов по запросу.

Первоначальная проблема, которая подняла мой вопрос, заключалась в том, что я получил исключение NullPointerException при попытке получить arg.resolveTypeBinding().getName();. Это означает , что arg не имеет привязок. Однако, причина этого состояла в том, что это не было частью оригинального AST, созданного средой Java, а результатом arg = ASTNode.copySubtree(classAst, arg2);.
Поэтому вместо этого я позвонил resolveTypeBinding().getName() на arg2, а не на arg, что дало мне желаемый результат.

...