2011-01-15 10 views
3

私はAST APIとjavaで作業しており、タイプバインディングを使用してCompilation Unitを作成しようとしています。私はデバッグモードでこのコードを実行するとcompiUnitを検査するとき、私はcompiUnit.ast.resolver.isRecoveringBindingsが偽であることがわかり、残念ながらタイプバインディングを使用したコンパイルユニットの作成

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; 
} 

:私は、次のコードを書きました。
私はそれが指定されているので、それはtrueでない理由を誰も考えることができますか?
ありがとう

答えて

2

バインディングの解決とバインディングの回復の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が作成されているときにパーサー/コンパイラが型バインディングを計算することですが、バインディングの回復はバインディングを部分的に計算できるようにすることです。正直なところ、私はリカバリがどのようなバインディングに役立つのか正確には分かっていませんが、あなたが必要とするものではないことはかなり確信しています。

+0

まず、その情報は、何が起こっているのかをよく理解するために本当に役立ちました。 新しい質問が残っています:リカバリを有効にすると、 'ASTNode.copySubtree(asttree、astnode) 'を使用した結果、' ASTNode'のバインディングを取得できますか? – hizki

+0

私は分かりません。なぜあなたはそれを試してみませんか? :) –

1

これは、compiUnit.ast.resolver.isRecoveringBindingsのいずれかが意味するように意味していないか、または単に間違っているようです(Java AST APIは最も安定したものではありません...)。 いずれにしても、後でコンパイルユニットで作業すると、要求時にタイプバインディングが解決されることが明らかになりました。

私の質問を提起した元の問題は、arg.resolveTypeBinding().getName();をフェッチしようとするとNullPointerExceptionが発生したことでした。このは、は、argには結合がないことを意味します。しかし、その理由は、それがJava環境で作成された元のASTの一部ではなく、arg = ASTNode.copySubtree(classAst, arg2);という結果でした。
代わりにargではなくをarg2と呼んでいました。これは私に欲しい結果をもたらしました。

関連する問題