Support property getters/setters in reflection
This commit is contained in:
@@ -28,6 +28,8 @@ open class KProperty0Impl<out R> : DescriptorBasedProperty, KProperty0<R>, KProp
|
||||
|
||||
override val name: String get() = descriptor.getName().asString()
|
||||
|
||||
override val getter by ReflectProperties.lazy { Getter(this) }
|
||||
|
||||
override val javaGetter: Method get() = super.javaGetter!!
|
||||
|
||||
override fun get(): R {
|
||||
@@ -39,11 +41,17 @@ open class KProperty0Impl<out R> : DescriptorBasedProperty, KProperty0<R>, KProp
|
||||
throw IllegalPropertyAccessException(e)
|
||||
}
|
||||
}
|
||||
|
||||
class Getter<out R>(override val property: KProperty0Impl<R>) : KPropertyImpl.Getter<R>, KProperty0.Getter<R> {
|
||||
override fun invoke(): R = property.get()
|
||||
}
|
||||
}
|
||||
|
||||
open class KMutableProperty0Impl<R> : KProperty0Impl<R>, KMutableProperty0<R>, KMutablePropertyImpl<R> {
|
||||
constructor(container: KCallableContainerImpl, name: String, signature: String) : super(container, name, signature)
|
||||
|
||||
override val setter by ReflectProperties.lazy { Setter(this) }
|
||||
|
||||
override val javaSetter: Method get() = super.javaSetter!!
|
||||
|
||||
override fun set(value: R) {
|
||||
@@ -54,6 +62,10 @@ open class KMutableProperty0Impl<R> : KProperty0Impl<R>, KMutableProperty0<R>, K
|
||||
throw IllegalPropertyAccessException(e)
|
||||
}
|
||||
}
|
||||
|
||||
class Setter<R>(override val property: KMutableProperty0Impl<R>) : KMutablePropertyImpl.Setter<R>, KMutableProperty0.Setter<R> {
|
||||
override fun invoke(value: R): Unit = property.set(value)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -18,11 +18,11 @@ package kotlin.reflect.jvm.internal
|
||||
|
||||
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
|
||||
import java.lang.reflect.Modifier
|
||||
import kotlin.jvm.internal.MutablePropertyReference1
|
||||
import kotlin.jvm.internal.PropertyReference1
|
||||
import kotlin.reflect.IllegalPropertyAccessException
|
||||
import kotlin.reflect.KMutableProperty1
|
||||
import kotlin.reflect.KProperty1
|
||||
import kotlin.jvm.internal.MutablePropertyReference1
|
||||
import kotlin.jvm.internal.PropertyReference1
|
||||
|
||||
open class KProperty1Impl<T, out R> : DescriptorBasedProperty, KProperty1<T, R>, KPropertyImpl<R> {
|
||||
constructor(container: KCallableContainerImpl, name: String, signature: String) : super(container, name, signature)
|
||||
@@ -31,6 +31,8 @@ open class KProperty1Impl<T, out R> : DescriptorBasedProperty, KProperty1<T, R>,
|
||||
|
||||
override val name: String get() = descriptor.getName().asString()
|
||||
|
||||
override val getter by ReflectProperties.lazy { Getter(this) }
|
||||
|
||||
// TODO: consider optimizing this, not to do complex checks on every access
|
||||
@suppress("UNCHECKED_CAST")
|
||||
override fun get(receiver: T): R {
|
||||
@@ -53,6 +55,10 @@ open class KProperty1Impl<T, out R> : DescriptorBasedProperty, KProperty1<T, R>,
|
||||
throw IllegalPropertyAccessException(e)
|
||||
}
|
||||
}
|
||||
|
||||
class Getter<T, out R>(override val property: KProperty1Impl<T, R>) : KPropertyImpl.Getter<R>, KProperty1.Getter<T, R> {
|
||||
override fun invoke(receiver: T): R = property.get(receiver)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -61,6 +67,8 @@ open class KMutableProperty1Impl<T, R> : KProperty1Impl<T, R>, KMutableProperty1
|
||||
|
||||
constructor(container: KCallableContainerImpl, descriptor: PropertyDescriptor) : super(container, descriptor)
|
||||
|
||||
override val setter by ReflectProperties.lazy { Setter(this) }
|
||||
|
||||
override fun set(receiver: T, value: R) {
|
||||
try {
|
||||
val setter = javaSetter ?:
|
||||
@@ -83,6 +91,10 @@ open class KMutableProperty1Impl<T, R> : KProperty1Impl<T, R>, KMutableProperty1
|
||||
throw IllegalPropertyAccessException(e)
|
||||
}
|
||||
}
|
||||
|
||||
class Setter<T, R>(override val property: KMutableProperty1Impl<T, R>) : KMutablePropertyImpl.Setter<R>, KMutableProperty1.Setter<T, R> {
|
||||
override fun invoke(receiver: T, value: R): Unit = property.set(receiver, value)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -30,6 +30,8 @@ open class KProperty2Impl<D, E, out R> : DescriptorBasedProperty, KProperty2<D,
|
||||
|
||||
override val name: String get() = descriptor.getName().asString()
|
||||
|
||||
override val getter by ReflectProperties.lazy { Getter(this) }
|
||||
|
||||
override val javaGetter: Method get() = super.javaGetter!!
|
||||
|
||||
override val javaField: Field? get() = null
|
||||
@@ -43,6 +45,10 @@ open class KProperty2Impl<D, E, out R> : DescriptorBasedProperty, KProperty2<D,
|
||||
throw IllegalPropertyAccessException(e)
|
||||
}
|
||||
}
|
||||
|
||||
class Getter<D, E, out R>(override val property: KProperty2Impl<D, E, R>) : KPropertyImpl.Getter<R>, KProperty2.Getter<D, E, R> {
|
||||
override fun invoke(receiver1: D, receiver2: E): R = property.get(receiver1, receiver2)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -51,6 +57,8 @@ class KMutableProperty2Impl<D, E, R> : KProperty2Impl<D, E, R>, KMutableProperty
|
||||
|
||||
constructor(container: KClassImpl<D>, descriptor: PropertyDescriptor) : super(container, descriptor)
|
||||
|
||||
override val setter by ReflectProperties.lazy { Setter(this) }
|
||||
|
||||
override val javaSetter: Method get() = super.javaSetter!!
|
||||
|
||||
override fun set(receiver1: D, receiver2: E, value: R) {
|
||||
@@ -61,4 +69,8 @@ class KMutableProperty2Impl<D, E, R> : KProperty2Impl<D, E, R>, KMutableProperty
|
||||
throw IllegalPropertyAccessException(e)
|
||||
}
|
||||
}
|
||||
|
||||
class Setter<D, E, R>(override val property: KMutableProperty2Impl<D, E, R>) : KMutablePropertyImpl.Setter<R>, KMutableProperty2.Setter<D, E, R> {
|
||||
override fun invoke(receiver1: D, receiver2: E, value: R): Unit = property.set(receiver1, receiver2, value)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -23,9 +23,25 @@ interface KPropertyImpl<out R> : KProperty<R>, KCallableImpl<R> {
|
||||
val javaField: Field?
|
||||
|
||||
val javaGetter: Method?
|
||||
|
||||
override val getter: Getter<R>
|
||||
|
||||
interface Accessor<out R> : KProperty.Accessor<R> {
|
||||
override val property: KPropertyImpl<R>
|
||||
}
|
||||
|
||||
interface Getter<out R> : KProperty.Getter<R>, KCallableImpl<R> {
|
||||
override val name: String get() = "<get-${property.name}>"
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
interface KMutablePropertyImpl<R> : KMutableProperty<R>, KPropertyImpl<R> {
|
||||
val javaSetter: Method?
|
||||
|
||||
override val setter: Setter<R>
|
||||
|
||||
interface Setter<R> : KMutableProperty.Setter<R>, KPropertyImpl.Accessor<R>, KCallableImpl<Unit> {
|
||||
override val name: String get() = "<set-${property.name}>"
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user