From 289cc8fed70a50c3d612989534ff2e2ef91503a6 Mon Sep 17 00:00:00 2001 From: Michael Bogdanov Date: Thu, 6 Oct 2016 14:17:29 +0300 Subject: [PATCH] Added extension receiver procesing on interface lowering --- .../kotlin/backend/jvm/lower/InterfaceLowering.kt | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) 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 21ea4fe3a82..71990aa4e70 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,10 @@ class InterfaceLowering(val state: GenerationState) : IrElementTransformerVoid() it.body = null val mapping: Map = - (listOf(it.descriptor.dispatchReceiverParameter!!) + it.descriptor.valueParameters).zip(functionDescriptorImpl.valueParameters).toMap() + ( + listOf(it.descriptor.dispatchReceiverParameter!!, it.descriptor.extensionReceiverParameter).filterNotNull() + + it.descriptor.valueParameters + ).zip(functionDescriptorImpl.valueParameters).toMap() newFunction.body?.transform(VariableRemapper(mapping), null) } @@ -110,8 +113,14 @@ class InterfaceLowering(val state: GenerationState) : IrElementTransformerVoid() ValueParameterDescriptorImpl.createWithDestructuringDeclarations( newFunction, null, 0, AnnotationsImpl(emptyList()), Name.identifier("this"), interfaceDescriptor.defaultType, false, false, false, false, null, interfaceDescriptor.source, null) + val oldExtensionReceiver = descriptor.extensionReceiverParameter + val extensionReceiver = if (oldExtensionReceiver != null ) + ValueParameterDescriptorImpl.createWithDestructuringDeclarations( + newFunction, null, 1, AnnotationsImpl(emptyList()), Name.identifier("receiver"), + oldExtensionReceiver.value.type, false, false, false, false, null, oldExtensionReceiver.source, null) + else null - val valueParameters = listOf(dispatchReceiver) + + val valueParameters = listOf(dispatchReceiver, extensionReceiver).filterNotNull() + descriptor.valueParameters.map { it.copy(newFunction, it.name, it.index + 1) } newFunction.initialize(