diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/BlockDecomposerLowering.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/BlockDecomposerLowering.kt index 7c378003594..0022b4a32e2 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/BlockDecomposerLowering.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/BlockDecomposerLowering.kt @@ -5,7 +5,7 @@ package org.jetbrains.kotlin.ir.backend.js.lower -import org.jetbrains.kotlin.backend.common.FunctionLoweringPass +import org.jetbrains.kotlin.backend.common.DeclarationContainerLoweringPass import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.IrStatement @@ -14,9 +14,7 @@ import org.jetbrains.kotlin.ir.backend.js.ir.JsIrBuilder import org.jetbrains.kotlin.ir.backend.js.symbols.JsSymbolBuilder import org.jetbrains.kotlin.ir.backend.js.symbols.initialize import org.jetbrains.kotlin.ir.backend.js.utils.Namer -import org.jetbrains.kotlin.ir.declarations.IrField -import org.jetbrains.kotlin.ir.declarations.IrFunction -import org.jetbrains.kotlin.ir.declarations.IrVariable +import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.impl.* import org.jetbrains.kotlin.ir.util.transformFlat @@ -26,8 +24,7 @@ import org.jetbrains.kotlin.types.KotlinType private typealias VisitData = Nothing? -class BlockDecomposerLowering(val context: JsIrBackendContext) : FunctionLoweringPass { - +class BlockDecomposerLowering(val context: JsIrBackendContext) : DeclarationContainerLoweringPass { private lateinit var function: IrFunction private var tmpVarCounter: Int = 0 @@ -44,12 +41,52 @@ class BlockDecomposerLowering(val context: JsIrBackendContext) : FunctionLowerin private val unreachableFunction = JsSymbolBuilder.buildSimpleFunction(context.module, Namer.UNREACHABLE_NAME).initialize(type = nothingType) - override fun lower(irFunction: IrFunction) { + override fun lower(irDeclarationContainer: IrDeclarationContainer) { + irDeclarationContainer.declarations.transformFlat { declaration -> + when (declaration) { + is IrFunction -> { + lower(declaration) + listOf(declaration) + } + is IrField -> lower(declaration, irDeclarationContainer) + else -> listOf(declaration) + } + } + } + + fun lower(irFunction: IrFunction) { function = irFunction tmpVarCounter = 0 irFunction.body?.accept(statementVisitor, null) } + fun lower(irField: IrField, container: IrDeclarationContainer): List { + irField.initializer?.apply { + val initFnSymbol = JsSymbolBuilder.buildSimpleFunction( + (container as IrSymbolOwner).symbol.descriptor, + irField.name.asString() + "\$init\$" + ).initialize(type = expression.type) + + + val newBody = IrBlockBodyImpl(expression.startOffset, expression.endOffset).apply { + statements += JsIrBuilder.buildReturn(initFnSymbol, expression) + } + + val initFn = JsIrBuilder.buildFunction(initFnSymbol).apply { + body = newBody + } + + lower(initFn) + + if (newBody.statements.size > 1) { + expression = JsIrBuilder.buildCall(initFnSymbol) + return listOf(initFn, irField) + } + } + + return listOf(irField) + } + enum class VisitStatus { DECOMPOSED, TERMINATED, diff --git a/compiler/testData/codegen/box/functions/kt395.kt b/compiler/testData/codegen/box/functions/kt395.kt index 1355aa56365..310640226e0 100644 --- a/compiler/testData/codegen/box/functions/kt395.kt +++ b/compiler/testData/codegen/box/functions/kt395.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JS_IR fun Any.with(operation : Any.() -> Any) = operation().toString() val f = { a : Int -> } diff --git a/compiler/testData/codegen/box/objects/anonymousObjectPropertyInitialization.kt b/compiler/testData/codegen/box/objects/anonymousObjectPropertyInitialization.kt index 972c35b2cde..4765e8858ba 100644 --- a/compiler/testData/codegen/box/objects/anonymousObjectPropertyInitialization.kt +++ b/compiler/testData/codegen/box/objects/anonymousObjectPropertyInitialization.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JS_IR interface T { fun foo(): String } diff --git a/compiler/testData/codegen/box/typealias/typeAliasInAnonymousObjectType.kt b/compiler/testData/codegen/box/typealias/typeAliasInAnonymousObjectType.kt index e1ecc61f569..ba3a87abaec 100644 --- a/compiler/testData/codegen/box/typealias/typeAliasInAnonymousObjectType.kt +++ b/compiler/testData/codegen/box/typealias/typeAliasInAnonymousObjectType.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JS_IR open class Foo(val x: T) typealias FooStr = Foo diff --git a/js/js.translator/testData/box/expression/misc/temporaryVariableCreatedInPackageInitializer.kt b/js/js.translator/testData/box/expression/misc/temporaryVariableCreatedInPackageInitializer.kt index 0845dd1431b..ab8884227a8 100644 --- a/js/js.translator/testData/box/expression/misc/temporaryVariableCreatedInPackageInitializer.kt +++ b/js/js.translator/testData/box/expression/misc/temporaryVariableCreatedInPackageInitializer.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JS_IR // EXPECTED_REACHABLE_NODES: 1111 package foo