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