特定の型の値を捨てていたら警告やエラーにするscalafixやwartremoverでのlinter

Scala標準に

-Wvalue-discard などがありますが、自分が知る限り、これはすごく細かく制御できるわけではなく、全てを警告します。

$ scala -Wvalue-discard
Welcome to Scala 2.13.14 (OpenJDK 64-Bit Server VM, Java 11.0.23).
Type in expressions for evaluation. Or try :help.

scala> def f = { 2 ; "a" }
                 ^
       warning: a pure expression does nothing in statement position; multiline expressions might require enclosing parentheses

しかし

Scala標準のFutureや、cats-effectのIOのような、非同期用の型やIOモナドのような型など、捨てたらよりバグっている可能性が高いものだけ検知したい」

という需要が自分の中というか周辺でありました。

これがタイトルの 特定の型の値 という話です。

これは型を正確に見る必要があるため、数ヶ月前に、SyntacticRuleではなくscalafixのSemanticRuleで作成して、OSSにしてあります。

https://github.com/xuwei-k/scalafix-rules/commit/41d2389fef6fdc6e8f26631782c71d4533760716

しかし、これを使って試行錯誤していると、おそらく現状のSemanticDBの限界で、型情報が全て取得不可能なパターンがありました。

xuwei-k.hatenablog.com

よって、scalafixのSemanticRuleでは検知不可能なパターンも検知可能にするためにwartremoverで作成し直したものが以下です。 Scala 2と3両方で作ってあります。

https://github.com/wartremover/wartremover/commit/2bd132b14b25fe9ccbc2d3c7415973ab38ea8b79

これを本体のmaster branchに入れてpublishしたいのですが、使用者側で任意の型に拡張可能にしたい気がしつつ、そこの綺麗な仕組みが思いついてない、という理由のみで、まだ本体に入れることが出来ていないため、とりあえず雑に貼り付けておきます。

そろそろwartremoverでもscalafixやscalafmtを真似て .wartremover.conf としてconfigファイル読み取る仕組みというか規約にしてしまった方がいい気がしますが、どうしますかねぇ・・・

追記: https://github.com/wartremover/wartremover/commit/327d075cb517e1d399ee826042452c39851baa33