blob: c39507675455b34dfc532e56db506a584f7f996f [file]
// LANGUAGE: +FullValueClasses
// WITH_STDLIB
val list = mutableListOf<Any>()
fun captureAny(obj: Any): String = obj.toString()
// === Abstract value class with `this` reference in init block ===
abstract value class AbsWithThisInInit(a: Int) {
init {
list.add("AbsWithThisInInit($a)")
list.add("this=${captureAny(this)}")
}
}
value class ChildOfAbsWithThis(val x: Int) : AbsWithThisInInit(x * 3) {
init {
list.add("ChildOfAbsWithThis($x)")
}
override fun toString(): String = "ChildOfAbsWithThis($x)"
}
// === Sealed value class with `this` reference in init block ===
sealed value class SealedWithThisInInit(a: Int) {
init {
list.add("SealedWithThisInInit($a)")
list.add("sealed-this=${captureAny(this)}")
}
}
value class ChildOfSealedWithThis(val x: Int) : SealedWithThisInInit(x + 10) {
init {
list.add("ChildOfSealedWithThis($x)")
}
override fun toString(): String = "ChildOfSealedWithThis($x)"
}
fun box(): String {
// --- Abstract value class with `this` in init block ---
list.clear()
val cwt = ChildOfAbsWithThis(5)
// AbsWithThisInInit.init: a=5*3=15 -> "AbsWithThisInInit(15)"
// captureAny(this) -> "this=ChildOfAbsWithThis(5)"
// ChildOfAbsWithThis.init: x=5 -> "ChildOfAbsWithThis(5)"
require(list == listOf("AbsWithThisInInit(15)", "this=ChildOfAbsWithThis(5)", "ChildOfAbsWithThis(5)")) { "AbsWithThisInInit: $list" }
require(cwt.x == 5) { "ChildOfAbsWithThis.x = ${cwt.x}" }
// --- Sealed value class with `this` in init block ---
list.clear()
val cswt = ChildOfSealedWithThis(7)
// SealedWithThisInInit.init: a=7+10=17 -> "SealedWithThisInInit(17)"
// captureAny(this) -> "sealed-this=ChildOfSealedWithThis(7)"
// ChildOfSealedWithThis.init: x=7 -> "ChildOfSealedWithThis(7)"
require(list == listOf("SealedWithThisInInit(17)", "sealed-this=ChildOfSealedWithThis(7)", "ChildOfSealedWithThis(7)")) { "SealedWithThisInInit: $list" }
require(cswt.x == 7) { "ChildOfSealedWithThis.x = ${cswt.x}" }
return "OK"
}