wartremoverのsbt pluginにscalafixのようなinput task追加した

「scalafixのような」とは

  • build.sbt を編集しなくても、input taskで実行するruleを任意の数、動的に指定可能
  • ローカルのfileのpathや、urlも指定可能
    • 動的に .scala fileをcompileして、それを実行してくれる
    • url指定したらそれをダウンロードしてくる
    • urlやfileも複数指定可能なので、1 fileで完結せずに相互依存してるものでも(あまりしっかりテストしてないが)原理上動くはず
    • ローカルのpathの場合、directory指定すると、そのdirectory直下のScalaファイル全部compileする機能などもつけた
    • compile後にどういうruleがあるか?の抽出も勝手に実行する(無理矢理なリフレクションで頑張った)
    • 動的にcompileしたものは雑にcacheするようにもして、毎回compileされないようにした
  • それらのsbtのshell上でのtab補間もできるだけ実装した
  • 結果をerrorにするか?warningにするか?をそれぞれ指定可能にした
    • これはscalafixにはない・・・?うろ覚え

上記は作成途中のtweetで、撮り直すのが面倒なのでそのまま載せてますが、開発中は wartremoverInspectRun などとしていましたが、結局scalafixを真似して、単に wartremover というinputTask名にしました。

https://github.com/wartremover/wartremover/commit/427542d6dab7780604a56909ccfd2e5ec15a58ec

これの注意点というか重要な制限としては、Scala 3のTASTy inspectorに頼ることにしたので、Scala 3でしか動きません。Scala 2では無理です。

Scala 2でも同じようなことをやろうとしたけど、綺麗に実装するのが相当難しかったので一旦諦めました。

ちなみに、以前からTASTy Inspectorで実行する機能自体は入れてありましたが

xuwei-k.hatenablog.com

それが(build.sbtいじってreloadせずとも)より気軽に実行可能になった、外部のruleもその場でcompileしてくれるので、格段に楽になった、ということです。