Rubyにおけるコード補完の考察

実験的ではあるにせよ、現状ではRubyのコード補完はid:rubikitchさんのrcodetoolsでなんとか対応できています。が、次のような(大きな)問題をかかえています。ちなみにここでいうrcodetoolsの問題というのは補完機能のことで、xmpfilterとかは全然関係ないことを留意してください。

rcodetoolsの問題点

rcodetoolsは、補完を得るために裏で編集中のRubyコードを実行するようです。実際にRubyコードを実行するので、補完ポイントに処理が到達できる場合は補完精度は100%になります。しかしこの方法には二つの問題があります。

一つは、補完ポイントに処理が到達できない場合は補完精度が0%に等しくなるという問題です。もう一つの問題はRubyコードの実行に時間がかかる場合に、それと同等の時間をEmacsが待つことになるという問題です。後者の問題は特に深刻で、例えば次のコードでコメントのある位置で補完を実行するとEmacsが固まってしまいます。

def foo
  loop do end
end
foo.#<-ここで補完

VimRubyコード補完機能もrcodetoolsと同じようなことをやっているのですが、こちらはタイムアウトをしかけているのか、固まるということはありません。補完精度はとんとんですが…

まあ仮に固まらないといても、requireなどのオーバーヘッドが補完毎にかかるようじゃちょっとしんどいです。

Typing Ruby

そういうわけで、Rubyコードを実際に実行せずにうまく補完できる方法がないか考えてみたところ、型推論をかなりがんばればなんとかなるんじゃないかという結論に至りました。

で、調べたところ、日本の学生(?)が静的チェックでプログラムの問題を診断する研究で型推論をがんばってることがわかりました。

http://truby.sourceforge.jp/index.j.html

しかしちゃんとした成果物に到達できないのと、まだ実用は無理なんスという雰囲気が漂っていたので、他のプロジェクトを探すことに。

Ruby Development Toolkit

するとこんどはGoogle Summer of Codeに採用されたプロジェクトが見つかりました。

http://soc.jayunit.net/

こちらは(本当のところはわかりませんが)、静的チェックとかVMの最適化というよりはIDEのコード補完に使うのを目的に実装されたものみたいです。実際、AptanaというIDEにマージされています。

http://www.aptana.com/

このIDEのコード補完は結構すごいです。例えば次のような関数定義があるとします。

def foo(n)
  n.#<-ここで補完
end

他にコードが何もない状態で、これを実行するとKernelのメソッド一覧しかでないのですが、この関数定義の下などに、

if false
  foo(1)
  foo("bar")
end

と書いておくと、補完にはFixnumとStringのメソッドも一覧されるようになります。この挙動はあきらかに型推論です。

型推論による補完のよい点は実際に実行しなくてもよい点と、ほぼ一定の時間で補完が出せることでしょう。

ちなみにこのコード補完機能はRDT(Ruby Development Tools)として提供されています。

auto-completeとRuby Development Tools

Ruby Development Toolsはオープンソース(Common Public License 1.0)なので、必要部分をうまく抜き出してコード補完用のスタンドアロンなプログラムとしてでっちあげればauto-completeと一緒に使うことができそうです。

まだ詳しくは調べてないのですが、おそらく可能でしょう。次のURLにソースコードのURLをおいておきます。

http://svn.aptana.com/svn/aptana/aptana/ide_suite/branches/radrails_1.1/rdt/plugins/org.rubypeople.rdt.core/

Rubyはなんとか対応できそうな気がしてきた!