« 文字列の移動,コピーを行うテキスト編集クラス | トップページ | テキストエディタ上のカーソル位置の取得方法 »

2004.08.24

エディタからICompilationUnitオブジェクトを取得する方法

JDTに付属されているJavaのソースコードを編集するためのエディタに対して機能拡張を行う際に,そのエディタで編集されているソースコードのJavaモデル表現であるICompilationUnitオブジェクトを取得したいことが多々ある。今回は,エディタからこのICompilationUnitオブジェクトを取得するための方法を紹介する。

エディタからICompilationUnitオブジェクトを得る方法は2つ存在する。

(1) ファイルリソースからICompilationUnitオブジェクトを生成する
(2) エディタ入力に実装されているIAdaptableインタフェースを利用する

まずは(1)から紹介する。これは,JDTで提供されているJavaCoreクラスのcreateCompilationUnitFromメソッドを利用する方法である。

  IEditorPart editorPart = ...;

  IFileEditorInput fileEditorInput = (IFileEditorInput)editorPart.getEditorInput();
  IFile file = fileEditorInput.getFile();
  ICompilationUnit iCompilationUnit = JavaCore.createCompilationUnitFrom(file);

最初に,エディタを表すIEditorPartオブジェクトのgetEditorInputメソッドを呼び出して,IEditorInputオブジェクトを取得する。そして,取得したIEditorInputオブジェクトをIFileEditorInput型でキャストする。もちろん本来はキャストできるかどうかチェックする必要があるが,上記では省略している。そしてIFileEditorInputオブジェクトのgetFileメソッドを呼び出して,IFileオブジェクトを取得する。あとは,JavaCoreクラスのクラスメソッドであるcreateCompilationUnitFromメソッドにIFileオブジェクトを渡すことで,ICompilationUnitオブジェクトを得ることができる。

次の(2)の方法は,知っていないと思いもつかない方法である。

  IEditorPart editorPart = ...;

  IEditorInput editorInput = editorPart.getEditorInput();
  ICompilationUnit iCompilationUnit =
    (ICompilationUnit)editorInput.getAdapter(IJavaElement.class);

まず,IEditorPartオブジェクトからIEditorInputオブジェクトを取得する。そして,IEditorInputオブジェクトのgetAdapterメソッドにJavaモデルの要素であることを示すIJavaElementインタフェースのクラスオブジェクトを渡すことで,エディタで開いているソースコードのJavaモデル表現であるICompilationUnitオブジェクトが得られる。

実際にソースコードを追ったわけではないのだが,たぶんJavaエディタでソースコードのファイルが開かれる際に,そのIEditorInputオブジェクトとICompilationUnitオブジェクトをAdapterManagerオブジェクトに登録しているのではないかと思われる。

どちらの方法を使っても得られる結果は同じなので,自由に選択してかまわない。ただ,(1)の方法だとIFileEditorInput型にダウンキャストしている点が,(2)の方法に比べてちょっと問題ありかな,という気がする。

|

« 文字列の移動,コピーを行うテキスト編集クラス | トップページ | テキストエディタ上のカーソル位置の取得方法 »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/12631/1268138

この記事へのトラックバック一覧です: エディタからICompilationUnitオブジェクトを取得する方法:

« 文字列の移動,コピーを行うテキスト編集クラス | トップページ | テキストエディタ上のカーソル位置の取得方法 »