私が歌川です

@utgwkk が書いている

VSCodeでPerlのコードのRename Symbol機能を提供する拡張機能を書いた

VSCodeには Rename Symbol っていって、変数やメソッドの名前を一括変更する機能があるのだけれど、これをPerlでも使えるようにしたい。ということで、できたものがこちらになります。

marketplace.visualstudio.com

App::PRTApp::EditorToolsを手元にインストールしてからご利用ください。

メソッド名を変える

App::PRTid:hitode909 さんが作ったPerlリファクタリングツールで、メソッドのリネームなどを安全に行うことができる。 App::PRTを使えばコマンドを叩くだけでリファクタリング成功するのでなんかうまく使えないか、ということで休日を潰して実装した。

提供されているAPIのインタフェースを見るに、ほんとうは、どのトークンを書き換えたらよいかを列挙してreplaceする、ということが求められているのだと思うけれど、コマンド1つで書き換えてくれるので、APIのインタフェースを無視して、無の変更を適用したのち、おもむろにファイルが書き変わる、という形式になっている。

const args = [prtPath, 'replace_token', oldName, newName, ...targetFiles];
cp.execSync(args.join(' '));
resolve(new vscode.WorkspaceEdit());

使用例

gyazo.com

Plack::Responseの header メソッドを一括で atama メソッドにリネームしている。 ちょっと待つとどかっとsource controlに変更点が出てきておもしろい。

変数名を変える

App::EditorToolsというツールを使えば、変数のスコープを考慮した変数のリネームができる、と聞いたので、こちらも使ってみることにした。 こちらは、標準入力からソースコードを流し、コマンドライン引数で変えたい変数について教えて、標準出力から取る、という仕組みになっている。

const args = [editorToolsPath, 'renamevariable', '-c', position.character, '-l', position.line + 1, '-r', newName];
const source = document.getText(); // ファイル全体を取得
const output = cp.execSync(args.join(' '), { input: source, encoding: 'utf-8' });
const edit = new vscode.WorkspaceEdit();
// ファイル全体を書き換える
edit.replace(
    document.uri,
    new vscode.Range(document.lineAt(0).range.start, document.lineAt(document.lineCount - 1).range.end),
    output.toString()
);
resolve(edit);

相変わらずコマンド1つで動けばよかろうの精神で、出力をまるごと今開いてるファイルに適用することでリファクタリングを実現している。

使用例

gyazo.com

Plack::Responseの headers メソッド内の $self を一括で $watashi にリネームしている。 あとから気軽に変数名を変えられるのはたいへん安心できる。

ご活用・ごフイードバックください

とにかく動けばいい、の精神で実装したので、うまくインストールできない、このケースでうまく動かない、などありましたらお知らせいただけるとありがたいです。

github.com