2012-12-10 14 views
16

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

JCodeModelでは、JBlock#directStatement(String s) methodを使用します。

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

+2

ASTの操作では、構文上有効なツリーが必要です。メソッドのコードが不正な場合は、一般的には、挿入する有効なツリーを持たず、それを行うこともできません。そうしないと、無意味なツリーしか取得できません。結果。 –

+0

OK、JST/ASTは正しいツールではないようです... – Morrandir

+0

なぜ無効なコードを挿入する必要がありますか? –

答えて

9

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

重要なのは、適切な場所にatを挿入した有効なプログラムテキストのテキストを生成することです。 ASTをテキストとして印刷するロジックが必要です。あなたがする必要があるのは、ASTをテキストとして印刷し、そのプロセスの途中で、必要な正確な位置にキャッチして、任意のテキストを挿入することです。

私たちのDMSソフトウェアリエンジニアリングツールキットは、このような事態を可能にするために、プリテプリタにプリントノードフックを入力/終了しています。

JDT/ASTにこのようなことが存在しない場合は、その前置記号を修正してそのフックを与えることができます。あるいは、標準セットの一部ではなく、任意のテキストを保持するだけでメソッド・ノードのように動作する別のツリー・ノード型を追加することで、JDT/ASTを変更することもできます。おそらく各ノードは印刷されるものを制御するでしょう。そのツリーノードのprettyprintingを定義して、テキストを出力させることができます。

最終的には本当にハックな解決策です。完全な有効なASTを任意のテキストに挿入します。一意の名前(例:ZZZ)の偽の識別子が含まれています。 ASTを文字列に出力し、その文字列を後処理して、一意の名前を含む偽のツリーを実際のユーザーテキストに置き換えます。

+0

ありがとう!:-) – Morrandir

3

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

コンパイル単位のコンパイルの問題が発生する可能性があります(CompilationUnit.getProblems()参照)。

modify Java code using JDTにはいくつかの方法があります。私はメソッドの本体を変更するためのASTRewrite APIを検討することをお勧めします。

+0

これまでにAPIリファレンスを確認しましたが、任意のコードスニペットを追加する方法が見つかりませんでした。コードスニペットに構文上無効なコードが含まれている可能性があると考えてください。 (私は元の質問にこれを追加しました...) – Morrandir

+0

任意のコードスニペットを解析できます。次に、結果のASTノードをメソッド本体のASTノードに挿入します。 Eclipseパーサーは、構文エラーをある程度許容します。 – reprogrammer

+0

「ある程度まで」は不幸にも十分ではありません。 : – Morrandir

関連する問題