blob: f46a3f6deeaa16116106bf750b1122cb9f94d03e [file] [log] [blame]
// 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"
}