Lambdaカクテル

京都在住Webエンジニアの日記です

Invite link for Scalaわいわいランド

Scala 3.3.0でunused import/variablesのチェックを有効化するには-Wunused:allを使う

未使用の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系のコンパイラオプションである。

docs.scala-lang.org

このオプションは2.13からは-Wunusedとしても使える旨記載されているが、歴史的経緯で-Ywarn-unusedで使っている人が多かったのではないだろうか。Scala 3以降では-Wunusedに統一されているので注意しよう。

lspのorganize-importsはまだ動かない / Scalafixの場合

ScalaのLSPクライアントであるMetalsは、organize importsをScalafixに委譲している。つまり、organize importsを実行するとRemoveUnusedルールがimport限定で動作するということ。

github.com

この機能は割と最近追加されて、とても嬉しい機能だ。ただ、RemoveUnusedルールのScala3対応はまだ実装中でまだ利用できない。

scalacenter.github.io

$ 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コンパイラが出してくれるので、当分はこれを活用することになる。

github.com

補足: -Wとか-Yってなに

Scala2.13で使えたコンパイラオプションが使えるかどうかは以下に示すページで網羅されており、ある程度分類されている:

docs.scala-lang.org

また完全に新しいオプションは以下で網羅されている:

docs.scala-lang.org

これによれば、-WはWarning optionsというカテゴリのコンパイラオプションであることがわかる。警告を司るオプションというわけ。

ほかにも、-XはAdvanced settingsというカテゴリに入る。-YはPrivate settingsというカテゴリであり、主にコンパイラ開発向けのあまり安定していない?オプションが並んでいるらしいことがわかる。

参考文献

この機能は3.3.0-RC2から利用可能になっているようだ。

github.com

github.com

★記事をRTしてもらえると喜びます
Webアプリケーション開発関連の記事を投稿しています.読者になってみませんか?