From f66b475867501ed86ef57cc0d08b9fdeab6df0f2 Mon Sep 17 00:00:00 2001 From: Georgy Bronnikov Date: Wed, 24 Jul 2019 15:17:49 +0300 Subject: [PATCH] Create wrapped receiver descriptors where needed --- .../common/descriptors/WrappedDescriptors.kt | 8 +------ .../kotlin/backend/common/ir/IrUtils.kt | 22 ++++++++++++++----- .../lower/AbstractSuspendFunctionsLowering.kt | 6 ++--- .../backend/jvm/lower/BridgeLowering.kt | 8 ++++++- .../jvm/lower/CallableReferenceLowering.kt | 3 ++- .../MemoizedInlineClassReplacements.kt | 11 ++++++---- 6 files changed, 36 insertions(+), 22 deletions(-) diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/descriptors/WrappedDescriptors.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/descriptors/WrappedDescriptors.kt index daed67b7954..6a5baaf0f32 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/descriptors/WrappedDescriptors.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/descriptors/WrappedDescriptors.kt @@ -394,13 +394,7 @@ open class WrappedSimpleFunctionDescriptor( (containingDeclaration as ClassDescriptor).thisAsReceiverParameter } - val extensionReceiver by lazy { - owner.extensionReceiverParameter?.let { - ReceiverParameterDescriptorImpl(this, ExtensionReceiver(it.descriptor, it.type.toKotlinType(), null), Annotations.EMPTY) - } - } - - override fun getExtensionReceiverParameter() = extensionReceiver + override fun getExtensionReceiverParameter() = owner.extensionReceiverParameter?.descriptor as? ReceiverParameterDescriptor override fun getTypeParameters() = owner.typeParameters.map { it.descriptor } override fun getValueParameters() = owner.valueParameters .asSequence() diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/IrUtils.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/IrUtils.kt index 128f269266d..797707474cf 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/IrUtils.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/IrUtils.kt @@ -23,6 +23,7 @@ import org.jetbrains.kotlin.backend.common.descriptors.* import org.jetbrains.kotlin.backend.common.lower.VariableRemapper import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.Modality +import org.jetbrains.kotlin.descriptors.ReceiverParameterDescriptor import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.descriptors.annotations.Annotations import org.jetbrains.kotlin.ir.IrElement @@ -151,9 +152,14 @@ fun IrValueParameter.copyTo( varargElementType: IrType? = this.varargElementType, defaultValue: IrExpressionBody? = this.defaultValue, isCrossinline: Boolean = this.isCrossinline, - isNoinline: Boolean = this.isNoinline + isNoinline: Boolean = this.isNoinline, + receiverToValue: Boolean = false ): IrValueParameter { - val descriptor = WrappedValueParameterDescriptor(symbol.descriptor.annotations, symbol.descriptor.source) + val descriptor = if (this.descriptor is ReceiverParameterDescriptor && !receiverToValue) { + WrappedReceiverParameterDescriptor(this.descriptor.annotations, this.descriptor.source) + } else { + WrappedValueParameterDescriptor(this.descriptor.annotations, this.descriptor.source) + } val symbol = IrValueParameterSymbolImpl(descriptor) val defaultValueCopy = defaultValue?.deepCopyWithVariables() defaultValueCopy?.patchDeclarationParents(irFunction) @@ -256,7 +262,8 @@ fun IrFunction.copyValueParametersToStatic( origin = originalDispatchReceiver.origin, index = shift++, type = type, - name = Name.identifier("\$this") + name = Name.identifier("\$this"), + receiverToValue = true ) ) } @@ -266,7 +273,8 @@ fun IrFunction.copyValueParametersToStatic( target, origin = originalExtensionReceiver.origin, index = shift++, - name = Name.identifier("\$receiver") + name = Name.identifier("\$receiver"), + receiverToValue = true ) ) } @@ -533,12 +541,14 @@ fun createStaticFunctionWithReceivers( this, name = Name.identifier("this"), index = offset++, - type = dispatchReceiverType!! + type = dispatchReceiverType!!, + receiverToValue = true ) val extensionReceiver = oldFunction.extensionReceiverParameter?.copyTo( this, name = Name.identifier("receiver"), - index = offset++ + index = offset++, + receiverToValue = true ) valueParameters.addAll(listOfNotNull(dispatchReceiver, extensionReceiver) + oldFunction.valueParameters.map { it.copyTo(this, index = it.index + offset) } diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/AbstractSuspendFunctionsLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/AbstractSuspendFunctionsLowering.kt index fd417f73394..f0b93f0992a 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/AbstractSuspendFunctionsLowering.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/AbstractSuspendFunctionsLowering.kt @@ -400,7 +400,7 @@ abstract class AbstractSuspendFunctionsLowering(val co coroutineConstructors += this functionParameters.mapIndexedTo(valueParameters) { index, parameter -> - parameter.copyTo(this, DECLARATION_ORIGIN_COROUTINE_IMPL, index) + parameter.copyTo(this, DECLARATION_ORIGIN_COROUTINE_IMPL, index, receiverToValue = true) } val continuationParameter = coroutineBaseClassConstructor.valueParameters[0] valueParameters += continuationParameter.copyTo( @@ -445,7 +445,7 @@ abstract class AbstractSuspendFunctionsLowering(val co coroutineConstructors += this boundParams.mapIndexedTo(valueParameters) { index, parameter -> - parameter.copyTo(this, DECLARATION_ORIGIN_COROUTINE_IMPL, index) + parameter.copyTo(this, DECLARATION_ORIGIN_COROUTINE_IMPL, index, receiverToValue = true) } val irBuilder = context.createIrBuilder(symbol, startOffset, endOffset) @@ -497,7 +497,7 @@ abstract class AbstractSuspendFunctionsLowering(val co (unboundArgs + create1CompletionParameter) .mapIndexedTo(valueParameters) { index, parameter -> - parameter.copyTo(this, DECLARATION_ORIGIN_COROUTINE_IMPL, index) + parameter.copyTo(this, DECLARATION_ORIGIN_COROUTINE_IMPL, index, receiverToValue = true) } this.createDispatchReceiverParameter() diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/BridgeLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/BridgeLowering.kt index 35041ed3d50..55f76684ad1 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/BridgeLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/BridgeLowering.kt @@ -10,6 +10,7 @@ import org.jetbrains.kotlin.backend.common.bridges.FunctionHandle import org.jetbrains.kotlin.backend.common.bridges.findAllReachableDeclarations import org.jetbrains.kotlin.backend.common.bridges.findConcreteSuperDeclaration import org.jetbrains.kotlin.backend.common.bridges.generateBridges +import org.jetbrains.kotlin.backend.common.descriptors.WrappedReceiverParameterDescriptor import org.jetbrains.kotlin.backend.common.descriptors.WrappedSimpleFunctionDescriptor import org.jetbrains.kotlin.backend.common.descriptors.WrappedValueParameterDescriptor import org.jetbrains.kotlin.backend.common.ir.* @@ -23,6 +24,7 @@ import org.jetbrains.kotlin.backend.jvm.JvmLoweredDeclarationOrigin import org.jetbrains.kotlin.backend.jvm.ir.eraseTypeParameters import org.jetbrains.kotlin.backend.jvm.ir.hasJvmDefault import org.jetbrains.kotlin.descriptors.Modality +import org.jetbrains.kotlin.descriptors.ReceiverParameterDescriptor import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET import org.jetbrains.kotlin.ir.builders.* @@ -320,7 +322,11 @@ private class BridgeLowering(val context: JvmBackendContext) : ClassLoweringPass } private fun IrValueParameter.copyWithTypeErasure(target: IrSimpleFunction): IrValueParameter { - val descriptor = WrappedValueParameterDescriptor(this.descriptor.annotations) + val descriptor = if (this.descriptor is ReceiverParameterDescriptor) { + WrappedReceiverParameterDescriptor(this.descriptor.annotations) + } else { + WrappedValueParameterDescriptor(this.descriptor.annotations) + } return IrValueParameterImpl( UNDEFINED_OFFSET, UNDEFINED_OFFSET, IrDeclarationOrigin.BRIDGE, diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/CallableReferenceLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/CallableReferenceLowering.kt index 47934fa5ed6..637b5769e37 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/CallableReferenceLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/CallableReferenceLowering.kt @@ -240,7 +240,8 @@ internal class CallableReferenceLowering(val context: JvmBackendContext) : FileL valueParameters += param.copyTo( this, index = valueParameters.size, - type = param.type.substitute(typeArgumentsMap) + type = param.type.substitute(typeArgumentsMap), + receiverToValue = true ) } diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/inlineclasses/MemoizedInlineClassReplacements.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/inlineclasses/MemoizedInlineClassReplacements.kt index 0bb714740ba..e1cec83d633 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/inlineclasses/MemoizedInlineClassReplacements.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/inlineclasses/MemoizedInlineClassReplacements.kt @@ -123,11 +123,14 @@ class MemoizedInlineClassReplacements { for ((index, parameter) in function.explicitParameters.withIndex()) { val name = if (parameter == function.extensionReceiverParameter) Name.identifier("\$receiver") else parameter.name - val newParameter = parameter.copyTo(this, index = index - 1, name = name) - if (parameter == function.dispatchReceiverParameter) + val newParameter: IrValueParameter + if (parameter == function.dispatchReceiverParameter) { + newParameter = parameter.copyTo(this, index = -1, name = name) dispatchReceiverParameter = newParameter - else + } else { + newParameter = parameter.copyTo(this, index = index - 1, name = name, receiverToValue = true) valueParameters.add(newParameter) + } parameterMap[parameter.symbol] = newParameter } } @@ -147,7 +150,7 @@ class MemoizedInlineClassReplacements { else -> parameter.name } - val newParameter = parameter.copyTo(this, index = index, name = name) + val newParameter = parameter.copyTo(this, index = index, name = name, receiverToValue = true) valueParameters.add(newParameter) parameterMap[parameter.symbol] = newParameter }