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

バインディングの解決とバインディングの回復という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

OK、それがcompiUnit.ast.resolver.isRecoveringBindings意味することを意味していないか、単に間違っているようです (Java AST API は最も安定したものではありません...)。いずれにせよ、後で Compilation Unit を操作すると、要求されたときに型バインディングを解決することが明らかになりました。

私の疑問を提起した元の問題は、 fetch しようとしたときに NullPointerException が発生したことでしたarg.resolveTypeBinding().getName();。これarg、バインディングがないことを意味します。ただし、その理由は、Java 環境によって作成された元の AST の一部ではなく、 arg = ASTNode.copySubtree(classAst, arg2);.
そのため、代わりに、resolveTypeBinding().getName()onarg2ではなく onを呼び出しましargた。これにより、必要な結果が得られました。

于 2011-01-15T12:54:34.413 に答える