使用类型绑定创建编译单元

时间:2011-01-15 01:51:05

标签: java eclipse-plugin abstract-syntax-tree eclipse-jdt

我正在使用java中的AST API,我正在尝试使用类型绑定创建Compilation Unit。我写了以下代码:

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的原因,正如我指定的那样吗? 谢谢

2 个答案:

答案 0 :(得分:2)

您正在混合两个API:绑定解析和绑定恢复。来自setBindingsRecovery的JavaDoc:

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 :(得分:1)

好吧,似乎compiUnit.ast.resolver.isRecoveringBindings或者它们意味着什么意思,或者它只是不正确(java AST API不是最稳定的......)。 无论哪种方式,稍后使用编译单元显示它确实在被要求时解析了类型绑定。

提出问题的原始问题是我在尝试获取arg.resolveTypeBinding().getName();时遇到了NullPointerException。 确实意味着arg没有绑定。但是,原因是它不是java环境创建的原始AST的一部分,而是arg = ASTNode.copySubtree(classAst, arg2);的结果。 相反,我在resolveTypeBinding().getName()而不是arg2上拨打了arg,这给了我想要的结果。