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 27fec274752..15ca5974840 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 @@ -14,6 +14,7 @@ import org.jetbrains.kotlin.backend.common.lower.optimizations.PropertyAccessorI 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.cleanup.CleanupLowering import org.jetbrains.kotlin.ir.backend.js.lower.coroutines.JsSuspendFunctionsLowering import org.jetbrains.kotlin.ir.backend.js.lower.coroutines.RemoveSuspendLambdas import org.jetbrains.kotlin.ir.backend.js.lower.inline.CopyInlineFunctionBodyLowering @@ -579,6 +580,12 @@ private val objectUsageLoweringPhase = makeBodyLoweringPhase( description = "Transform IrGetObjectValue into instance generator call" ) +private val cleanupLoweringPhase = makeBodyLoweringPhase( + { CleanupLowering() }, + name = "CleanupLowering", + description = "Clean up IR before codegen" +) + val loweringList = listOf( scriptRemoveReceiverLowering, validateIrBeforeLowering, @@ -650,6 +657,7 @@ val loweringList = listOf( objectDeclarationLoweringPhase, objectUsageLoweringPhase, callsLoweringPhase, + cleanupLoweringPhase, validateIrAfterLowering ) diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/cleanup/CleanupLowering.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/cleanup/CleanupLowering.kt new file mode 100644 index 00000000000..185038b4121 --- /dev/null +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/cleanup/CleanupLowering.kt @@ -0,0 +1,45 @@ +/* + * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.ir.backend.js.lower.cleanup + +import org.jetbrains.kotlin.backend.common.BodyLoweringPass +import org.jetbrains.kotlin.ir.IrElement +import org.jetbrains.kotlin.ir.declarations.IrDeclaration +import org.jetbrains.kotlin.ir.expressions.* +import org.jetbrains.kotlin.ir.util.transformFlat +import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid +import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid +import org.jetbrains.kotlin.ir.visitors.acceptVoid + +class CleanupLowering : BodyLoweringPass { + override fun lower(irBody: IrBody, container: IrDeclaration) { + irBody.acceptVoid(BlockRemover()) + } +} + +private class BlockRemover: IrElementVisitorVoid { + override fun visitElement(element: IrElement) { + element.acceptChildrenVoid(this) + } + + private fun process(container: IrStatementContainer) { + container.statements.transformFlat { statement -> + (statement as? IrStatementContainer)?.statements + } + } + + override fun visitBlockBody(body: IrBlockBody) { + super.visitBlockBody(body) + + process(body) + } + + override fun visitContainerExpression(expression: IrContainerExpression) { + super.visitContainerExpression(expression) + + process(expression) + } +} \ No newline at end of file