package baz import kotlin.reflect.KProperty class A(outer: Outer) { var i: String by + getMyConcreteProperty() var d: String by getMyConcreteProperty() - 1 var c: String by O.getMyProperty() var g: String by outer.getContainer().getMyProperty() var b: String by foo(getMyProperty()) var r: String by foo(outer.getContainer().getMyProperty()) var e: String by + foo(getMyProperty()) var f: String by foo(getMyProperty()) - 1 } fun foo(a: Any?) = MyProperty() fun getMyProperty() = MyProperty() fun getMyConcreteProperty() = MyProperty() class MyProperty { operator fun getValue(thisRef: R, desc: KProperty<*>): T { println("get $thisRef ${desc.name}") return null as T } operator fun setValue(thisRef: R, desc: KProperty<*>, value: T) { println("set $thisRef ${desc.name} $value") } } operator fun MyProperty.unaryPlus() = MyProperty() operator fun MyProperty.minus(i: Int) = MyProperty() object O { fun getMyProperty() = MyProperty() } interface MyPropertyContainer { fun getMyProperty(): MyProperty } interface Outer { fun getContainer(): MyPropertyContainer } // ----------------- fun println(a: Any?) = a