interface IBase { abstract fun foo(x: Int, s: String) abstract fun bar(): Int abstract fun String.qux() } object BaseImpl : IBase { private constructor() /* primary */ { super/*Any*/() /* () */ } override fun foo(x: Int, s: String) { } override fun bar(): Int { return 42 } override fun String.qux() { } } interface IOther { abstract val x: String abstract get abstract var y: Int abstract get abstract set abstract val Byte.z1: Int abstract get abstract var Byte.z2: Int abstract get abstract set } fun otherImpl(x0: String, y0: Int): IOther { return { // BLOCK local class : IOther { private constructor() /* primary */ { super/*Any*/() /* () */ } override val x: String field = x0 override get override var y: Int field = y0 override get override set override val Byte.z1: Int override get(): Int { return 1 } override var Byte.z2: Int override get(): Int { return 2 } override set(value: Int) { } } () } } class Test1 : IBase { constructor() /* primary */ { super/*Any*/() /* () */ } override fun foo(x: Int, s: String) { .#<$$delegate_0>.foo(x = x, s = s) } override fun bar(): Int { return .#<$$delegate_0>.bar() } override fun String.qux() { (.#<$$delegate_0>, ).qux() } local /* final field */ val <$$delegate_0>: IBase = BaseImpl } class Test2 : IBase, IOther { constructor() /* primary */ { super/*Any*/() /* () */ } override fun foo(x: Int, s: String) { .#<$$delegate_0>.foo(x = x, s = s) } override fun bar(): Int { return .#<$$delegate_0>.bar() } override fun String.qux() { (.#<$$delegate_0>, ).qux() } local /* final field */ val <$$delegate_0>: IBase = BaseImpl override val x: String override get(): String { return .#<$$delegate_1>.() } override var y: Int override get(): Int { return .#<$$delegate_1>.() } override set(: Int) { .#<$$delegate_1>.( = ) } override val Byte.z1: Int override get(): Int { return (.#<$$delegate_1>, ).() } override var Byte.z2: Int override get(): Int { return (.#<$$delegate_1>, ).() } override set(: Int) { (.#<$$delegate_1>, ).( = ) } local /* final field */ val <$$delegate_1>: IOther = otherImpl(x0 = "", y0 = 42) }