| // 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" | |
| } |