マーカーレゾリューション
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メソッド内に,マーカーを解決するための処理を記述する(解決しなくてもいいけど)。
このマーカーレゾリューションという機構は,マーカーが持つ属性の値をうまく利用することが求められるだろう。
| 固定リンク
この記事へのコメントは終了しました。
コメント