diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/StaticMembersLowering.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/StaticMembersLowering.kt index d420edf2f17..1acec4bb641 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/StaticMembersLowering.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/StaticMembersLowering.kt @@ -6,51 +6,29 @@ package org.jetbrains.kotlin.ir.backend.js.lower import org.jetbrains.kotlin.backend.common.CommonBackendContext -import org.jetbrains.kotlin.backend.common.FileLoweringPass -import org.jetbrains.kotlin.backend.common.ir.addChild -import org.jetbrains.kotlin.ir.IrElement -import org.jetbrains.kotlin.ir.backend.js.JsIrBackendContext +import org.jetbrains.kotlin.backend.common.DeclarationTransformer import org.jetbrains.kotlin.ir.declarations.* -import org.jetbrains.kotlin.ir.util.getPackageFragment +import org.jetbrains.kotlin.ir.util.file import org.jetbrains.kotlin.ir.util.isEffectivelyExternal -import org.jetbrains.kotlin.ir.util.parentAsClass -import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid -import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid // Move static member declarations from classes to top level -class StaticMembersLowering(val context: CommonBackendContext) : FileLoweringPass { - - override fun lower(irFile: IrFile) { - val staticDeclarationsInClasses = mutableListOf() - irFile.acceptChildrenVoid(object : IrElementVisitorVoid { - override fun visitElement(element: IrElement) { - element.acceptChildrenVoid(this) +class StaticMembersLowering(val context: CommonBackendContext) : DeclarationTransformer { + override fun transformFlat(declaration: IrDeclaration): List? { + (declaration.parent as? IrClass)?.let { irClass -> + val isStatic = when (declaration) { + is IrClass -> !declaration.isEffectivelyExternal() + is IrSimpleFunction -> declaration.isStaticMethodOfClass && !declaration.isEffectivelyExternal() + is IrField -> declaration.isStatic + else -> false } - override fun visitClass(declaration: IrClass) { - if (declaration.parent is IrClass && !declaration.isEffectivelyExternal()) - staticDeclarationsInClasses.add(declaration) - super.visitClass(declaration) + if (isStatic) { + declaration.parent = irClass.file + irClass.file.declarations += declaration + return listOf() } - - override fun visitSimpleFunction(declaration: IrSimpleFunction) { - if (declaration.parent is IrClass && declaration.isStaticMethodOfClass && !declaration.isEffectivelyExternal()) - staticDeclarationsInClasses.add(declaration) - super.visitSimpleFunction(declaration) - } - - override fun visitField(declaration: IrField) { - if (declaration.parent is IrClass && declaration.isStatic) - staticDeclarationsInClasses.add(declaration) - super.visitField(declaration) - } - }) - - for (declaration in staticDeclarationsInClasses) { - val klass = declaration.parentAsClass - klass.declarations.remove(declaration) - irFile.addChild(declaration) - declaration.parent = irFile } + + return null } } \ No newline at end of file