質問: Scalaコンパイラのクラッシュを回避するにはどうすればよいですか? 私はScala 2.9.1でプロジェクトをコンパイルしています。 ``` java.lang.AssertionError: assertion failed at scala.Predef$.assert(Predef.scala:89) at scala.tools.nsc.symtab.Symbols$Symbol.accessed(Symbols.scala:1142) at scala.tools.nsc.symtab.Symbols$Symbol.accessed(Symbols.scala:1138) at scala.tools.nsc.transform.Mixin$MixinTransformer$$anonfun$buildFieldPositions$1$1.apply(Mixin.scala:1006) ``` 私はそれがバグだと思うが、私は本当にそれを修正するか、誰かがそれを修正するのを待つ時間がないので、バグにぶつからないように私が何をしているのかを変更したい。 しかし、私のコードのどの部分が問題を引き起こしたのか分からないので、苦労しています。問題を特定するために私が使用できる戦略はありますか? 調査している人の作業を簡単にするために、ソースコードへのリンクを以下に示します。 * Symbols.scala:1142 * Symbols.scala:1138 * Mixin.scala:1006
回答: Scalaトランクはより多くの情報を表示するので、より良いエラーメッセージを得るためにトランクでコンパイルすることができれば助けになります。もちろん、トランクにはこのバグはないかもしれませんが、一発の価値があります。 トランクでコンパイルが役に立たない場合は、ここで私が知っていることがあります。これはgetterとsetterに関連しています。コードから、セッターかゲッターのどちらかになります。ゲッターやセッターが定義されていないときに呼び出されるもののようです。あなたはそれらを見ることができます。 また、ゲッターやセッタールールにも注意してください。 getterは、少なくともsetterと同じくらいの可視性を持つ必要があります(つまり、setterがパブリックな場合など)。ここではコンパイラのバグについて話しているので、私は奇妙な可視性(つまり、公開でもプライベートでもないもの)、継承や混合された可視性(例えば、セッターのプライベートとゲッターの公開)を避けるでしょう。 **EDIT:** I just noticed the stack trace mentions mixin as well. So, it is related to a getter or setter which is defined in a trait and used on a class, or used on a trait. **EDIT 2:** Still investigating. Do you have overload getters/setters for lazy vals, or getters/setters being overloaded with lazy vals? Or, just lazy vals on traits? I saw something in the third line of the trace that seems to point to a lazy val. より多くの情報が見つかった場合は、小さなケースを再現して問題を提出してください。