| import kotlin.reflect.KProperty |
| |
| public open class TestDelegate<T: Any>(private val initializer: () -> T) { |
| private var value: T? = null |
| |
| operator open fun getValue(thisRef: Any?, desc: KProperty<*>): T { |
| if (value == null) { |
| value = initializer() |
| } |
| return value!! |
| } |
| |
| operator open fun setValue(thisRef: Any?, desc: KProperty<*>, svalue : T) { |
| value = svalue |
| } |
| } |
| |
| class A |
| class B |
| class C |
| class D |
| |
| public val A.s: String by TestDelegate({"A"}) |
| public val B.s: String by TestDelegate({"B"}) |
| public val C.s: String by TestDelegate({"C"}) |
| public val D.s: String by TestDelegate({"D"}) |
| |
| fun box() : String { |
| if (A().s != "A") return "Fail A" |
| if (B().s != "B") return "Fail B" |
| if (C().s != "C") return "Fail C" |
| if (D().s != "D") return "Fail D" |
| |
| return "OK" |
| } |