VSCodeには Rename Symbol っていって、変数やメソッドの名前を一括変更する機能があるのだけれど、これをPerlでも使えるようにしたい。ということで、できたものがこちらになります。
App::PRTとApp::EditorToolsを手元にインストールしてからご利用ください。
メソッド名を変える
App::PRTは id:hitode909 さんが作ったPerlのリファクタリングツールで、メソッドのリネームなどを安全に行うことができる。 App::PRTを使えばコマンドを叩くだけでリファクタリング成功するのでなんかうまく使えないか、ということで休日を潰して実装した。
提供されているAPIのインタフェースを見るに、ほんとうは、どのトークンを書き換えたらよいかを列挙してreplaceする、ということが求められているのだと思うけれど、コマンド1つで書き換えてくれるので、APIのインタフェースを無視して、無の変更を適用したのち、おもむろにファイルが書き変わる、という形式になっている。
const args = [prtPath, 'replace_token', oldName, newName, ...targetFiles]; cp.execSync(args.join(' ')); resolve(new vscode.WorkspaceEdit());
使用例
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つで動けばよかろうの精神で、出力をまるごと今開いてるファイルに適用することでリファクタリングを実現している。
使用例
Plack::Responseの headers
メソッド内の $self
を一括で $watashi
にリネームしている。
あとから気軽に変数名を変えられるのはたいへん安心できる。
ご活用・ごフイードバックください
とにかく動けばいい、の精神で実装したので、うまくインストールできない、このケースでうまく動かない、などありましたらお知らせいただけるとありがたいです。