JS IR: top-level initializer lowering
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 7c37800..0022b4a 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.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 @@
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 @@
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<IrDeclaration> {
+ 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 1355aa5..3106402 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 972c35b..4765e88 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 e1ecc61..ba3a87a 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<T>(val x: T)
typealias FooStr = Foo<String>
diff --git a/js/js.translator/testData/box/expression/misc/temporaryVariableCreatedInPackageInitializer.kt b/js/js.translator/testData/box/expression/misc/temporaryVariableCreatedInPackageInitializer.kt
index 0845dd1..ab88842 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