diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/InteropCallableReferenceLowering.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/InteropCallableReferenceLowering.kt index f79cb257c61..783165575fb 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/InteropCallableReferenceLowering.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/InteropCallableReferenceLowering.kt @@ -162,19 +162,21 @@ class InteropCallableReferenceLowering(val context: JsIrBackendContext) : BodyLo val constructor = expression.symbol.owner val lambdaClass = constructor.parentAsClass val invokeFun = lambdaClass.declarations.filterIsInstance().single { it.name.asString() == "invoke" } + val superInvokeFun = invokeFun.overriddenSymbols.single { it.owner.isSuspend == invokeFun.isSuspend }.owner val lambdaName = Name.identifier("${lambdaClass.name.asString()}\$lambda") val lambdaDeclaration = buildFun { startOffset = invokeFun.startOffset endOffset = invokeFun.endOffset - returnType = invokeFun.returnType + // Since box/unbox is done on declaration side in case of suspend function use the specified type + returnType = if (invokeFun.isSuspend) invokeFun.returnType else superInvokeFun.returnType name = lambdaName isSuspend = invokeFun.isSuspend } lambdaDeclaration.parent = factoryFunction - lambdaDeclaration.valueParameters = invokeFun.valueParameters.map { it.copyTo(lambdaDeclaration) } + lambdaDeclaration.valueParameters = superInvokeFun.valueParameters.map { it.copyTo(lambdaDeclaration) } val statements = ArrayList(4)