4

現在、Eclipse AST を使用してソース コードを生成しています。ほとんどの例を除いて、Eclipse プラグインとは対照的に、ソース コードを最初からスタンドアロン アプリケーションで生成しています。

ASTParser から読み込むと、 を呼び出して変更を有効にすることができますがrecordModifications()、AST がゼロから作成された場合 (たとえば、 を呼び出して) は機能しませんnewCompilationUnit()

したがって、Documentandを介してソースをファイルに書き込むTextEditことはできません。変更の記録が有効になっていないという例外があります。
AST をゼロから生成してファイルに書き込む経験はありますか? ありがとう!

4

5 に答える 5

2

次のように、最初にファイルを作成してから、そこから AST を生成してみませんか。

ICompilationUnit unit = JavaCore.createCompilationUnitFrom(file);
ASTParser parser = ASTParser.newParser(AST.JLS3);
parser.setKind(ASTParser.K_COMPILATION_UNIT);
parser.setResolveBindings(true);
parser.setSource(unit);
// Parse the source code and generate an AST.
CompilationUnit ast = (CompilationUnit) parser.createAST(null);

ファイルが新しく作成されて空白の場合、おそらく AST は空になります。その後、astオブジェクトのルートを置き換えてファイルに書き込むことができます。また、Eclipse に縛られていない場合は、JSR199 標準を使用して同じことを行い、その AST を通常の方法でファイルに書き込むことができます。紹介はこちらをご覧ください。

于 2012-04-21T21:52:06.070 に答える
1

ご提案ありがとうございます。その間、AST の文字列表現を作成する内部クラス「ASTFlattener」を介してソース コードを発行する方法を見つけました。これは私にとってはかなりうまくいきます....

于 2012-04-23T19:41:04.423 に答える
1

私はちょうど同じ質問に対する答えを見つけようとしてきました。上記の回答に基づいて、これまでに見つけた最もエレガントなソリューションは次のようになります。

ASTParser parser = ASTParser.newParser(AST.JLS4);
parser.setCompilerOptions(....);

Document document = new Document("");
parser.setSource(document.get().toCharArray());
CompilationUnit unit = (CompilationUnit)parser.createAST(null);
unit.recordModifications();

TextEdit edits = unit.rewrite(document, null);
edits.apply(document);

// now write document.get() to file
于 2013-07-15T11:40:50.797 に答える
0

ソースを最初から生成する場合は、解析可能な最小限のソースを一時ファイルに書き込み、変更をAstに適用してから、それ以外の場合と同じようにテキスト編集としてそのファイルに書き戻すことができます。次に、ソースを読みます。その後、これを好きな場所に転送できます。

おそらくもっと洗練された解決策がありますが、これはうまくいくかもしれません。

于 2012-04-21T19:37:34.087 に答える
0

ASTからコンパイルユニットを作成した後、私はやっています:

AST ast = AST.newAST(AST.JLS4);    
CompilationUnit unit = ast.newCompilationUnit();

... Compilation Unit を埋めてから ...

package.createCompilationUnit(className + ".java", unit.toString(), true, null);

ここで:
package= IPackageFragment
className= String(生成されたクラス名)
unit=> CompilationUnitast
true=> 強制置換
null=> 進捗モニター

于 2013-06-12T14:12:14.877 に答える