Scala 2.13.2で-Wconf
というオプションが追加されており、コンパイラが出力する警告を細かくカスタマイズすることができるようになっています。このオプションはScala 2.12系にもバックポートされており、Scala 2.12.13で利用可能です。
たとえばScalaコンパイラは-deprecation
オプションを指定すると非推奨のAPIの使用に対して警告を出力しますが、build.sbtに以下のような設定を追加することで、自動生成されたコードに対しては警告を出力しないようにできます。
scalacOptions := Seq( "-deprecation", "-Wconf:cat=deprecation&src=src_managed/.*:s" )
指定方法は-Wconf:<filters>:<action>,<filters>:<action>,...
という感じで、フィルタ部分で対象の警告を指定、アクションでその警告をどう扱うかを指定します。
フィルタでは対象の警告を以下のような条件で指定可能です。条件は&
区切りで複数指定可能です。また、deprecation
の警告に関してはorigin
とsince
というオプションを使用してさらに細かく対象を絞り込むこともできます。
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オプションを有効にするのを躊躇っていた部分もあるのですが、このオプションで不要な警告を抑制できるのでコンパイラによるチェックを積極的に活用できるようになりそうです。