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