Ruby Refactoring Browser

English / Japanese

動作概要

現在のところ、以下のようなリファクタリング機能が実装されています。

構成

Ruby Refactoring Browser(以下RRB)は、以下のような構成になっています。

(1)emacs
(2)rrb.el
(3)bin/rrbbin/rrb_compinfo
(4) RRB Core Library
  • lib/rrb
  • rrb_reflection
  • Ripper (RRB modified version)

(1)は、各種テキストエディタ(もしくはIDEなど)です。これがユーザーとの インターフェースになります。現在のところ、emacsのみがサポートされています。

(2)は、エディタからRRBを呼び出すためのバインディングです。 emacsの場合は、emacs lispで書かれたrrb.elというスクリプトです。

(3)はコマンドラインツールです。RRBのシェル用のインターフェースと言ってもいい かも知れません。実体はRubyスクリプトです。(2)から呼び出されることを前提に 作られていますが、コマンドラインから直接使用することも可能です。

(4)はライブラリ本体です。ほとんどの部分はRubyで書かれています。 入力されたスクリプトを解析し、 各種リファクタリングを施して出力します。
スクリプトの解析には、青木峰郎さんの Ripperというパーサライブラリを 改造したものと、Ruby自体のリフレクション機構 (スクリプトをロードした状態で、どんなクラスが定義されているかを調べる機能) を使用しています。
(※現在は、RipperのメンテナはRichard Kilmer氏に移り、 RubyForgeにて開発が続けられるそうです)

制限

RRBでリファクタリングするRubyスクリプトに関しては、 今のところ以下のような制限があります。
  1. 複数のスクリプトからなるプログラムの場合、全てのスクリプトをemacs上に読みこんでおかなければならない。
  2. また、emacs上に読みこまれている全ての*.rbがリファクタリングの対象となる。
  3. スクリプトは定義部と実行部に分かれていなければならない

1は、リファクタリングの結果、どのスクリプトも変更される可能性があるからです。

2は、リファクタリングの対象となるべきスクリプトを自動で判定するのは困難だからです。

3は、スクリプトを解析する際に、実際にそのスクリプトをrequireして、 Rubyのリフレクション機構を使用する場合があるからです。
要するに、「requireしても何も起きない」ことが必要なわけです。
具体的には、「if $0==__FILE__...endで囲む」という定石を使うことを想定しています。

例:
#定義部
class Hoge
  # Hogeを定義…
end

#実行部
if $0 == __FILE__
  Hoge.new.run
end