Eclipse/プラグイン開発のTIPS集/ソースコードを解析するパーサASTParserでもちょっとやりましたが、パッケージ・エクスプローラからSelection経由でICompilationUnit?*1を取得することができました。その Javaソースは、何とかっていう名前のJavaプロジェクトに属しているわけですが、Javaプロジェクト自体を操作するインタフェースもEclipseに用意されています。Javaプロジェクトを作成したり、削除したり、ソースを生成したりすることができるわけですね。以下にJavaプロジェクトを操作する方法をまとめておきます。
パッケージ・エクスプローラを見てもわかるとおり、Javaプロジェクトはツリー構造になってるわけで、よくあるコンポジットパタンになってます。コンポジットな要素たち全部が拡張しているルートのインタフェースがorg.eclipse.jdt.core.IJavaElementです。
全ての要素が拡張しているインタフェースですね。定数を見るとわかるのですが、要素は
int JAVA_MODEL = 1; int JAVA_PROJECT = 2; int PACKAGE_FRAGMENT_ROOT = 3; int PACKAGE_FRAGMENT = 4; int COMPILATION_UNIT = 5; int CLASS_FILE = 6; int TYPE = 7; int FIELD = 8; int METHOD = 9; int INITIALIZER = 10; int PACKAGE_DECLARATION = 11; int IMPORT_CONTAINER = 12; int IMPORT_DECLARATION = 13; int LOCAL_VARIABLE = 14; int TYPE_PARAMETER = 15;
くらい種類があるようです。
ワークスペース内のJavaモデル(?)のルートです。IJavaElement?#getJavaModel?()で取得することができます。んがいまいちパッケージ・エクスプローラ上の概念でどこを指してるのかわからないですね。ただ
IJavaProject[] getJavaProjects(); IJavaProject getJavaProject(String name); IWorkspace getWorkspace();
などのメソッドを持っているようです。
Javaプロジェクトです。 IJavaElement?#getJavaProject?() で取得することができます。よってコンポジットのどの要素からもJavaプロジェクトへの参照が得られるわけです。
Javaプロジェクト内のパッケージ階層のトップ要素です。ソースディレクトリやjarファイルなどに対応します。
たとえば
IPackageFragmentRoot root = null; try { IJavaProject javaProject = element.getJavaProject(); IPackageFragmentRoot[] roots = javaProject .getPackageFragmentRoots(); for (IPackageFragmentRoot rootTmp : roots) { if (rootTmp.getKind() == IPackageFragmentRoot.K_SOURCE) { root = rootTmp; ↑ソースディレクトリだったら } } } catch (JavaModelException e) { e.printStackTrace(); }
などとしてソースディレクトリを取得することができます。
他にも以下のやり方でソースディレクトリが取得できそうです。他にもいろいろメソッドを実行して試してみました。
上のようなディレクトリ構成で、いろいろなメソッドを実行しました。
System.out.println("Path: " + element.getPath()); System.out.println("Parent: " + element.getParent().getPath()); System.out.println("PrimaryElement: " + element.getPrimaryElement().getPath()); System.out.println("Primary: " + element.getPrimary().getPath()); IJavaElement ancestor = element .getAncestor(IJavaElement.PACKAGE_FRAGMENT_ROOT); System.out.println("Ancestor: " + ancestor.getPath());
elementはキャプチャ内のBL.javaを指しているICompilationUnit?のインスタンスです。
実行結果は以下の通り:
Path: /HogeProject/src/nu/mine/kino/BL.java Parent: /HogeProject/src/nu/mine/kino PrimaryElement: /HogeProject/src/nu/mine/kino/BL.java Primary: /HogeProject/src/nu/mine/kino/BL.java Ancestor: /HogeProject/src
IJavaElement?#getAncestor(int ancestorType) メソッドで、要素の型(JAVA_PROJECTとかPACKAGE_FRAGMENT_ROOTとか)を指定して上位ディレクトリのIJavaElement?を取得することができます。上の例では
IJavaElement ancestor = element.getAncestor(IJavaElement.PACKAGE_FRAGMENT_ROOT);
として、BL.javaが入っているディレクトリのトップ階層つまりsrcディレクトリへの参照を取得しています。*2
他のメソッドについてですが IJavaElement?#getParent() については真上のディレクトリですね。他のヤツは、、んー全部BL.javaなんですよね。一応、JavaDocへのリンクを載せておきます。。
この記事は
現在のアクセス:402