読者です 読者をやめる 読者になる 読者になる

hitode909の日記

趣味はマリンスポーツですの日記です

App::PRTに指定したコード内に登場する変数を紹介してくれる機能をつけた

以前から作っていた,PerlリファクタリングツールであるApp::PRTに,指定したコード内に登場する変数を紹介してくれる機能をつけた.

背景

Perlのコードをリファクタリングするとき,一部をメソッドとして切り出したいときがある.
IDEがあればIDEが自動でやってくれるけど,そういったものはないので,手動でやることになる.
エディタで選択して,この中にはどういった変数があるのか,ということが気になる.
そういったときに,選択したコード内にはこれらの変数があります,ということが一目で分かると便利.
そこを切り出せそうか判断するのに使えたり,おかしな変数が登場していたら,その変数が登場しない形に書き直したのちに,メソッドを切り出したほうがよいかもしれない.
最近仕事で古くからあるコードをリファクタリングしまくっていて,コードをじっくり眺めて変数を探したりしていて困っていた.

様子

こういうごちゃっとしたコードがあったとして,

my @packages_in_source = map { $_->module } @{ $document->find('PPI::Statement::Include') };
for my $package (@packages_in_source) {
    my $command = App::PRT::Command::AddUse->new;
    $command->register($package);
    $command->execute($destination_file);
}

これをコピーして,prt introduce_variableコマンドに渡すと,このように,コード内に登場する変数が出力される.

% pbpaste | prt introduce_variables
@packages_in_source
$_
$document
$package
$command
$destination_file


1行1変数なので,行数を数えると,変数が何個登場しているか分かる.

% pbpaste | prt introduce_variables | wc -l
       6

Emacsから使う

お手元のエディタから呼び出して,選択範囲に含まれる変数を眺めることができる.
f:id:hitode909:20161028162107p:plain

今後

App::PRTはこれまでファイルを受け取って,受け取ったファイルを直接書き換えたり,クラス名を変えるときはファイルを移動したりしていたけど,エディタから呼ぶ前提ならリファクタリング対象の柔軟な指定ができることに気付いた.
今回は標準出力に情報を出してみたけど,標準出力にリファクタリング後のコードを出力して,エディタ側で差し替える形にすれば,指定した範囲のコードをメソッドに切り出すといった,一部だけリファクタリングするような機能も作れそう.