スタンドアロンでJDTのASTを使う
JDTのASTをスタンドアロンで使いたい場合は、
Eclipseのプラグインが格納されているフォルダにある、
以下のjarを拾ってきてクラスパスを通せば使える
(アスタリスク(*)の部分は、実際にはバージョン番号とかになってる)。 Mavenのセントラルリポジトリにも登録されてるので、そこから拾うのが簡単かな。 pom.xmlはこんな感じ。 以下、ソースの断片を説明。 解析時に使用されるコンパイラオプションを引数に指定している。
注意点として、 あと、 返却された 引数に ソースファイルの中身を丸っと取得するコード。 (2017/1/10 追記) もっと詳しい情報があった。。。
qiita.com必要なライブラリ
<dependencies>
<dependency>
<groupId>org.eclipse.core</groupId>
<artifactId>org.eclipse.core.contenttype</artifactId>
<version>3.4.100.v20100505-1235</version>
</dependency>
<dependency>
<groupId>org.eclipse.core</groupId>
<artifactId>org.eclipse.core.jobs</artifactId>
<version>3.5.100</version>
</dependency>
<dependency>
<groupId>org.eclipse.birt.runtime</groupId>
<artifactId>org.eclipse.core.resources</artifactId>
<version>3.10.0.v20150423-0755</version>
</dependency>
<dependency>
<groupId>org.eclipse.core</groupId>
<artifactId>org.eclipse.core.runtime</artifactId>
<version>3.7.0</version>
</dependency>
<dependency>
<groupId>org.eclipse.equinox</groupId>
<artifactId>org.eclipse.equinox.common</artifactId>
<version>3.6.0.v20100503</version>
</dependency>
<dependency>
<groupId>org.eclipse.equinox</groupId>
<artifactId>org.eclipse.equinox.preferences</artifactId>
<version>3.4.1</version>
</dependency>
<dependency>
<groupId>org.eclipse.jdt</groupId>
<artifactId>org.eclipse.jdt.core</artifactId>
<version>3.10.0</version>
</dependency>
<dependency>
<groupId>org.eclipse</groupId>
<artifactId>org.eclipse.osgi</artifactId>
<version>3.8.0.v20120529-1548</version>
</dependency>
</dependencies>
基本的な使い方
ASTParser#createAST
を使ってASTを作成。
返却されたASTNode
のaccept
メソッドにASTVisitor
を継承した自作クラスの
インスタンスを引き渡してツリーを走査する(Visitorパターン)。 String source = ...; // 解析するJavaソースの文字列
ASTParser parser = ASTParser.newParser( AST.JLS8 );
Map<?, ?> options = JavaCore.getOptions();
JavaCore.setComplianceOptions( JavaCore.VERSION_1_8, options );
parser.setCompilerOptions( options );
parser.setSource( source.toCharArray() );
ASTNode ast = parser.createAST( null );
ast.accept( new ASTVisitor() { ... } );
ASTParser#newParser
ASTParser parser = ASTParser.newParser( AST.JLS8 );
ASTParser
のインスタンスを作成するときにJavaのAPIレベルを指定しないといけないんだけど、
AST.JLS8
が全バージョンに対応してるので、 固定でAST.JLS8
を指定すればOK。
というか他が全部deprecatedになってるので選択の余地はない。ASTParser#setCompilerOptions
Map<?, ?> options = JavaCore.getOptions();
JavaCore.setComplianceOptions( JavaCore.VERSION_1_8, options );
parser.setCompilerOptions( options );
ASTParser#setSource(char[])
を使って1.5以降のソースを解析する場合、
このメソッドを使って適切なコンパイラオプションを指定する必要がある。ASTParser#setSource
にIClassFile
およびICompilationUnit
を引き渡した場合、
設定したコンパイラオプションがリセットされるらしい。options
の中身を見るとソースのフォーマットに関するオプションも入ってた。
ASTでソースを改変することがあったら、細かく調べてみようかな。ASTParser#createAST
parser.setSource( source.toCharArray() );
ASTNode ast = parser.createAST( null );
ASTParser#setSource
で設定したソースを解析してASTを構築して返却してくれる。
あとは、返却されたASTNode
のインスタンスから各ノードを辿って自分の欲しい情報を
取得する。ASTNode
はデフォルトだとCompilationUnit
のインスタンスみたい。
ASTParser#setKind
で変えることができるようだけど、必要になったときに調べる。IProgressMonitor
のインスタンスを渡せば、解析の進捗状況を確認したり、
途中でキャンセルできるみたい。必要ない場合はnull
でOK。おまけ
String source = new String(
Files.readAllBytes( Paths.get( "Hoge.java" ) ), "utf-8" );
参考