-WconfオプションでScalaコンパイラの警告を抑制する

Scala 2.13.2で-Wconfというオプションが追加されており、コンパイラが出力する警告を細かくカスタマイズすることができるようになっています。このオプションはScala 2.12系にもバックポートされており、Scala 2.12.13で利用可能です。

www.scala-lang.org

たとえばScalaコンパイラ-deprecationオプションを指定すると非推奨のAPIの使用に対して警告を出力しますが、build.sbtに以下のような設定を追加することで、自動生成されたコードに対しては警告を出力しないようにできます。

scalacOptions := Seq(
  "-deprecation",
  "-Wconf:cat=deprecation&src=src_managed/.*:s"
)

指定方法は-Wconf:<filters>:<action>,<filters>:<action>,...という感じで、フィルタ部分で対象の警告を指定、アクションでその警告をどう扱うかを指定します。

フィルタでは対象の警告を以下のような条件で指定可能です。条件は&区切りで複数指定可能です。また、deprecationの警告に関してはoriginsinceというオプションを使用してさらに細かく対象を絞り込むこともできます。

  • any すべての警告
  • cat=deprecation 警告のカテゴリを指定
  • msg=regex メッセージを正規表現で指定
  • site=my\.package\..* 対象クラスを正規表現で指定
  • src=src_managed/.* 対象ソースファイルを正規表現で指定

アクションではその警告をどう扱うかを指定します。warningとinfoはwarning-summary / ws もしくは info-summary / is と指定することでまとめて表示することもできます。

  • error / e エラーとして報告
  • warning / w 警告として報告(デフォルト)
  • info / i 警告としてはカウントせずに報告
  • silent / s 警告として報告しない

GitBucketで未使用のインポートに警告を出すようにしてみたところ、Twirlが自動的にインポートするクラスとSlickのモデルクラスで必要なインポートが警告になってしまうので以下のような感じの設定を追加してみました。

scalacOptions := Seq(
  "-Wunused:imports",
  "-Wconf:cat=unused&src=twirl/.*:s,cat=unused&src=scala/gitbucket/core/model/[^/]+\\.scala:s"
)

また、-Wconfオプションだけでなく、コード中で @nowarn アノテーションを付与することで警告を抑制することもできるようです。

これまで自動生成コードなどで警告が出すぎてしまうのでコンパイラのlintオプションを有効にするのを躊躇っていた部分もあるのですが、このオプションで不要な警告を抑制できるのでコンパイラによるチェックを積極的に活用できるようになりそうです。