trait Base { fun foo() } val ~getter1~Int.getter1: Int get() { return `getter1`this@getter1 } val ~getter2~Int.getter2: Base get() { return object: Base { override fun foo() { `getter2`this@getter2 } } } val ~getter3~Int.getter3: Base get() = object: Base { override fun foo() { `getter3`this@getter3 } } val ~getter4~Int.getter4: Int get() { return { `getter4`this@getter4 }.invoke() } val ~getter5~Int.getter5: Int get() { val extFun = { Int.() -> `getter5`this@getter5 } return `getter5`this@getter5.extFun() } class Test { val ~innerGetter1~Int.innerGetter1: Int get() { return `innerGetter1`this@innerGetter1 } }