diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/InterfaceDelegationLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/InterfaceDelegationLowering.kt index 50236a71931..990389ec234 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/InterfaceDelegationLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/InterfaceDelegationLowering.kt @@ -79,7 +79,7 @@ class InterfaceDelegationLowering(val state: GenerationState) : IrElementTransfo var shift = 0 if (inheritedFun.dispatchReceiverParameter != null) { - irCallImpl.putValueArgument(0, IrGetValueImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, irClass.descriptor.thisAsReceiverParameter)) + irCallImpl.putValueArgument(0, IrGetValueImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, interfaceFun.dispatchReceiverParameter!!)) shift = 1 } inheritedFun.valueParameters.mapIndexed { i, valueParameterDescriptor -> diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/InterfaceLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/InterfaceLowering.kt index 78f729c7fd2..d78efb98f28 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/InterfaceLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/InterfaceLowering.kt @@ -66,7 +66,8 @@ class InterfaceLowering(val state: GenerationState) : IrElementTransformerVoid() members.add(newFunction) it.body = null - val mapping: Map = (listOf(it.descriptor.containingDeclaration) + it.descriptor.valueParameters).zip(functionDescriptorImpl.valueParameters).toMap() + val mapping: Map = + (listOf(it.descriptor.dispatchReceiverParameter!!) + it.descriptor.valueParameters).zip(functionDescriptorImpl.valueParameters).toMap() newFunction.body?.transform(VariableRemapper(mapping), null) } @@ -100,12 +101,14 @@ class InterfaceLowering(val state: GenerationState) : IrElementTransformerVoid() CallableMemberDescriptor.Kind.DECLARATION, descriptor.source ) - val valueParameters = - listOf(ValueParameterDescriptorImpl.createWithDestructuringDeclarations( - newFunction, null, 0, AnnotationsImpl(emptyList()), Name.identifier("this"), - interfaceDescriptor.defaultType, false, false, false, false, null, interfaceDescriptor.source, null) - ) + - descriptor.valueParameters.map { it.copy(newFunction, it.name, it.index + 1) } + val dispatchReceiver = + ValueParameterDescriptorImpl.createWithDestructuringDeclarations( + newFunction, null, 0, AnnotationsImpl(emptyList()), Name.identifier("this"), + interfaceDescriptor.defaultType, false, false, false, false, null, interfaceDescriptor.source, null) + + val valueParameters = listOf(dispatchReceiver) + + descriptor.valueParameters.map { it.copy(newFunction, it.name, it.index + 1) } + newFunction.initialize( null, null, emptyList()/*TODO: type parameters*/, valueParameters, descriptor.returnType, Modality.FINAL, descriptor.visibility