diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsLoweringPhases.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsLoweringPhases.kt index 32d90e675ca..58343580bc1 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsLoweringPhases.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsLoweringPhases.kt @@ -15,6 +15,7 @@ import org.jetbrains.kotlin.backend.common.phaser.* import org.jetbrains.kotlin.ir.backend.js.lower.* import org.jetbrains.kotlin.ir.backend.js.lower.calls.CallsLowering import org.jetbrains.kotlin.ir.backend.js.lower.coroutines.JsSuspendFunctionsLowering +import org.jetbrains.kotlin.ir.backend.js.lower.inline.CopyInlineFunctionBodyLowering import org.jetbrains.kotlin.ir.backend.js.lower.inline.RemoveInlineFunctionsWithReifiedTypeParametersLowering import org.jetbrains.kotlin.ir.declarations.IrFile import org.jetbrains.kotlin.ir.declarations.IrModuleFragment @@ -120,6 +121,13 @@ private val functionInliningPhase = makeCustomJsModulePhase( prerequisite = setOf(expectDeclarationsRemovingPhase) ) +private val copyInlineFunctionBodyLoweringPhase = makeJsModulePhase( + ::CopyInlineFunctionBodyLowering, + name = "CopyInlineFunctionBody", + description = "Copy inline function body", + prerequisite = setOf(functionInliningPhase) +) + private val removeInlineFunctionsWithReifiedTypeParametersLoweringPhase = makeJsModulePhase( { RemoveInlineFunctionsWithReifiedTypeParametersLowering() }, name = "RemoveInlineFunctionsWithReifiedTypeParametersLowering", @@ -446,6 +454,7 @@ val jsPhases = namedIrModulePhase( stripTypeAliasDeclarationsPhase then arrayConstructorPhase then functionInliningPhase then + copyInlineFunctionBodyLoweringPhase then createScriptFunctionsPhase then provisionalFunctionExpressionPhase then lateinitNullableFieldsPhase then diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/inline/RemoveInlineFunctionsWithReifiedTypeParametersLowering.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/inline/RemoveInlineFunctionsWithReifiedTypeParametersLowering.kt index 9d7ffccf1b4..216de0c00ae 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/inline/RemoveInlineFunctionsWithReifiedTypeParametersLowering.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/inline/RemoveInlineFunctionsWithReifiedTypeParametersLowering.kt @@ -5,16 +5,47 @@ package org.jetbrains.kotlin.ir.backend.js.lower.inline -import org.jetbrains.kotlin.backend.common.DeclarationContainerLoweringPass -import org.jetbrains.kotlin.ir.declarations.IrDeclarationContainer + +import org.jetbrains.kotlin.backend.common.DeclarationTransformer +import org.jetbrains.kotlin.ir.backend.js.JsIrBackendContext +import org.jetbrains.kotlin.ir.declarations.IrDeclaration import org.jetbrains.kotlin.ir.declarations.IrFunction -import org.jetbrains.kotlin.ir.util.transformDeclarationsFlat +import org.jetbrains.kotlin.ir.declarations.IrValueParameter +import org.jetbrains.kotlin.ir.expressions.IrBlockBody +import org.jetbrains.kotlin.ir.expressions.impl.IrBlockBodyImpl +import org.jetbrains.kotlin.ir.expressions.impl.IrExpressionBodyImpl +import org.jetbrains.kotlin.ir.util.deepCopyWithSymbols +class RemoveInlineFunctionsWithReifiedTypeParametersLowering: DeclarationTransformer { -class RemoveInlineFunctionsWithReifiedTypeParametersLowering: DeclarationContainerLoweringPass { - override fun lower(irDeclarationContainer: IrDeclarationContainer) { - irDeclarationContainer.transformDeclarationsFlat { - if (it is IrFunction && it.isInline && it.typeParameters.any { it.isReified }) listOf() else null + override fun transformFlat(declaration: IrDeclaration): List? { + + if (declaration is IrFunction && declaration.isInline && declaration.typeParameters.any { it.isReified }) { + return emptyList() } + + return null } } + +class CopyInlineFunctionBodyLowering(val context: JsIrBackendContext) : DeclarationTransformer { + override fun transformFlat(declaration: IrDeclaration): List? { + if (declaration is IrFunction && declaration.isInline) { + declaration.body?.let { originalBody -> + declaration.body = IrBlockBodyImpl(originalBody.startOffset, originalBody.endOffset) { + statements += (originalBody.deepCopyWithSymbols(declaration) as IrBlockBody).statements + } + } + } + + if (declaration is IrValueParameter && declaration.parent.let { it is IrFunction && it.isInline }) { + declaration.defaultValue?.let { originalDefault -> + declaration.defaultValue = IrExpressionBodyImpl(originalDefault.startOffset, originalDefault.endOffset) { + expression = originalDefault.expression.deepCopyWithSymbols(declaration.parent) + } + } + } + + return null + } +} \ No newline at end of file