Kotlin 1.1にて導入される構文の1つである Shorter syntax for properties を用いた以下のようなコードは,1.1.0-beta-22の段階では構文チェックは通るもののコンパイル時に落ちます.
open class A(val s: String)
class B(s: String): A(s) {
val rep // ここが問題
get() = s.replace("a", "b")
}
fun main(args: Array<String>) {
println(B("abrakadabra").rep)
}
Error:Kotlin: [Internal Error] org.jetbrains.kotlin.codegen.CompilationException: Back-end (JVM) Internal error: Don't know how to generate outer expression for lazy class B
︙
問題の箇所は
val rep: String
get() { return s.replace("a", "b") }
と等価になるはずなのでsはthis.sのつもりで使用していますが,コンストラクタに渡されたsと判別がつかないためにエラーを吐くようです.
対処法としては,
-
repの型を明記する - コンストラクタの引数名を変更する
-
this.sに書き換える
が考えられます.
本質的にはrepの型を推定するプロセスの問題なので,通常は型を明記すれば良いでしょう.
(多少はコンパイル速度も向上するのではないかと思いますし)
修正後のBクラスのコードは次のようになります.
class B(s: String): A(s) {
val rep: String // 変更点
get() = s.replace("a", "b")
}
~2017/2/3追記~
バグ報告は既にされているので,そのうち修正されると思います.
https://youtrack.jetbrains.com/issue/KT-15844