CIで警告のdiffを出すsbt pluginでscalafix対応をした

以前作った以下のsbt pluginの0.2.0リリースしました。

github.com

xuwei-k.hatenablog.com

https://github.com/xuwei-k/sbt-warning-diff/commit/00f4ec112e3d641c1ba189ec2fe86aa6e4ac23cc

sbt-scalafixは、sbtのTaskとしての値を返してくれません。

https://github.com/scalacenter/sbt-scalafix/blob/c2777cfe1ea5623201fc3ae86d74e1043e19f4f3/src/main/scala/scalafix/sbt/ScalafixPlugin.scala#L30-L37

scalafixやscalafixAllは InputKey[Unit] という型になっています。

自作のpluginは、sbtが返してくれた値を使って警告を収集していました。 つまり、sbtの compile などのTaskは Unit ではなく CompileAnalysis というものを返してくれます。

scalafixが返してくれない対策として、自分が考えた限り、何があり得るか?というと

  • 1: sbt-scalafix自体にissue報告かpull reqして、値を返してもらうように大改造する
  • 2: sbt-scalafix本体のコードはいじらずに、標準出力の結果か何かを無理やりparseする
  • 3: sbt-scalafixを経由せずに、独自にscalafixを呼び出す

の3択だったのですが、

理想というか、あるべき姿としては、sbt-scalafixが値を返してくれることが1番嬉しいけれど、 sbt-scalafixが良くも悪くも色々やっていて、その改造が難しそう、仮に出来てpull reqしても、mergeされるか謎だったので、ひとまず諦めました。

標準出力の結果か何かを無理やりparse も、それはそれで辛そうなので、だったら独自にscalafix呼び出した方がまだマシか??? と考えて、結局その方式でやりました。

制約としては、SyntacticRuleのみサポートで、SemanticRuleは一旦諦めました。

使い方としては、scalafixも収集したい場合は、READMEに書いたように以下の別のsbt plugin

addSbtPlugin("com.github.xuwei-k" % "warning-diff-scalafix-plugin" % "version")

の方を加えれば、既にscalafixの設定がされている場合は、特に追加の設定なしで勝手にscalafixの警告も収集されるはずです。