blob: a35754f8659e4125df22efefee3278dc0fc75691 [file] [log] [blame]
// Copyright (c) 2020, the R8 project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.kotlin.metadata.delegated_property_app
import kotlin.reflect.KMutableProperty1
import kotlin.reflect.KProperty
import kotlin.reflect.full.declaredMemberProperties
import kotlin.reflect.jvm.isAccessible
class Resource(private var s : String = "Initial string") {
override fun toString(): String {
return s;
}
}
object CustomDelegate {
private var resource : Resource = Resource()
operator fun getValue(thisRef: Any?, property: KProperty<*>): Resource {
println("$resource has been read in CustomDelegate from '${property.name}'")
return resource;
}
operator fun setValue(thisRef: Any?, property: KProperty<*>, value: Resource) {
println("$value has been assigned to '${property.name}'")
this.resource = resource;
}
}
open class Base {
fun doSomethingOnBarRef() : Resource {
var x by CustomDelegate
val propRef = x.javaClass.kotlin.declaredMemberProperties.first() as KMutableProperty1<Resource, String>
propRef.isAccessible = true
propRef.set(x, "New value")
propRef.get(x)
// Getting the delegate is not yet supported and will return null. We are printing the value
// allowing us to observe if the behavior changes.
println(propRef.getDelegate(x))
return x
}
}
object Impl : Base() {
operator fun invoke(): Impl {
return this
}
}
fun main() {
val impl = Impl()
impl.doSomethingOnBarRef()
}