DSLのエディタプラグインで欲しい機能の1つと言うことで、
キーワード文字列のカラー設定(Syntax Coloring:シンタックス、カラーリング)について書きます。
xtextのサイトのドキュメントを見てもなかなか難しかった…
ポイントは、binding
xtest内部では、GoogleのInjectとかを使って、各モジュールの依存関係をInjectしつつ動いてる様で…ハイライト用のクラスとか用意した時に、どうやって関連つければいいんだろう?って思ったら bind でした。
元々Injectしてるから、後からユーザが作った機能でInjectすれば、モジュールの変更が容易ってことですね。
全然使ったこと無かったから理解するのに苦労した(汗
でも、これ便利だねぇ~。
実際に行ったのは、3つのクラスの作成と、それをbindするためのメソッドをUIモジュールに追加したのみ。
作成する3つのクラスは、xtextのサイトの通りで、以下の3つ。
- ハイライトの設定項目を決めるクラス(IHighlightingConfigurationの実装)
- 意味を元にハイライトを行うためのクラス(ISemanticHighlightingCalculatorの実装)
- キーワードを抽出するためのAntlrトークンのマッピング用クラス(AbstractAntlrTokenToAttributeIdMapperの派生)
設定ページの「項目ID」と「項目名」と「デフォルトカラー」の組み合わせを設定する。
キーワードでは設定できない意味を元にしたカラーを抽出するクラスで、テキストの何処から何処までが、どの様な意味なのか抽出する。
具体的には、何処から何処までが、どのカラー設定の「項目ID」となるか設定。このクラスは必要なければ作らなくてもOKだと思う。
どのキーワードがどのカラー設定の「項目ID」になるかのマッピングを行うクラスで、xtextで生成されたantlrのparserを元にキーワードを抽出する。
で、作ったクラスをどうやってエディタと関連付けるか?がbind。
xtextでコードを生成すると、uiのプロジェクトに MyDSLUiModule.java (MyDSL部分はDSL毎にさまざま)みたいなクラスがあって、ここにクラスを設定する。
public Class<? extends IHighlightingConfiguration>
bindIHighlightingConfiguration() {
return EventDSLHighlightingConfiguration.class;
}
こんな感じに、”bind” で始まるメソッドで、関連付けるクラスを返すと、それをインスタンス化して使ってくれる。