未使用のimportや値を検査するコンパイラオプションとMetalsやScalafixとの関係について調べたメモです。コンパイラまわりの実装を追いきれていない可能性があるため、間違っていたらご指摘いただけると嬉しいです。
かつてScala 2系ではunused importなどのチェックに-Ywarn-unused
などを使っていた。Scala 3.3.0では、-Wunused:all
を使うことで未使用の変数やインポートをチェックする。
import scala.util.control.Breaks def main():Unit = val x = 42 val y = 43 val z = 44 println(x + z) main()
このようなコードを-Wunused:all
をつけてコンパイルしてみる。例えばScala CLIを使って実行してみる。Scala CLIでは、-O
オプションでコンパイラオプションを指定できる。
$ scala-cli run -O -Wunused:all unused-check.scala.sc Compiling project (Scala 3.3.0, JVM) [warn] ./unused-check.scala.sc:3:27 [warn] unused import [warn] import scala.util.control.Breaks [warn] ^^^^^^ [warn] ./unused-check.scala.sc:7:7 [warn] unused local definition [warn] val y = 43 [warn] ^ Compiled project (Scala 3.3.0, JVM) 86
コンパイラが未使用の変数とインポートを検出してくれた。
ちなみに検出するカテゴリは細かく制御でき、-Wunused:all
の代わりに-Wunused:imports
などが利用可能だ。
-Ywarn-unused
とは
もともと-Ywarn-unused
はScala2系のコンパイラオプションである。
このオプションは2.13からは-Wunused
としても使える旨記載されているが、歴史的経緯で-Ywarn-unused
で使っている人が多かったのではないだろうか。Scala 3以降では-Wunused
に統一されているので注意しよう。
lspのorganize-importsはまだ動かない / Scalafixの場合
ScalaのLSPクライアントであるMetalsは、organize importsをScalafixに委譲している。つまり、organize importsを実行するとRemoveUnusedルールがimport限定で動作するということ。
この機能は割と最近追加されて、とても嬉しい機能だ。ただ、RemoveUnusedルールのScala3対応はまだ実装中でまだ利用できない。
$ scalafix -v 0.11.0 $ scalafix --scala-version 3.3.0 -r RemoveUnused error: This rule is specific to Scala 2, because the compiler option `-Ywarn-unused` is not available yet in scala 3 To fix this error, remove RemoveUnused from .scalafix.conf
現在はsemanticDBまわりの実装が行われているようだ。気長に待とう。警告自体はScalaコンパイラが出してくれるので、当分はこれを活用することになる。
補足: -W
とか-Y
ってなに
Scala2.13で使えたコンパイラオプションが使えるかどうかは以下に示すページで網羅されており、ある程度分類されている:
また完全に新しいオプションは以下で網羅されている:
これによれば、-W
はWarning optionsというカテゴリのコンパイラオプションであることがわかる。警告を司るオプションというわけ。
ほかにも、-X
はAdvanced settingsというカテゴリに入る。-Y
はPrivate settingsというカテゴリであり、主にコンパイラ開発向けのあまり安定していない?オプションが並んでいるらしいことがわかる。
参考文献
この機能は3.3.0-RC2から利用可能になっているようだ。