== A == class A { val x: Int var y: Int val z: Int val v = -1 constructor() { x = 1 y = 2 } constructor(a: Int, b: Int = 3) { x = a y = x } //anonymous init { z = 8 } constructor(a: String, b: Int = 4): this() { y = 5 } constructor(a: Double, b: Int = 6): this(a.toInt()) { y = 7 } // anonymous init { y = 9 } } --------------------- ===================== == A == constructor() { x = 1 y = 2 } --------------------- : A NEW: magic[IMPLICIT_RECEIVER](y) -> : A NEW: magic[IMPLICIT_RECEIVER](z) -> : A NEW: magic[IMPLICIT_RECEIVER](y) -> : A NEW: magic[IMPLICIT_RECEIVER](x) -> : * NEW: call(, ) -> 1 : Int NEW: r(1) -> 2 : Int NEW: r(2) -> y = 2 !: * { x = 1 y = 2 } !: * COPY ===================== == A == constructor(a: Int, b: Int = 3) { x = a y = x } --------------------- : Int NEW: magic[FAKE_INITIALIZER](a: Int) -> : A NEW: magic[IMPLICIT_RECEIVER](y) -> : A NEW: magic[IMPLICIT_RECEIVER](x) -> : A NEW: magic[IMPLICIT_RECEIVER](y) -> : A NEW: magic[IMPLICIT_RECEIVER](x) -> : Int NEW: magic[FAKE_INITIALIZER](b: Int = 3) -> : A NEW: magic[IMPLICIT_RECEIVER](z) -> 3 : Int NEW: r(3) -> b: Int = 3 : Int NEW: merge(b: Int = 3|, ) -> : * NEW: call(, ) -> a : Int NEW: r(a) -> x : Int NEW: r(x|) -> y = x !: * { x = a y = x } !: * COPY ===================== == A == constructor(a: String, b: Int = 4): this() { y = 5 } --------------------- : String NEW: magic[FAKE_INITIALIZER](a: String) -> : Int NEW: magic[FAKE_INITIALIZER](b: Int = 4) -> : A NEW: magic[IMPLICIT_RECEIVER](y) -> 4 : Int NEW: r(4) -> b: Int = 4 : Int NEW: merge(b: Int = 4|, ) -> this() : * NEW: call(this(), ) -> 5 : Int NEW: r(5) -> y = 5 !: * { y = 5 } !: * COPY ===================== == A == constructor(a: Double, b: Int = 6): this(a.toInt()) { y = 7 } --------------------- : Double NEW: magic[FAKE_INITIALIZER](a: Double) -> : Int NEW: magic[FAKE_INITIALIZER](b: Int = 6) -> : A NEW: magic[IMPLICIT_RECEIVER](y) -> 6 : Int NEW: r(6) -> b: Int = 6 : Int NEW: merge(b: Int = 6|, ) -> a : {<: Number} NEW: r(a) -> toInt() : Int NEW: call(toInt(), toInt|) -> a.toInt() : Int COPY this(a.toInt()) : * NEW: call(this(a.toInt()), |) -> 7 : Int NEW: r(7) -> y = 7 !: * { y = 7 } !: * COPY =====================