[1.18] `Material` に対する match を error にする Scalafix rule を書く
Closed this issue · 10 comments
#2115 にて露呈した問題で、1.13 以降の Spigot API では org.bukkit.Material
の case 数が 1800 個を超えており、t: Material
について t match { ... }
と書くだけでコンパイル時間が 200 秒ほど増える現象が発生していた。
このため、org.bukkit.Material
が scrutinee に来る match
式は Scalafix rule にてエラーとしたい (少数のそのような match
が紛れ込んだ場合、数分程度コンパイル時間が伸び、気づかないことがありそうなので)。
んなことある?????
メモ: 帰ったらプロファイル結果を貼る
ついでに精査してscala/bugに上げる
(昨日軽くデバッガーで scalac の様子を覗いてたんですが、match optimization で unreachable arm の存在を調べるために明大論理ソルバを持ち出しているっぽくて、そこで無限に時間が掛かっていました 普通に想定していない大きさの enum
という説はある)
↑OnClickTitleMenuとBreakUtil.isAffectedByGravityはまぁ仕方ないだろうという気持ちになるが、それ以外は自明なパターンなので意味不明
最小化するため、試しに
enum Hello {
E1,
/* ... */
E2000
}
object App {
def main(args: Array[String]): Unit = {
val x: Hello = Hello.E1
x match {
case Hello.E4 => println("E4")
case _ => println("other")
}
}
}
という例を持ち出したら普通に4分程度かかった。sbt clean; compile
をして上記コードをコンパイルした結果、scala.tools.nsc.transform.patmat.PatternMatching$OptimizeMatchTranslator.{unreachableCase,exhaustive}
がCPU時間の99.9%を占めていたのでmatch
関連なのは間違いない。
(昨日軽くデバッガーで scalac の様子を覗いてたんですが、match optimization で unreachable arm の存在を調べるために明大論理ソルバを持ち出しているっぽくて、そこで無限に時間が掛かっていました 普通に想定していない大きさの
enum
という説はある)
もしかして: 命題論理ソルバ?
最小化するため、試しに
enum Hello { E1, /* ... */ E2000 }object App { def main(args: Array[String]): Unit = { val x: Hello = Hello.E1 x match { case Hello.E4 => println("E4") case _ => println("other") } } }という例を持ち出したら普通に4分程度かかった。
sbt clean; compile
をして上記コードをコンパイルした結果、scala.tools.nsc.transform.patmat.PatternMatching$OptimizeMatchTranslator.{unreachableCase,exhaustive}
がCPU時間の99.9%を占めていたのでmatch
関連なのは間違いない。
tracked: scala/bug#12873
closed by #2227
(scrutinee: @unchecked)
もワークアラウンドになるらしいが、やりたくないなぁという気持ち