原因
基本的には存在しないクラスを参照していたりして起きています。
なので、Android Studioでそのクラスを開ければ赤くエラーが出ているので解決します。
何もソースコードの位置が出ないので、だいぶ解決が難しいです。
多すぎたりしてクラスを特定するのが難しい場合もあります。
デバッグ方法
事前準備
Kotlinが別のプロセスで動いているとGradleの仕組みでデバッグできないのでプロセス内で動かす必要があります。
-Dkotlin.compiler.execution.strategy="in-process"
でin processでビルドできるはずなんですが、できない(デーモンでの起動になってしまう)ので、以下をgradle.propertiesに書きます。
kotlin.compiler.execution.strategy=in-process
デバッグ待ち状態にする
以下は:app:kaptGenerateStubsDebugKotlinでエラーが出ている場合です。:app:compileKotlinとかの場合もあります。
./gradlew --no-daemon :app:kaptGenerateStubsDebugKotlin --no-daemon -Dorg.gradle.debug=true -Dkotlin.compiler.execution.strategy="in-process" -Dkotlin.daemon.jvm.options="-Xdebug,-Xrunjdwp:transport=dt_socket,address=5005,server=y,suspend=n"
こんな感じのタスクを動かして、Gradleをデバッガー接続待ち状態にします。
デバッガー付きでタスクを動かす
Remote JVM DebugのconfigurationをAndroid Studioから作って起動するとコンパイラにデバッガーを貼ったときに、ちゃんとと止まるようになります。
コンパイラのクラスがIDE上から見れない場合
"Use module classpass"に指定しているモジュールのbuild.gradleでdependenciesにcompileOnlyなどでデバッグ上で必要になる依存を追加してあげましょう。これでSyncしてあげればそのコードが見れます。バージョンがズレていると、コードの位置が違うため、うまくデバッグできないと思います。
自分がやったときにはK2JVMCompilerなどがKotlinのコンパイラでした。
compileOnly("org.jetbrains.kotlin:kotlin-compiler-embeddable:...")
compileOnly("org.jetbrains.kotlin:kotlin-reflect:...")
解決
後はエラーメッセージを生成しているクラスのコンストラクタを呼び出している部分を探して、デバッガーをつけたりして、原因の特定を頑張るだけです。
私の場合はSymbolTableSlice
というクラスのreferenced()関数で新しいSymbolが追加されるタイミングで、new.descriptor is ErrorFunctionDescriptor || new.descriptor is ErrorModuleDescriptor
というConditionを設定したデバッガーを書くことで参照元のクラスを発見することができ、解決しました。 (ここまでたどり着くのが長かった)