rubyなeldocを作成中

elispCommon Lispで関数名にカーソルを置くと引数を表示してくれる機能にはいつも助けられる。*1eldocはelisp以外にもpythonerlangにも対応している。しかし、悲しいことになぜかrubyにはないのだ。これだけruby人口が増えてるのに誰も手をつけないのは不思議なもんだが、ないと困るので作ろうと思う。

RRSEはあくまでriやrefeのデータベース全体から探すようでこれでは範囲が広すぎる。ロードしたライブラリに範囲を限定し、なおかつ自分で定義したメソッドの引数を表示してほしいので。

そのためには各々のメソッドについて [class, {:: #}, args] の集合が必要。収集するには

  • rcodetoolsのrct-meth-argsを使う
  • exuberant-ctagsでtagsを生成する
  • rtagsでtagsを生成する
  • rcovでdefsiteを集める

など考えられる。rct-meth-argsででっちあげてみたのだが、現実的な速度じゃないので困っている。なんせactive_supportみたいな巨大なライブラリを処理すると30秒近くかかる上300MB以上もメモリを消費してしまう。この例だとSEGVってるし…RubyレベルなのでおそらくRubyのバグだろう。バージョンを変えて後でためす。

$ time rct-meth-args rubygems active_support  > /tmp/output
zsh: segmentation fault  rct-meth-args rubygems active_support > /tmp/output
rct-meth-args rubygems active_support > /tmp/output  25.69s user 0.75s system 96% cpu 27.471 total

とりあえずそこそこ巨大なライブラリであるcgi.rbで速度を比較してみた。

$ time rct-meth-args cgi > /dev/null
rct-meth-args cgi > /dev/null  0.43s user 0.02s system 94% cpu 0.474 total
$ time rtags -f /dev/null /usr/local/lib/ruby/1.8/cgi.rb

rtags.rb 0.93 (August 2006) writing to file '/dev/null'

Parsing /usr/local/lib/ruby/1.8/cgi.rb...
rtags -f /dev/null /usr/local/lib/ruby/1.8/cgi.rb  2.01s user 0.05s system 96% cpu 2.137 total
2007年 9月 4日 火曜日 03:59:20 JST
$ time ctags -f /dev/null /usr/local/lib/ruby/1.8/cgi.rb
ctags -f /dev/null /usr/local/lib/ruby/1.8/cgi.rb  0.01s user 0.01s system 118% cpu 0.013 total

rct-meth-argsは0.474秒、rtagsは2.137秒、exuberant-ctagsは0.013秒と大きく差がついた。この時点でrtagsは遅すぎるので脱落。Rubyはコードをスキャンするのは不得意のようだ。exuberant-ctagsを使いたいが、Ruby parserにややバグがあってちゃんとメソッドを取ってくれないことがある。

んー、ただメソッドのクラスと引数を得るだけなのにわざわざ実行するのはoverkillなんだよね…メタプログラミングで動的に生成されたメソッドとかは少数なんだし。

*1:elispはeldoc、Common Lispはslime-autodoc-mode