Rubyコード補完進捗報告2

前回からもう少し進めてみました。

前回と比べて内部的な改良はあまり進んでいませんが、標準クラスのFileとStringの補完情報を定義したことにより、上のスクリーンショットのように(超部分的に)かなり良い精度で補完できるようになってきました。

動画を撮るのが面倒なので言葉で説明すると、上の例で補完が実行できる場所は次のようになっています。

1. File.の直後。ここではFileのクラスメソッドの補完ができます。もちろんopenはその中の候補です。
2. file.の直後。File.openはFileオブジェクトをyieldするので、自ずとfileはFileオブジェクトであることが分かります。rsenseもそのことを検知できるので、file.の補完としてFileクラスのメソッドが候補となります。もちろんeachはその中の候補です。
3. line.の直後。File#eachはStringオブジェクトをyieldするので、自ずとlineはStringオブジェクトであることが分かります。上と同様の理由により、Stringクラスのメソッドが候補となります。スクリーンショットではchとまで打ち込んでおり、その候補としてchomp, chomp!, chop, chop!などのStringクラスのメソッドが一覧されています。

とまあ、報告するにあたって都合のいいサンプルを引っ張ってますので、まだまだ現実的に使えるレベルではありません。しかしそれは内部的な対応を進めれば解決できると思っています。むしろパフォーマンスのほうが懸念です。rsenseはCPAと呼ばれる古典的(かどうかは分かりませんが)な型推論アルゴリズムを使っていますが、このアルゴリズムは巨大なソースコードでは実用できるほどスケールしないことが知られています(そしてレスポンス性が求められる補完においてはよりクリティカル)。そこで、DDPという目的ドリブンなスケールしやすい型推論アルゴリズムが開発されて、実際にSmalltalk型推論に使われているようです。

将来的にはDDPに乗り換える予定ですが、アルゴリズムが単純で分かりやすいCPAで、なんとか凌げるのならこのまま使いつづけるつもりです。実際、どこまでのレスポンス性が要求されているのか、結構微妙ですが…