17

JDT/AST で Java ソース コードを生成しようとしています。MethodDeclarationができたので、コード スニペット (別のソースから) をメソッド本体に追加したいと考えています。コード スニペットには、構文的に無効なコードであっても、任意の Java コードを含めることができます。私はこれを行う方法を見つけることができません。

JCodeModel では、JBlock#directStatement(String s) メソッドを使用します。

JDT/AST でこれを行う方法はありますか?

4

3 に答える 3

9

アプリケーションの残りの部分には整形式のツリーがあり、整形式でないテキストを特定の場所に挿入したい場合、標準のツリー ノード挿入メカニズムではほとんど実行できません。

重要なのは、適切な場所にフラグメントを挿入して、有効なプログラム テキストのテキストを生成することです。AST をテキストとして出力するロジックがどこかにあるはずです。あなたがする必要があるのは、AST をテキストとして出力するように要求し、そのプロセスの途中で必要な正確なポイントでそれをキャッチして、任意のテキストを挿入することです。

DMS Software Reengineering Toolkit には、この種のことを可能にするために、prettyprinter に印刷ノードの開始/終了フックがあります。

そのようなものが JDT/AST に存在しない場合は、prettyprinter を変更してそのフックを与えることができます。または、標準セットの一部ではなく、単に任意のテキストを保持するがメソッド ノードのように機能する別のツリー ノード タイプを追加して、JDT/AST を変更することを検討することもできます。おそらく、各ノードが何を出力するかを制御します。次に、そのツリー ノードの prettyprinting を定義して、そのテキストを出力させることができます。

最後の非常にハックな解決策: 任意のテキストが移動する場所に完全に有効な AST を挿入し、一意の名前 (ZZZ など) を持つ偽の識別子をどこかに含めます。次に、AST を文字列に出力し、文字列を後処理して、一意の名前を含む偽のツリーを実際のユーザー テキストに置き換えます。

于 2012-12-16T06:46:33.730 に答える
3

まず、コード スニペットを解析して AST にする必要があります。ASTParserこの目的で API を使用できます。

コンパイル単位のコンパイル問題を取得することができます (「参考文献」を参照CompilationUnit.getProblems())。

JDT を使用して Java コードを変更するには、いくつかの方法があります。ASTRewriteメソッドの本体を変更するための API を検討することをお勧めします。

于 2012-12-12T19:19:10.983 に答える