xtext で Syntax Coloring の実装

DSLのエディタプラグインで欲しい機能の1つと言うことで、
キーワード文字列のカラー設定(Syntax Coloring:シンタックス、カラーリング)について書きます。
xtextのサイトのドキュメントを見てもなかなか難しかった…

ポイントは、binding

xtest内部では、GoogleのInjectとかを使って、各モジュールの依存関係をInjectしつつ動いてる様で…ハイライト用のクラスとか用意した時に、どうやって関連つければいいんだろう?って思ったら bind でした。

元々Injectしてるから、後からユーザが作った機能でInjectすれば、モジュールの変更が容易ってことですね。
全然使ったこと無かったから理解するのに苦労した(汗
でも、これ便利だねぇ~。

実際に行ったのは、3つのクラスの作成と、それをbindするためのメソッドをUIモジュールに追加したのみ。

作成する3つのクラスは、xtextのサイトの通りで、以下の3つ。

  • ハイライトの設定項目を決めるクラス(IHighlightingConfigurationの実装)
  • 設定ページの「項目ID」と「項目名」と「デフォルトカラー」の組み合わせを設定する。

  • 意味を元にハイライトを行うためのクラス(ISemanticHighlightingCalculatorの実装)
  • キーワードでは設定できない意味を元にしたカラーを抽出するクラスで、テキストの何処から何処までが、どの様な意味なのか抽出する。
    具体的には、何処から何処までが、どのカラー設定の「項目ID」となるか設定。このクラスは必要なければ作らなくてもOKだと思う。

  • キーワードを抽出するためのAntlrトークンのマッピング用クラス(AbstractAntlrTokenToAttributeIdMapperの派生)
  • どのキーワードがどのカラー設定の「項目ID」になるかのマッピングを行うクラスで、xtextで生成されたantlrのparserを元にキーワードを抽出する。

で、作ったクラスをどうやってエディタと関連付けるか?がbind。

xtextでコードを生成すると、uiのプロジェクトに MyDSLUiModule.java (MyDSL部分はDSL毎にさまざま)みたいなクラスがあって、ここにクラスを設定する。

EventDSLUiModule.java

public Class<? extends IHighlightingConfiguration>
    bindIHighlightingConfiguration() {
    return EventDSLHighlightingConfiguration.class;
}

こんな感じに、”bind” で始まるメソッドで、関連付けるクラスを返すと、それをインスタンス化して使ってくれる。

カテゴリー: RPGMKDT, イベントエディタ タグ: , パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です