« マーカーのアイコン | トップページ | APIリファレンスの抜き出し方法 »

2004.03.04

マーカーレゾリューション

Eclipseの便利な機能に,Quick Fixがある。例えば,例外をcatchしなくちゃいけないのにそれをしなかった場合,コンパイルエラーの箇所で Ctrl + 1 キーを押すと「Add throws declaration」「Surround with try/catch」というポップアップメニューが表示され,「Surround with try/catch」を選べば自動的にtry-catchで括ってくれる,というのがQuick Fix機能である。

あるマーカー(特に何らかの問題を示すマーカー)に対して,マーカーを解決する(マーカーの原因となったコンパイルエラー箇所を自動修正してマーカーを削除できる状態にする,など)ための処理を自作し,何らかのマーカーに関連付けることができる。この,マーカーを解決するためのオブジェクトのことをマーカーレゾリューションと呼ぶ。マーカーレゾリューションは,Quick Fixの実装ということができる。

マーカーレゾリューションは,org.eclipse.ui.markerResolution拡張ポイントを利用して定義する

  <extension point="org.eclipse.ui.markerResolution">
    <markerResolutionGenerator
      markerType="yoichiro.myplugin.mymarker"
      class="yoichiro.MyMarkerResolutionGenerator">
      <attribute name="myattribute" value="myvalue"/>
    </markerResolution>
  </extension>

org.eclipse.ui.markerResolution拡張ポイントでは,マーカーレゾリューションの定義をmarkerResolutionGenerator要素を使って記述する。「なんでmarkerResolution要素じゃないの?」という疑問が沸くが,それは後述。

markerType属性で,対象マーカーのIDを記述する。そしてclass属性でマーカーレゾリューションの生成処理を持つクラスを指定する。

マーカーはそれぞれ属性(IMarker.LOCATIONなど)を持っているが,attribute要素を使うことによって,マーカーレゾリューションが有効になるための属性値を定義することができる。上記では,myattribute属性の値としてmyvalueを持つマーカーのみ有効,という指定を行っている。

さて,マーカーの解決方法は1つとは限らない。冒頭で紹介した「例外処理どうすんだエラー」では,「Add throws declaration」「Surround with try/catch」という2つの解決方法が存在した。つまり,なんでmarkerResolutionGeneratorという名前なのかというと,上記のclass属性で指定しているクラスは,あるマーカーに対する複数の解決処理を生成して返す処理を担当しているから,である。

class属性で指定するクラスは,IMarkerResolutionGeneratorインタフェースの実装クラスとして作成する。

  public class MyMarkerResolutionGenerator
      implements IMarkerResolutionGenerator {
    public IMarkerResolution[] getResolutions(IMarker marker) {
      IMarkerResolution resolution = new IMarkerResolution() {
        public String getLabel() {
          return "My resolution";
        }
        public void run(IMarker marker) {
          // 解決処理
        }
      };
      return new IMarkerResolution[]{resolution};
    }
  }

IMarkerResolutionGeneratorインタフェースの実装クラスでは,getResolutionsメソッドを実装しなければならない。getResolutionsメソッドの結果として,IMarkerResolutionインタフェースのオブジェクトの配列を返す。マーカーの解決処理は,IMarkerResolutionインタフェースの実装クラスとして作成する。つまり,マーカーの解決方法が複数ある場合は,それぞれIMarkerResolutionインタフェースの実装クラスとして作成し,それらのインスタンスの配列をgetResolutionsメソッドの戻りとして返す。上記ではIMarkerResolutionインタフェースの実装クラスを匿名クラスとして作成し,それを返却している。

IMarkerResolutionインタフェースの実装クラスでは,2つのメソッドを実装する必要がある。getLabelメソッドでは,マーカーレゾリューションを説明するための短い文字列(「Surround with try/catch」など)を返す。これが Ctrl + 1 キー押下時やQuick Fixメニュー選択時に表示されるポップアップメニューの選択肢の文字列になる。そして,その選択肢を選択した際に呼び出されるメソッドがrunメソッドである。runメソッド内に,マーカーを解決するための処理を記述する(解決しなくてもいいけど)。

このマーカーレゾリューションという機構は,マーカーが持つ属性の値をうまく利用することが求められるだろう。

|

« マーカーのアイコン | トップページ | APIリファレンスの抜き出し方法 »

コメント

コメントを書く



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




トラックバック

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

この記事へのトラックバック一覧です: マーカーレゾリューション:

« マーカーのアイコン | トップページ | APIリファレンスの抜き出し方法 »