unite-outline の近況: Ruby と RSpec の見出し抽出を改善

今秋から Rails やってます。というわけで、unite-outline の Rubyサポートを強化中。まずは、Ruby用 outline info の改善から。

def 以外のメソッド定義も拾う

なんと、メソッドの定義は def しか拾ってなかったので、attr_accessor, attr_reader, attr_writer, alias などが今まで見出しになっていなかったという驚愕の事実。おいw

こいつらもメソッドの定義だから見出しになるべき、ということで、そのように修正。

Rails だと mattr_ とか cattr_ とかもあるよねー、ということでそっちにも対応。

正しい構造のツリー

Ruby(というか Rails界隈?)では protected, private なメソッドを public なものより一段字下げするという慣習で書かれているコードが少なからずあって、Ruby ではインデントの深さを元に見出しレベルを決めている関係上、一連の privateメソッドが直前の publicメソッドの小見出しになるということが起こっていた。(:help unite-outline-known-issues を参照)

で、これはちょっとかっこ悪いというんで、protected または private の後で字下げしている場合には、字下げされているメソッドを protected または private の下に束ねて、直前の publicメソッドの小見出しにならないようにした。

Before:

▲ privateメソッドが publicメソッドの小見出しになってしまっている。

 ↓

After:

▲ private を見出しにすることで回避

これで絞り込みの結果に無関係なメソッドが残ることはなくなった。

DSL対応

後、ftdetect で複合ファイルタイプの設定をしなくても DSL用の outline info へ処理を委譲できる仕組みを実装した。これにより、ファイルタイプが ruby のままでもファイル名が *_spec.rb なら RSpec用の見出し抽出を行う、みたいなことができるようになった。


▲ describe, it などが見出しになっているが、実はファイルタイプはただの ruby

具体的には、オートロード関数 path#to#outline#{filetype}#outline_info() にて、呼び出し側から渡される context の情報を元に、別のファイルタイプ名(例えば 'ruby/rspec' とか)を文字列として返すと、そっちへ処理が委譲される。(ファイルタイプ・リダイレクトと命名

Ruby用の outline info ではこの仕組みを使い、ファイル名が *_spec.rb なら RSpec用の outline info へ処理をリダイレクトさせている。

この仕組みを使い、Ruby の主要な DSL に順次対応していこうと思っている。とりあえず次のターゲットは Rake あたり。