Perlで自動でuseしてくれるvscode拡張機能をリリースしました!

Perlではモジュールをコンパイル時に読み込む機能としてuseがあります. 大きめのPerlコードを書いていると,様々なモジュールをuseする必要があり,実行してからuseしてないよ!と怒られるのを何度も経験してきました...

そんな時,ちょっとだけGo言語を触る機会があってIntelliJで書いたところ自動でimportされるじゃないですか! これには本当に感動して,Perlでも同じことがしたい!と思ったのが今回の拡張機能を作ったモチベーションです.

前置きが長くなってしまいましたが,こちらが今回作った拡張機能です!

marketplace.visualstudio.com

test

これが実際に動いてる様子で,scanコマンドを実行してからauto useコマンドを実行すると自動でuseしてくれて便利です!

ちょっとだけ仕組みを解説したいと思います.

まず,scanコマンドで何をスキャンしているかを説明します.

グロブ形式で指定されたディレクトリ(デフォルトは**/lib/**/*.pm)以下のモジュールを読み込んで,Exporterを使用してエクスポートされた関数,つまり,@EXPORT, @EXPORT_OKに指定された関数を(擬似的な)データベースに保存しています. 指定された関数として,Module::Functionsget_public_functionsが使用された場合にも対応しています.

次に,auto useコマンドでどうやってuseしてくれるかを説明します,

フォーカスされているファイルの全文を空白などの区切り文字でスプリットしてトークンに分解してから,データベースにそのトークンが存在するかどうかを見て,存在していたらuseするようにしています. ここで,重複が存在すると,useはせずにwarningが出るので,そのトークンを選択するとランプマークが出てどのモジュールをuseするかを選択することができます.(↑の動画を見てもらうとわかると思います)

  という感じで,現状は凝ったエクスポートには対応していないのですが,体感としてはめちゃくちゃ便利です!

Perlについての理解はまだまだ浅いのでこれじゃダメだよ!とかあったら教えてもらえると助かります😭


余談ですが,vscode拡張機能を初めて作ってみたのですがデバッグもめっちゃしやすくて楽しかったのでオススメです.ただ,テストを書こうとすると途端に情報が減る印象でした.特に,ワークスペースを使ったテストは調べても全然わからなくて,結局本家のこのあたりを直接見るのが一番早いことがわかってきました.