diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/DelegationLowering.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/DelegationLowering.kt index 402e51e7954..d23e32ab090 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/DelegationLowering.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/DelegationLowering.kt @@ -105,20 +105,19 @@ internal class PropertyDelegationLowering(val context: Context) : FileLoweringPa override fun visitPropertyReference(expression: IrPropertyReference): IrExpression { expression.transformChildrenVoid(this) - val kTypeGenerator = KTypeGenerator(context, irFile, expression) val startOffset = expression.startOffset val endOffset = expression.endOffset val irBuilder = context.createIrBuilder(currentScope!!.scope.scopeOwnerSymbol, startOffset, endOffset) irBuilder.run { val receiversCount = listOf(expression.dispatchReceiver, expression.extensionReceiver).count { it != null } return when (receiversCount) { - 1 -> createKProperty(expression, kTypeGenerator, this) // Has receiver. + 1 -> createKProperty(expression, this) // Has receiver. 2 -> error("Callable reference to properties with two receivers is not allowed: ${expression.symbol.owner.name}") else -> { // Cache KProperties with no arguments. val field = kProperties.getOrPut(expression.symbol.owner) { - createKProperty(expression, kTypeGenerator, this) to kProperties.size + createKProperty(expression, this) to kProperties.size } irCall(arrayItemGetter).apply { @@ -171,7 +170,6 @@ internal class PropertyDelegationLowering(val context: Context) : FileLoweringPa private fun createKProperty( expression: IrPropertyReference, - kTypeGenerator: KTypeGenerator, irBuilder: IrBuilderWithScope ): IrExpression { val startOffset = expression.startOffset @@ -252,11 +250,10 @@ internal class PropertyDelegationLowering(val context: Context) : FileLoweringPa isMutable = setterCallableReference != null) val initializer = irCall(symbol.owner, constructorTypeArguments).apply { putValueArgument(0, irString(expression.symbol.owner.name.asString())) - putValueArgument(1, with(kTypeGenerator) { irKType(returnType) }) if (getterCallableReference != null) - putValueArgument(2, getterCallableReference) + putValueArgument(1, getterCallableReference) if (setterCallableReference != null) - putValueArgument(3, setterCallableReference) + putValueArgument(2, setterCallableReference) } +initializer } diff --git a/kotlin-native/runtime/src/main/kotlin/kotlin/native/internal/KPropertyImpl.kt b/kotlin-native/runtime/src/main/kotlin/kotlin/native/internal/KPropertyImpl.kt index d80b74cabb1..92c24fa3e24 100644 --- a/kotlin-native/runtime/src/main/kotlin/kotlin/native/internal/KPropertyImpl.kt +++ b/kotlin-native/runtime/src/main/kotlin/kotlin/native/internal/KPropertyImpl.kt @@ -9,14 +9,21 @@ import kotlin.UnsupportedOperationException import kotlin.reflect.* @FixmeReflection -open class KProperty0Impl(override val name: String, override val returnType: KType, val getter: () -> R): KProperty0 { +abstract class KProperty0ImplBase : KProperty0 { + abstract val getter: KFunction0 + override val returnType get() = getter.returnType + override fun get(): R { return getter() } + override fun invoke(): R { return getter() } +} +@FixmeReflection +final class KProperty0Impl(override val name: String, override val getter: KFunction0) : KProperty0ImplBase() { override fun equals(other: Any?): Boolean { val otherKProperty = other as? KProperty0Impl<*> if (otherKProperty == null) return false @@ -33,14 +40,21 @@ open class KProperty0Impl(override val name: String, override val returnT } @FixmeReflection -open class KProperty1Impl(override val name: String, override val returnType: KType, val getter: (T) -> R): KProperty1 { +abstract class KProperty1ImplBase : KProperty1 { + abstract val getter: KFunction1 + override val returnType get() = getter.returnType + override fun get(receiver: T): R { return getter(receiver) } + override fun invoke(p1: T): R { return getter(p1) } +} +@FixmeReflection +class KProperty1Impl(override val name: String, override val getter: KFunction1) : KProperty1ImplBase() { override fun equals(other: Any?): Boolean { val otherKProperty = other as? KProperty1Impl<*, *> if (otherKProperty == null) return false @@ -56,15 +70,24 @@ open class KProperty1Impl(override val name: String, override val retu } } + @FixmeReflection -open class KProperty2Impl(override val name: String, override val returnType: KType, val getter: (T1, T2) -> R): KProperty2 { +abstract class KProperty2ImplBase : KProperty2 { + abstract val getter: KFunction2 + override val returnType get() = getter.returnType + override fun get(receiver1: T1, receiver2: T2): R { return getter(receiver1, receiver2) } + override fun invoke(p1: T1, p2: T2): R { return getter(p1, p2) } +} +@FixmeReflection +class KProperty2Impl(override val name: String, override val getter: KFunction2) + : KProperty2ImplBase() { override fun equals(other: Any?): Boolean { val otherKProperty = other as? KProperty2Impl<*, *, *> if (otherKProperty == null) return false @@ -80,9 +103,10 @@ open class KProperty2Impl(override val name: String, override val } } + @FixmeReflection -class KMutableProperty0Impl(name: String, returnType: KType, getter: () -> R, val setter: (R) -> Unit) - : KProperty0Impl(name, returnType, getter), KMutableProperty0 { +class KMutableProperty0Impl(override val name: String, override val getter: KFunction0, val setter: (R) -> Unit) + : KProperty0ImplBase(), KMutableProperty0 { override fun set(value: R): Unit { setter(value) } @@ -103,8 +127,8 @@ class KMutableProperty0Impl(name: String, returnType: KType, getter: () -> R, } @FixmeReflection -class KMutableProperty1Impl(name: String, returnType: KType, getter: (T) -> R, val setter: (T, R) -> Unit) - : KProperty1Impl(name, returnType, getter), KMutableProperty1 { +class KMutableProperty1Impl(override val name: String, override val getter: KFunction1, val setter: (T, R) -> Unit) + : KProperty1ImplBase(), KMutableProperty1 { override fun set(receiver: T, value: R): Unit { setter(receiver, value) } @@ -125,14 +149,17 @@ class KMutableProperty1Impl(name: String, returnType: KType, getter: (T) - } @FixmeReflection -class KMutableProperty2Impl(name: String, returnType: KType, getter: (T1, T2) -> R, val setter: (T1, T2, R) -> Unit) - : KProperty2Impl(name, returnType, getter), KMutableProperty2 { +class KMutableProperty2Impl( + override val name: String, + override val getter: KFunction2, + val setter: (T1, T2, R) -> Unit) + : KProperty2ImplBase(), KMutableProperty2 { override fun set(receiver1: T1, receiver2: T2, value: R): Unit { setter(receiver1, receiver2, value) } override fun equals(other: Any?): Boolean { - val otherKProperty = other as? KMutableProperty2Impl<* ,*, *> + val otherKProperty = other as? KMutableProperty2Impl<*, *, *> if (otherKProperty == null) return false return name == otherKProperty.name && getter == otherKProperty.getter && setter == otherKProperty.setter } @@ -146,20 +173,24 @@ class KMutableProperty2Impl(name: String, returnType: KType, getter: } } -open class KLocalDelegatedPropertyImpl(override val name: String, override val returnType: KType): KProperty0 { +abstract class KLocalDelegatedPropertyImplBase : KProperty0 { override fun get(): R { throw UnsupportedOperationException("Not supported for local property reference.") } + override fun invoke(): R { throw UnsupportedOperationException("Not supported for local property reference.") } +} +class KLocalDelegatedPropertyImpl(override val name: String, override val returnType: KType) : KLocalDelegatedPropertyImplBase() { override fun toString(): String { return "property $name (Kotlin reflection is not available)" } } -class KLocalDelegatedMutablePropertyImpl(name: String, returnType: KType): KLocalDelegatedPropertyImpl(name, returnType), KMutableProperty0 { +class KLocalDelegatedMutablePropertyImpl(override val name: String, override val returnType: KType) : + KLocalDelegatedPropertyImplBase(), KMutableProperty0 { override fun set(value: R): Unit { throw UnsupportedOperationException("Not supported for local property reference.") }