Scalafixで未使用のインポート文を削除する

Scalaで未使用のインポート文を自動で消せないかという話があり、Scalafixだとできそうだったのでやってみました。

github.com

ドキュメントに書かれている通りでいけるのですが、手順をまとめておきます。

まずはproject/plugins.sbtにsbtプラグインを追加。Scalaのバージョンによって使用するsbtのバージョンが違うので注意してください。

addSbtPlugin("ch.epfl.scala" % "sbt-scalafix" % "0.9.0")

とりあえずこれだけでScalafixを使えるようにはなるのですが、未使用のインポート文を削除するには追加の設定が必要です。build.sbtに以下の設定を追加します。

addCompilerPlugin(scalafixSemanticdb),
scalacOptions ++= List(
  "-Yrangepos",
  "-Ywarn-unused:import"
)

これでsbt "scalafix RemoveUnused"を実行すると未使用のインポート文が削除されます。

また、プロジェクトのルートディレクトリの.scalafix.confというファイルでデフォルトで実行するルールを指定することができるので、以下のような設定をしておくとsbt scalafixと入力するだけで未使用のインポート文を削除できるようになります。

rules = [
  RemoveUnused
]

ちょっと設定が面倒ですし、sbtプラグインだけでなくコンパイラプラグインも必要になります。また、Scala.jsプロジェクトでは動作しないという問題もあるのですが、未使用のインポート文を消す以外にもProcedure Syntaxの自動修正や指定した構文を利用禁止にする機能もあるのでこれらの機能にメリットを見い出せるのであれば導入するのもありかもしれません。

なお、Play FrameworkなどでTwirlを使用している場合、-Ywarn-unused:importオプションを有効にするとコンパイル時に大量の警告が出力されてしまいます。こちらで紹介されているように、

TwirlKeys.templateImports := Seq()

を指定して自動インポートをしないようにすれば警告も出なくなるのですが、この場合はTwirlがデフォルトでインポートしてくれているHtmlなども明示的にインポートしないと使えなくなるのでかなり不便な気がします。こういう点も考えると未使用のインポート文の削除のためにScalafixを導入するのはやや微妙かなというのが個人的な印象です。