From 2bf73ccfe5a384f7b3105724f38df1d66761dce6 Mon Sep 17 00:00:00 2001 From: Igor Chevdar Date: Wed, 17 Jun 2020 00:02:40 +0500 Subject: [PATCH] [IR] Supported extension receivers in SAM conversions --- .../backend/common/lower/SingleAbstractMethodLowering.kt | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/SingleAbstractMethodLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/SingleAbstractMethodLowering.kt index 09cd40da14f..c05c9f19f9d 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/SingleAbstractMethodLowering.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/SingleAbstractMethodLowering.kt @@ -147,13 +147,14 @@ abstract class SingleAbstractMethodLowering(val context: CommonBackendContext) : val inlinePrefix = if (wrapperVisibility == Visibilities.PUBLIC) "\$i" else "" val wrapperName = Name.identifier("sam$inlinePrefix\$$superFqName$SAM_WRAPPER_SUFFIX") val superMethod = superClass.functions.single { it.modality == Modality.ABSTRACT } + val extensionReceiversCount = if (superMethod.extensionReceiverParameter == null) 0 else 1 // TODO: have psi2ir cast the argument to the correct function type. Also see the TODO // about type parameters in `visitTypeOperator`. val wrappedFunctionClass = if (superMethod.isSuspend) - context.ir.symbols.suspendFunctionN(superMethod.valueParameters.size).owner + context.ir.symbols.suspendFunctionN(superMethod.valueParameters.size + extensionReceiversCount).owner else - context.ir.symbols.functionN(superMethod.valueParameters.size).owner + context.ir.symbols.functionN(superMethod.valueParameters.size + extensionReceiversCount).owner val wrappedFunctionType = wrappedFunctionClass.defaultType val subclass = buildClass { @@ -204,11 +205,13 @@ abstract class SingleAbstractMethodLowering(val context: CommonBackendContext) : }.apply { overriddenSymbols = listOf(superMethod.symbol) dispatchReceiverParameter = subclass.thisReceiver!!.copyTo(this) + extensionReceiverParameter = superMethod.extensionReceiverParameter?.copyTo(this) valueParameters = superMethod.valueParameters.map { it.copyTo(this) } body = context.createIrBuilder(symbol).irBlockBody { +irReturn(irCall(wrappedFunctionClass.functions.single { it.name == OperatorNameConventions.INVOKE }).apply { dispatchReceiver = irGetField(irGet(dispatchReceiverParameter!!), field) - valueParameters.forEachIndexed { i, parameter -> putValueArgument(i, irGet(parameter)) } + extensionReceiverParameter?.let { putValueArgument(0, irGet(it)) } + valueParameters.forEachIndexed { i, parameter -> putValueArgument(extensionReceiversCount + i, irGet(parameter)) } }) } }