From 0fa6b40731682bb35ccaf8097cfc6fd15b2ed172 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Tue, 24 Jun 2014 19:45:50 +0400 Subject: [PATCH] Make intermediate *Impl properties traits, not classes Otherwise multiple inheritance of classes would be needed to make implementations inherit correctly for mutable properties --- .../kotlin/reflect/jvm/internal/KCallableImpl.kt | 4 +--- .../reflect/jvm/internal/KExtensionPropertyImpl.kt | 10 +++++----- .../reflect/jvm/internal/KMemberPropertyImpl.kt | 6 +++--- .../kotlin/reflect/jvm/internal/KPropertyImpl.kt | 13 +++++++------ .../reflect/jvm/internal/KTopLevelPropertyImpl.kt | 10 +++++----- .../kotlin/reflect/jvm/internal/KVariableImpl.kt | 9 ++------- 6 files changed, 23 insertions(+), 29 deletions(-) diff --git a/core/runtime.jvm/src/kotlin/reflect/jvm/internal/KCallableImpl.kt b/core/runtime.jvm/src/kotlin/reflect/jvm/internal/KCallableImpl.kt index cd3b87eabe9..0164fcbc513 100644 --- a/core/runtime.jvm/src/kotlin/reflect/jvm/internal/KCallableImpl.kt +++ b/core/runtime.jvm/src/kotlin/reflect/jvm/internal/KCallableImpl.kt @@ -16,6 +16,4 @@ package kotlin.reflect.jvm.internal -abstract class KCallableImpl( - public override val name: String -) : KCallable +trait KCallableImpl : KCallable diff --git a/core/runtime.jvm/src/kotlin/reflect/jvm/internal/KExtensionPropertyImpl.kt b/core/runtime.jvm/src/kotlin/reflect/jvm/internal/KExtensionPropertyImpl.kt index 0850703dad6..c39464c9b32 100644 --- a/core/runtime.jvm/src/kotlin/reflect/jvm/internal/KExtensionPropertyImpl.kt +++ b/core/runtime.jvm/src/kotlin/reflect/jvm/internal/KExtensionPropertyImpl.kt @@ -19,12 +19,12 @@ package kotlin.reflect.jvm.internal import java.lang.reflect.Method open class KExtensionPropertyImpl( - name: String, + public override val name: String, protected val owner: KPackageImpl, protected val receiverClass: Class -) : KExtensionProperty, KPropertyImpl(name) { +) : KExtensionProperty, KPropertyImpl { // TODO: extract, make lazy (weak?), use our descriptors knowledge, support Java fields - protected val getter: Method = owner.jClass.getMethod(getterName(name), receiverClass) + val getter: Method = owner.jClass.getMethod(getterName(name), receiverClass) override fun get(receiver: T): R { return getter(null, receiver) as R @@ -35,8 +35,8 @@ class KMutableExtensionPropertyImpl( name: String, owner: KPackageImpl, receiverClass: Class -) : KMutableExtensionProperty, KExtensionPropertyImpl(name, owner, receiverClass) { - private val setter = owner.jClass.getMethod(setterName(name), receiverClass, getter.getReturnType()!!) +) : KMutableExtensionProperty, KMutablePropertyImpl, KExtensionPropertyImpl(name, owner, receiverClass) { + val setter = owner.jClass.getMethod(setterName(name), receiverClass, getter.getReturnType()!!) override fun set(receiver: T, value: R) { setter.invoke(null, receiver, value) diff --git a/core/runtime.jvm/src/kotlin/reflect/jvm/internal/KMemberPropertyImpl.kt b/core/runtime.jvm/src/kotlin/reflect/jvm/internal/KMemberPropertyImpl.kt index 86ad94691aa..f44573619fd 100644 --- a/core/runtime.jvm/src/kotlin/reflect/jvm/internal/KMemberPropertyImpl.kt +++ b/core/runtime.jvm/src/kotlin/reflect/jvm/internal/KMemberPropertyImpl.kt @@ -20,9 +20,9 @@ import java.lang.reflect.Field import java.lang.reflect.Method open class KMemberPropertyImpl( - name: String, + public override val name: String, protected val owner: KClassImpl -) : KMemberProperty, KPropertyImpl(name) { +) : KMemberProperty, KPropertyImpl { val field: Field? = if (owner.origin == KClassOrigin.FOREIGN) { owner.jClass.getField(name) @@ -48,7 +48,7 @@ open class KMemberPropertyImpl( class KMutableMemberPropertyImpl( name: String, owner: KClassImpl -) : KMutableMemberProperty, KMemberPropertyImpl(name, owner) { +) : KMutableMemberProperty, KMutablePropertyImpl, KMemberPropertyImpl(name, owner) { val setter: Method? = if (owner.origin == KClassOrigin.KOTLIN) { owner.jClass.getMaybeDeclaredMethod(setterName(name), getter!!.getReturnType()!!) diff --git a/core/runtime.jvm/src/kotlin/reflect/jvm/internal/KPropertyImpl.kt b/core/runtime.jvm/src/kotlin/reflect/jvm/internal/KPropertyImpl.kt index 8dbf08339a5..f4cbba5ff10 100644 --- a/core/runtime.jvm/src/kotlin/reflect/jvm/internal/KPropertyImpl.kt +++ b/core/runtime.jvm/src/kotlin/reflect/jvm/internal/KPropertyImpl.kt @@ -16,11 +16,12 @@ package kotlin.reflect.jvm.internal -abstract class KPropertyImpl( - name: String -) : KProperty, KCallableImpl(name) +import java.lang.reflect.* + +trait KPropertyImpl : KProperty, KCallableImpl { + +} -abstract class KMutablePropertyImpl( - name: String -) : KMutableProperty, KPropertyImpl(name) +trait KMutablePropertyImpl : KMutableProperty, KPropertyImpl { +} diff --git a/core/runtime.jvm/src/kotlin/reflect/jvm/internal/KTopLevelPropertyImpl.kt b/core/runtime.jvm/src/kotlin/reflect/jvm/internal/KTopLevelPropertyImpl.kt index b386d0c1a6a..6ae1177d3ed 100644 --- a/core/runtime.jvm/src/kotlin/reflect/jvm/internal/KTopLevelPropertyImpl.kt +++ b/core/runtime.jvm/src/kotlin/reflect/jvm/internal/KTopLevelPropertyImpl.kt @@ -19,11 +19,11 @@ package kotlin.reflect.jvm.internal import java.lang.reflect.Method open class KTopLevelPropertyImpl( - name: String, + public override val name: String, protected val owner: KPackageImpl -) : KTopLevelProperty, KVariableImpl(name) { +) : KTopLevelProperty, KVariableImpl { // TODO: extract, make lazy (weak?), use our descriptors knowledge, support Java fields - protected val getter: Method = owner.jClass.getMethod(getterName(name)) + val getter: Method = owner.jClass.getMethod(getterName(name)) override fun get(): R { return getter(null) as R @@ -33,8 +33,8 @@ open class KTopLevelPropertyImpl( class KMutableTopLevelPropertyImpl( name: String, owner: KPackageImpl -) : KMutableTopLevelProperty, KTopLevelPropertyImpl(name, owner) { - private val setter = owner.jClass.getMethod(setterName(name), getter.getReturnType()!!) +) : KMutableTopLevelProperty, KMutableVariableImpl, KTopLevelPropertyImpl(name, owner) { + val setter = owner.jClass.getMethod(setterName(name), getter.getReturnType()!!) override fun set(value: R) { setter.invoke(null, value) diff --git a/core/runtime.jvm/src/kotlin/reflect/jvm/internal/KVariableImpl.kt b/core/runtime.jvm/src/kotlin/reflect/jvm/internal/KVariableImpl.kt index 9932b7559a5..5fac1d5141a 100644 --- a/core/runtime.jvm/src/kotlin/reflect/jvm/internal/KVariableImpl.kt +++ b/core/runtime.jvm/src/kotlin/reflect/jvm/internal/KVariableImpl.kt @@ -16,11 +16,6 @@ package kotlin.reflect.jvm.internal -abstract class KVariableImpl( - name: String -) : KVariable, KPropertyImpl(name) +trait KVariableImpl : KVariable, KPropertyImpl - -abstract class KMutableVariableImpl( - name: String -) : KMutableVariable, KVariableImpl(name) +trait KMutableVariableImpl : KMutableVariable, KVariableImpl, KMutablePropertyImpl