Hello QuickAssist

ちょっと、はまったのでメモ。

クイックアシストとは?

補完とは違って、変数選択時にCtrl+1とか押すと出てくるやつですね。
ローカル変数/メソッドを抽出したり、あわよくばエラーも直してくれるやつです。

Hello QuickAssistの流れ

  1. plugin.xmlにextentionを追加
  2. IQuickAssistProcessorを実装したクラスを作成する

基本的には上記だけでOK。
注意点としてはIQuickAssistProcessorの実装をしたときにデフォルトコンストラクタを作っておくこと(英語で書いてあったために見落として、結構はまった・・・)

依存するプラグイン

plugin.xml

そのままですね。

<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.4"?>
<plugin>
   <extension
         point="org.eclipse.jdt.ui.quickAssistProcessors">
      <quickAssistProcessor
            class="com.limelabo.ui.MyQuickAssist"
            id="com.limelabo.ui.MyQuickAssist"
            name="com.limelabo.ui.MyQuickAssist">
      </quickAssistProcessor>
   </extension>

</plugin>

ソース

実際に表示するには、IQuickAssistProcessor#getAssists()でIJavaCompletionProposalの配列を返さないといけないので、そのあたりも適当に実装する。
IJavaCompletionProposal#apply()はアシスタントが実行されたときの処理で、まともに実装すると結構大変そうなので、あとで書く(かも)。

package com.limelabo.ui;

import org.eclipse.jdt.ui.text.java.IInvocationContext;
import org.eclipse.jdt.ui.text.java.IJavaCompletionProposal;
import org.eclipse.jdt.ui.text.java.IProblemLocation;
import org.eclipse.jdt.ui.text.java.IQuickAssistProcessor;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.contentassist.IContextInformation;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;

/**
 * 
 */
public class MyQuickAssist implements IQuickAssistProcessor {

	/**
	 * コンストラクタ
	 * (引数なしコンストラクタが無いと生成してくれない)
	 */
	public MyQuickAssist() {
		super();
	}

	public boolean hasAssists(IInvocationContext context) {
		System.out.println("hasAssists");
		return true;
	}

	public IJavaCompletionProposal[] getAssists(IInvocationContext context,
			IProblemLocation[] locations) {
		System.out.println("getAssists");
		IJavaCompletionProposal[] assists = { new HelloCompletionProposal() };
		return assists;
	}

	class HelloCompletionProposal implements IJavaCompletionProposal {

		@Override
		public int getRelevance() {
			// 表示順番0-100(100が一番上に表示される)
			return 100;
		}

		@Override
		public void apply(IDocument document) {
			// 実行時の処理
			System.out.println("apply");
		}

		@Override
		public String getAdditionalProposalInfo() {
			return null;
		}

		@Override
		public IContextInformation getContextInformation() {
			return null;
		}

		@Override
		public String getDisplayString() {
			// 表示ラベル
			return "Hello QuickAssist";
		}

		@Override
		public Image getImage() {
			// アイコン
			return null;
		}

		@Override
		public Point getSelection(IDocument document) {
			return null;
		}
	}
}

実行結果