Support property getters/setters in reflection

This commit is contained in:
Alexander Udalov
2015-07-01 19:08:31 +03:00
parent 749d0c4a52
commit 4f1247f03f
18 changed files with 297 additions and 4 deletions
@@ -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}>"
}
}