Eclipseのプラグイン開発のドキュメントクラスについて。
		
  | 
		
org.eclipse.jface.text.IDocumentは、TextEditorでテキストを保持するクラス(インターフェース)。
代表的な具象クラスはorg.eclipse.jface.text.Document。
ITextEditorからIDocumentを取得する方法。[2013-11-27]
import org.eclipse.jface.text.IDocument; import org.eclipse.ui.texteditor.IDocumentProvider; import org.eclipse.ui.texteditor.ITextEditor;
ITextEditor editor = 〜; IDocumentProvider provider = editor.getDocumentProvider(); IDocument document = provider.getDocument(editor.getEditorInput());
TextEditorに関連して色を付けたりフォールディングやアウトラインの表示範囲を決定したりするのにIDocumentを使う。
その際にパーサーを使ってIDocumentからテキストを読み込んで構文解析を行うが、解析結果は使い回せるので、共通の場所に保持しておきたい。
IDocumentは全ての場所に渡されるので、IDocumentに保持しておくのが都合がいい。
という訳で、独自のIDocumentクラスを作ってみる。
import org.eclipse.jface.text.Document;
public class MyDocument extends Document {
	private ParseResult ast;
	public void setParseResult(ParseResult ast) {
		this.ast = ast;
	}
	public ParseResult getParseResult() {
		return ast;
	}
}
ドキュメントクラスのインスタンス化はDocumentProviderで行う。
import org.eclipse.ui.editors.text.FileDocumentProvider;
public class MyDocumentProvider extends FileDocumentProvider {
	@Override
	protected IDocument createEmptyDocument() {
		return new MyDocument();
	}
}
import org.eclipse.ui.editors.text.TextEditor;
public class MyEditor extends TextEditor {
	/**
	 * コンストラクター.
	 */
	public MyEditor() {
		setDocumentProvider(new MyDocumentProvider());
〜
	}
パース結果の保持を行う場所は、パース(構文解析)を行う場所が相応しい。
ドキュメントに変更があると登録したパーティションスキャナーが呼ばれるので、そのメソッドで構文解析してドキュメントに保持すれば良さそう。
import org.eclipse.jface.text.rules.IPartitionTokenScanner;
public class MyPartitionScanner implements IPartitionTokenScanner {
	@Override
	public void setPartialRange(IDocument document, int offset, int length, String contentType, int partitionOffset) {
		MyDocument doc = (MyDocument) document;
		MyParser parser = new MyParser();
		ParseResult ast = parser.parse(doc);
		doc.setParserResult(ast);
〜
	}
}