-Crimsonの謎

Crimsonの謎が完全に解けました。やはりCrimsonでパース時にカラム位置が取れてないための問題はあります。class属性値の異なるcomponentエレメントを一行に並べると、最後のcomponentエレメントの中で補完が走っても、行の一番初めのcomponentをヒットしてしまいます。
しかし、解決の方法も思いつきました。補完のためにほしい親エレメントをCrimsonでもがっちり取れそうです。以下の手順です。

  • エディタからカーソル位置までのテキストを切り出して、パーサーに食わせます。
  • SAXパースですから必ずパースエラーは出るでしょう。
  • しかし、そのエラー直前まではきちんとパースしてくれます。SAXパースですから。
  • Kijimunaのパーサーは開発環境ですから、すでにXMLパースエラーが出ること前提のつくりになってます。エラーが出ても、そのパース結果を返してくれます。
  • ここで、パーサーをちょっといじって、エラー発生時のエレメントスタックの一番上を取得できるようにしておきます。
  • そいつは、まさに親エレメントなのです。

あとの問題は、パースを、モデル構築までやるか、シンプルなDOMを構築するかです。モデル構築までやらないとコンポーネントのルックアップを必要とするOGNL式の補完はできないので、Outlineを表示するのと同じパースをすることにします。
追記
できた〜!CVSへcommit。