diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/MemoizedInlineClassReplacements.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/MemoizedInlineClassReplacements.kt index 4c0fbdc7ef3..e9ebba259ad 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/MemoizedInlineClassReplacements.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/MemoizedInlineClassReplacements.kt @@ -184,6 +184,7 @@ class MemoizedInlineClassReplacements( // The function's name will be mangled, so preserve the old receiver name. this, index = -1, name = Name.identifier(function.extensionReceiverName(context.state)) ) + contextReceiverParametersCount = function.contextReceiverParametersCount valueParameters = function.valueParameters.mapIndexed { index, parameter -> parameter.copyTo(this, index = index, defaultValue = null).also { // Assuming that constructors and non-override functions are always replaced with the unboxed @@ -205,13 +206,21 @@ class MemoizedInlineClassReplacements( type = function.parentAsClass.defaultType, origin = IrDeclarationOrigin.MOVED_DISPATCH_RECEIVER ) } + if (function.contextReceiverParametersCount != 0) { + function.valueParameters.take(function.contextReceiverParametersCount).forEachIndexed { i, contextReceiver -> + newValueParameters += contextReceiver.copyTo( + this, index = newValueParameters.size, name = Name.identifier("contextReceiver$i"), + origin = IrDeclarationOrigin.MOVED_CONTEXT_RECEIVER + ) + } + } function.extensionReceiverParameter?.let { newValueParameters += it.copyTo( this, index = newValueParameters.size, name = Name.identifier(function.extensionReceiverName(context.state)), origin = IrDeclarationOrigin.MOVED_EXTENSION_RECEIVER ) } - for (parameter in function.valueParameters) { + for (parameter in function.valueParameters.drop(function.contextReceiverParametersCount)) { newValueParameters += parameter.copyTo(this, index = newValueParameters.size, defaultValue = null).also { // See comment next to a similar line above. it.defaultValue = parameter.defaultValue?.patchDeclarationParents(this) diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrDeclarationOrigin.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrDeclarationOrigin.kt index b055ec91d9f..c2691f4394b 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrDeclarationOrigin.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrDeclarationOrigin.kt @@ -35,6 +35,7 @@ interface IrDeclarationOrigin { object METHOD_HANDLER_IN_DEFAULT_FUNCTION : IrDeclarationOriginImpl("METHOD_HANDLER_IN_DEFAULT_FUNCTION", isSynthetic = true) object MOVED_DISPATCH_RECEIVER : IrDeclarationOriginImpl("MOVED_DISPATCH_RECEIVER") object MOVED_EXTENSION_RECEIVER : IrDeclarationOriginImpl("MOVED_EXTENSION_RECEIVER") + object MOVED_CONTEXT_RECEIVER : IrDeclarationOriginImpl("MOVED_CONTEXT_RECEIVER") object FILE_CLASS : IrDeclarationOriginImpl("FILE_CLASS") object SYNTHETIC_FILE_CLASS : IrDeclarationOriginImpl("SYNTHETIC_FILE_CLASS", isSynthetic = true)