| // TARGET_BACKEND: JVM | |
| // WITH_REFLECT | |
| // FULL_JDK | |
| import java.lang.reflect.InvocationTargetException | |
| import kotlin.reflect.* | |
| object Delegate { | |
| operator fun getValue(t: Any?, p: KProperty<*>): String { | |
| (p as? KProperty0<String>)?.get() | |
| (p as? KProperty1<O, String>)?.get(O) | |
| (p as? KProperty2<O, O, String>)?.get(O, O) | |
| return "Fail" | |
| } | |
| operator fun setValue(t: Any?, p: KProperty<*>, v: String) { | |
| (p as? KMutableProperty0<String>)?.set(v) | |
| (p as? KMutableProperty1<O, String>)?.set(O, v) | |
| (p as? KMutableProperty2<O, O, String>)?.set(O, O, v) | |
| } | |
| } | |
| var topLevel: String by Delegate | |
| object O { | |
| var member: String by Delegate | |
| var O.memExt: String by Delegate | |
| } | |
| fun check(lambda: () -> Unit) { | |
| try { | |
| lambda() | |
| } catch (e: Throwable) { | |
| if (e !is InvocationTargetException && e !is StackOverflowError) { | |
| throw RuntimeException("The current implementation uses reflection to get the value of the property," + | |
| "so either InvocationTargetException or StackOverflowError should have happened", | |
| e) | |
| } | |
| return | |
| } | |
| throw AssertionError("Getting the property value with .get() from getValue() or setting it with .set() in setValue() " + | |
| "is effectively an endless recursion and should fail") | |
| } | |
| fun box(): String { | |
| check { topLevel } | |
| check { topLevel = "" } | |
| check { O.member } | |
| check { O.member = "" } | |
| with (O) { | |
| check { O.memExt } | |
| check { O.memExt = "" } | |
| } | |
| return "OK" | |
| } |