3

我正在使用 java 中的AST API,并且正在尝试创建一个具有类型绑定的编译单元。我写了以下代码:

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是错误的。
谁能想到它不会true像我指定的那样的原因?
谢谢

4

2 回答 2

2

您正在混淆 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 时计算类型绑定,而绑定恢复是关于使绑定能够被部分计算。老实说,我不确定绑定恢复有什么帮助,但我相当肯定这不是您需要的东西。

于 2011-01-18T16:24:39.477 回答
1

好的,看起来要么compiUnit.ast.resolver.isRecoveringBindings并不意味着它似乎意味着什么,要么就是不正确(Java AST API 不是最稳定的......)。无论哪种方式,稍后与编译单元一起工作表明它确实在被要求时解析了类型绑定。

提出我的问题的最初问题是我在尝试 fetch 时遇到了 NullPointerException arg.resolveTypeBinding().getName();。这确实意味着arg没有绑定。但是,这样做的原因是它不是由 java 环境创建的原始 AST 的一部分,而是 arg = ASTNode.copySubtree(classAst, arg2);.
所以相反,我打电话而不是 on resolveTypeBinding().getName(),这给了我想要的结果。arg2arg

于 2011-01-15T12:54:34.413 回答