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)

私はそれがバグだと思うが、私は本当にそれを修正するか、誰かがそれを修正するのを待つ時間がないので、バグにぶつからないように私が何をしているのかを変更したい。

しかし、私のコードのどの部分が問題を引き起こしたのか分からないので、苦労しています。問題を特定するために私が使用できる戦略はありますか?

調査している人の作業を簡単にするために、ソースコードへのリンクを以下に示します。

ベストアンサー

具体的にはScalaコンパイラのクラッシュについては取り組んでいませんが、他のコンパイラクラッシュを回避しました。あなたがしたいのは、問題の原因を絞り込むことです。ほとんどのプロジェクトでこれを行う最も簡単な方法は、コメントを使ってバイナリ検索を行うことです。つまり、コードの約半分をコメントアウトし、バグがまだ発生しているかどうかを確認します。そうでない場合は、その半分のコメントを外し、残りの半分にコメントして、まだバグが起きているかどうかを確認してください。それで、これがうまくいくとすれば、それがどちらの半分で起こっているのかを見て、それをコメントで半分にします。あなたが見つけ出すことのできるコードの最小セグメントまで、このプロセスを繰り返します。
(明らかに、コードの依存関係のために半分にすることはできないかもしれませんが、少なくともそれを大きな断片に分割する方法を見つけることはできません)。

あなたがそこに着くと、私の経験上、コンパイラのクラッシュが、間違って形成されたコードによって引き起こされる可能性が高いため、そのコードにバグがあることを検査で見つけることができます。期待していない。たとえば、自分のIntellisenseのようなJavaモジュールは、私が仕事をしているときには、スーパーやフォレストのスーパーをフォローしていない人は想像できないので、
foo(super).bar 文法がどのように設計されたかによってパーサーに伝わる。
AdobeのActionscriptコンパイラは、 var x:int = 10; ではなく
var x:int:10;
を書いたときにクラッシュします。前回私が使ったときにクラッシュした)。したがって、コード内にバグが見つかった場合は、修正してください。そうでない場合は、コードが異なるように書き直してください。うまくいけば、コンパイラがクラッシュしないバージョンを見つけることができます。

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です