Eclipse 3.1 の ASTParser は,それより前のバージョンとは仕様が異なり,Eclipse プラグインとしてしか動作しない。Eclipse 3.0 のものを利用すれば,問題なく standalone で動く。
Eclipse JDT には,Java のソースコードを構文解析する ASTParser というクラスがあって,これを使えばまぁ簡単に抽象構文木を得ることができたりします:
String source = "public class Foo {}";
ASTParser parser = ASTParser.newParser(AST.JLS3);
parser.setSource(source.toCharArray());
ASTNode ast = parser.createAST(null);
...
ASTParser については dW の記事 EclipseのASTParserを試す などが読みやすいです。さすが中の人。
で本題。なんか Eclipse を 3.1 にアップデートしたら standalone アプリからは利用できなくなっちゃったんですよ。ロードの段階でコケるようで,Eclipse プラグインとして動かさなきゃいけないようです。むむー。
ちょっと困りました。いや,Eclipse プラグインとして動かすこと自体はそれほど抵抗ないんですが(別でプラグインも作ってるし),なにが嫌かって,とにかく遅いんですよ。起動が。
standalone で動かないってことは,普通の JUnit テストが動きません。「JUnit プラグインテスト」を利用することになります。これは,Eclipse プラグインアーキテクチャに沿ってテストを起動するもので,まぁ乱暴な言い方をすればテストを起動するたびに Eclipse を立ち上げ直すようなもので,遅すぎて単体テストを放り投げたくなること請け合いな代物。
なんとかして Eclipse とは独立に動かしたい。とはいっても,3.0 にダウンするわけにはいきません。Eclipse 3.0 は J2SE 5.0 非対応。いまさら Generic の無い糞世界に戻ったら発狂しそうです(ただでさえ Java を使ってるとイライラするのに!)。
‥‥と,ここで気づいてしまいました。解析対象の Java コードは 1.4 相当じゃん。今書いている Java コードは 5.0 だけど,解析対象の Java コードまで 5.0 に対応させなくてもいいじゃん。てことは,JDT ライブラリ用に 3.0 を,IDE 用に 3.1 を用意しておいて,プロジェクトのビルドパスには 3.0 の JDT ライブラリを食わせればいいわけだ。至極単純,なんで今まで気づかなかったんだろうorz
というわけで,解析対象をダウングレードし:
ASTParser parser = ASTParser.newParser(AST.JLS2);
ビルドパスを適当にいじって解決。今度は Eclipse プラグインとして上がらなくなりそうですが,パスを動的にいろいろ弄くれば何とかなりそう。ふう。
ちなみに,Bugzilla のほうにも上がってるようです。3.2 のロードマップには噛んでなさそうだけど。
むー。Nightly 入れたら ASTParser のインターフェース変わってた。ぐぎぎぎ。追っかけるのヤメヤメ。
Eclipse 3.2 で修正されたようです。わーい