From cd703868d4843f2bde432f904e451fd2e166aabd Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Tue, 6 Sep 2016 17:26:11 +0300 Subject: [PATCH] Inherit KPropertyImpl.Accessor from KCallableImpl This is needed to make KCallableImpl a class --- .../reflect/jvm/internal/KPropertyImpl.kt | 59 +++++++------------ 1 file changed, 20 insertions(+), 39 deletions(-) diff --git a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KPropertyImpl.kt b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KPropertyImpl.kt index 3f2fe344f84..8a20e8e1bd5 100644 --- a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KPropertyImpl.kt +++ b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KPropertyImpl.kt @@ -23,6 +23,7 @@ import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.types.TypeUtils import java.lang.reflect.Field import java.lang.reflect.Modifier +import kotlin.reflect.KFunction import kotlin.reflect.KMutableProperty import kotlin.reflect.KProperty import kotlin.reflect.KotlinReflectionInternalError @@ -48,41 +49,27 @@ internal interface KPropertyImpl : KProperty, KCallableImpl { override val isConst: Boolean get() = descriptor.isConst - abstract class Accessor : KProperty.Accessor { - abstract override val property: KPropertyImpl + abstract class Accessor : + KCallableImpl, KProperty.Accessor, KFunction { + abstract override val property: KPropertyImpl - internal abstract val descriptor: PropertyAccessorDescriptor - - @Suppress("unused") // Used as an implementation of KFunction#isInline in subclasses - val isInline: Boolean - get() = descriptor.isInline - - @Suppress("unused") - val isExternal: Boolean - get() = descriptor.isExternal - - @Suppress("unused") - val isOperator: Boolean - get() = descriptor.isOperator - - @Suppress("unused") - val isInfix: Boolean - get() = descriptor.isInfix - - @Suppress("unused") - val isTailrec: Boolean - get() = descriptor.isTailrec - - @Suppress("unused") - val isSuspend: Boolean - get() = descriptor.isSuspend - } - - abstract class Getter : Accessor(), KProperty.Getter, KCallableImpl { - override val name: String get() = "" + abstract override val descriptor: PropertyAccessorDescriptor override val container: KDeclarationContainerImpl get() = property.container + override val defaultCaller: FunctionCaller<*>? get() = null + + override val isInline: Boolean get() = descriptor.isInline + override val isExternal: Boolean get() = descriptor.isExternal + override val isOperator: Boolean get() = descriptor.isOperator + override val isInfix: Boolean get() = descriptor.isInfix + override val isTailrec: Boolean get() = descriptor.isTailrec + override val isSuspend: Boolean get() = descriptor.isSuspend + } + + abstract class Getter : Accessor(), KProperty.Getter { + override val name: String get() = "" + override val descriptor: PropertyGetterDescriptor by ReflectProperties.lazySoft { // TODO: default getter created this way won't have any source information property.descriptor.getter ?: DescriptorFactory.createDefaultGetter(property.descriptor, Annotations.EMPTY) @@ -91,15 +78,11 @@ internal interface KPropertyImpl : KProperty, KCallableImpl { override val caller: FunctionCaller<*> by ReflectProperties.lazySoft { computeCallerForAccessor(isGetter = true) } - - override val defaultCaller: FunctionCaller<*>? get() = null } - abstract class Setter : Accessor(), KMutableProperty.Setter, KCallableImpl { + abstract class Setter : Accessor(), KMutableProperty.Setter { override val name: String get() = "" - override val container: KDeclarationContainerImpl get() = property.container - override val descriptor: PropertySetterDescriptor by ReflectProperties.lazySoft { // TODO: default setter created this way won't have any source information property.descriptor.setter ?: DescriptorFactory.createDefaultSetter(property.descriptor, Annotations.EMPTY) @@ -108,13 +91,11 @@ internal interface KPropertyImpl : KProperty, KCallableImpl { override val caller: FunctionCaller<*> by ReflectProperties.lazySoft { computeCallerForAccessor(isGetter = false) } - - override val defaultCaller: FunctionCaller<*>? get() = null } } -private fun KPropertyImpl.Accessor<*>.computeCallerForAccessor(isGetter: Boolean): FunctionCaller<*> { +private fun KPropertyImpl.Accessor<*, *>.computeCallerForAccessor(isGetter: Boolean): FunctionCaller<*> { fun isInsideClassCompanionObject(): Boolean { val possibleCompanionObject = property.descriptor.containingDeclaration if (DescriptorUtils.isCompanionObject(possibleCompanionObject) && !DescriptorUtils.isInterface(possibleCompanionObject.containingDeclaration)) {