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 9b61ab3801f..4cbbdcd54a4 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 @@ -18,6 +18,7 @@ import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET import org.jetbrains.kotlin.ir.builders.Scope import org.jetbrains.kotlin.ir.builders.declarations.IrTypeParameterBuilder import org.jetbrains.kotlin.ir.builders.declarations.build +import org.jetbrains.kotlin.ir.builders.declarations.buildReceiverParameter import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.impl.IrConstructorImpl import org.jetbrains.kotlin.ir.declarations.impl.IrFunctionImpl @@ -411,21 +412,7 @@ fun Scope.createTemporaryVariableWithWrappedDescriptor( } fun IrClass.createImplicitParameterDeclarationWithWrappedDescriptor() { - val thisReceiverDescriptor = WrappedReceiverParameterDescriptor() - thisReceiver = IrValueParameterImpl( - startOffset, endOffset, - IrDeclarationOrigin.INSTANCE_RECEIVER, - IrValueParameterSymbolImpl(thisReceiverDescriptor), - Name.special(""), - index = -1, - type = symbol.typeWithParameters(typeParameters), - varargElementType = null, - isCrossinline = false, - isNoinline = false - ).also { valueParameter -> - thisReceiverDescriptor.bind(valueParameter) - valueParameter.parent = this - } + thisReceiver = buildReceiverParameter(this, IrDeclarationOrigin.INSTANCE_RECEIVER, symbol.typeWithParameters(typeParameters)) } @Suppress("UNCHECKED_CAST") @@ -446,23 +433,7 @@ fun IrClass.simpleFunctions() = declarations.flatMap { fun IrClass.createParameterDeclarations() { assert(thisReceiver == null) - - thisReceiver = WrappedReceiverParameterDescriptor().let { - IrValueParameterImpl( - startOffset, endOffset, - IrDeclarationOrigin.INSTANCE_RECEIVER, - IrValueParameterSymbolImpl(it), - Name.special(""), - 0, - symbol.typeWithParameters(typeParameters), - null, - false, - false - ).apply { - it.bind(this) - parent = this@createParameterDeclarations - } - } + thisReceiver = buildReceiverParameter(this, IrDeclarationOrigin.INSTANCE_RECEIVER, symbol.typeWithParameters(typeParameters)) } @OptIn(ObsoleteDescriptorBasedAPI::class) diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/ir/builders/declarations/declarationBuilders.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/ir/builders/declarations/declarationBuilders.kt index 0a1919f2da7..3823c114bf0 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/ir/builders/declarations/declarationBuilders.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/ir/builders/declarations/declarationBuilders.kt @@ -218,6 +218,25 @@ inline fun IrClass.addConstructor(builder: IrFunctionBuilder.() -> Unit = {}): I constructor.parent = this@addConstructor } +private val RECEIVER_PARAMETER_NAME = Name.special("") + +fun buildReceiverParameter( + parent: IrDeclarationParent, + origin: IrDeclarationOrigin, + type: IrType, + startOffset: Int = parent.startOffset, + endOffset: Int = parent.endOffset +): IrValueParameter = WrappedReceiverParameterDescriptor().let { wrappedDescriptor -> + IrValueParameterImpl( + startOffset, endOffset, origin, + IrValueParameterSymbolImpl(wrappedDescriptor), + RECEIVER_PARAMETER_NAME, -1, type, null, isCrossinline = false, isNoinline = false + ).also { + wrappedDescriptor.bind(it) + it.parent = parent + } +} + @PublishedApi internal fun IrValueParameterBuilder.buildValueParameter(parent: IrDeclarationParent): IrValueParameter { val wrappedDescriptor = WrappedValueParameterDescriptor(wrappedDescriptorAnnotations) diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/CallableReferenceLowering.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/CallableReferenceLowering.kt index e705e5583bd..3d5698646fb 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/CallableReferenceLowering.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/CallableReferenceLowering.kt @@ -17,11 +17,8 @@ import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET import org.jetbrains.kotlin.ir.builders.* import org.jetbrains.kotlin.ir.builders.declarations.* import org.jetbrains.kotlin.ir.declarations.* -import org.jetbrains.kotlin.ir.declarations.impl.IrValueParameterImpl -import org.jetbrains.kotlin.ir.descriptors.WrappedReceiverParameterDescriptor import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.impl.* -import org.jetbrains.kotlin.ir.symbols.impl.IrValueParameterSymbolImpl import org.jetbrains.kotlin.ir.types.IrSimpleType import org.jetbrains.kotlin.ir.types.IrTypeProjection import org.jetbrains.kotlin.ir.types.classOrNull @@ -148,14 +145,6 @@ class CallableReferenceLowering(private val context: CommonBackendContext) : Bod } } - private fun IrClass.createDispatchReceiver(): IrValueParameter { - val vpDescriptor = WrappedReceiverParameterDescriptor() - val vpSymbol = IrValueParameterSymbolImpl(vpDescriptor) - val declaration = IrValueParameterImpl(startOffset, endOffset, origin, vpSymbol, THIS_NAME, -1, defaultType, null, false, false) - vpDescriptor.bind(declaration) - return declaration - } - private fun createConstructor(clazz: IrClass): IrConstructor { return clazz.addConstructor { origin = GENERATED_MEMBER_IN_CALLABLE_REFERENCE @@ -209,7 +198,8 @@ class CallableReferenceLowering(private val context: CommonBackendContext) : Bod isOperator = superMethod.isOperator }.apply { overriddenSymbols = listOf(superMethod.symbol) - dispatchReceiverParameter = clazz.createDispatchReceiver().also { it.parent = this } + dispatchReceiverParameter = buildReceiverParameter(this, clazz.origin, clazz.defaultType, startOffset, endOffset) + if (isLambda) createLambdaInvokeMethod() else createFunctionReferenceInvokeMethod() } }