diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/Lower.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/Lower.kt index ed0ef7af5c6..8b895aee268 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/Lower.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/Lower.kt @@ -194,105 +194,91 @@ fun FunctionLoweringPass.runOnFilePostfix(irFile: IrFile) { interface DeclarationTransformer : FileLoweringPass { fun transformFlat(declaration: IrDeclaration): List? + val withLocalDeclarations: Boolean + get() = false + override fun lower(irFile: IrFile) { - runPostfix().toFileLoweringPass().lower(irFile) - } -} - -fun DeclarationTransformer.transformFlatRestricted(declaration: IrDeclaration): List? { - return stageController.restrictTo(declaration) { - transformFlat(declaration) - } -} - -fun DeclarationTransformer.toFileLoweringPass(): FileLoweringPass { - return object : FileLoweringPass { - override fun lower(irFile: IrFile) { - irFile.declarations.transformFlat(this@toFileLoweringPass::transformFlat) - } - } -} - -fun DeclarationTransformer.runPostfix(withLocalDeclarations: Boolean = false): DeclarationTransformer { - return object : DeclarationTransformer { - override fun transformFlat(declaration: IrDeclaration): List? { - declaration.acceptVoid(PostfixDeclarationTransformer(withLocalDeclarations, this@runPostfix)) - - return this@runPostfix.transformFlatRestricted(declaration) - } - } -} - -private class PostfixDeclarationTransformer( - private val withLocalDeclarations: Boolean, - private val transformer: DeclarationTransformer -) : IrElementVisitorVoid { - override fun visitElement(element: IrElement) { - element.acceptChildrenVoid(this) - } - - override fun visitBody(body: IrBody) { - if (withLocalDeclarations) { - super.visitBody(body) - } - // else stop - } - - override fun visitFunction(declaration: IrFunction) { - declaration.acceptChildrenVoid(this) - - for (v in declaration.valueParameters) { - val result = transformer.transformFlatRestricted(v) - if (result != null) error("Don't know how to add value parameters") + val visitor = Visitor(this) + irFile.declarations.transformFlat { declaration -> + declaration.acceptVoid(visitor) + transformFlatRestricted(declaration) } } - override fun visitProperty(declaration: IrProperty) { - // TODO This is a hack to allow lowering a getter separately from the enclosing property + private fun transformFlatRestricted(declaration: IrDeclaration): List? { + return stageController.restrictTo(declaration) { + transformFlat(declaration) + } + } - val visitor = this + private class Visitor(private val transformer: DeclarationTransformer) : IrElementVisitorVoid { + override fun visitElement(element: IrElement) { + element.acceptChildrenVoid(this) + } - fun IrDeclaration.transform() { + override fun visitBody(body: IrBody) { + if (transformer.withLocalDeclarations) { + super.visitBody(body) + } + // else stop + } - acceptVoid(visitor) + override fun visitFunction(declaration: IrFunction) { + declaration.acceptChildrenVoid(this) - val result = transformer.transformFlatRestricted(this) - if (result != null) { - (parent as? IrDeclarationContainer)?.let { - var index = it.declarations.indexOf(this) - if (index == -1) { - index = it.declarations.indexOf(declaration) - } else { - it.declarations.removeAt(index) - --index - } - - it.declarations.addAll(index + 1, result) - } + for (v in declaration.valueParameters) { + val result = transformer.transformFlatRestricted(v) + if (result != null) error("Don't know how to add value parameters") } } - declaration.backingField?.transform() - declaration.getter?.transform() - declaration.setter?.transform() - } + override fun visitProperty(declaration: IrProperty) { + // TODO This is a hack to allow lowering a getter separately from the enclosing property - override fun visitClass(declaration: IrClass) { - declaration.thisReceiver?.accept(this, null) - declaration.typeParameters.forEach { it.accept(this, null) } - ArrayList(declaration.declarations).forEach { it.accept(this, null) } + val visitor = this - declaration.declarations.transformFlat(transformer::transformFlatRestricted) - } + fun IrDeclaration.transform() { - override fun visitScript(declaration: IrScript) { - ArrayList(declaration.declarations).forEach { it.accept(this, null) } - declaration.declarations.transformFlat(transformer::transformFlatRestricted) + acceptVoid(visitor) - if (withLocalDeclarations) { - declaration.statements.forEach { it.accept(this, null) } + val result = transformer.transformFlatRestricted(this) + if (result != null) { + (parent as? IrDeclarationContainer)?.let { + var index = it.declarations.indexOf(this) + if (index == -1) { + index = it.declarations.indexOf(declaration) + } else { + it.declarations.removeAt(index) + --index + } + + it.declarations.addAll(index + 1, result) + } + } + } + + declaration.backingField?.transform() + declaration.getter?.transform() + declaration.setter?.transform() } - declaration.thisReceiver.accept(this, null) + override fun visitClass(declaration: IrClass) { + declaration.thisReceiver?.accept(this, null) + declaration.typeParameters.forEach { it.accept(this, null) } + ArrayList(declaration.declarations).forEach { it.accept(this, null) } + + declaration.declarations.transformFlat(transformer::transformFlatRestricted) + } + + override fun visitScript(declaration: IrScript) { + ArrayList(declaration.declarations).forEach { it.accept(this, null) } + declaration.declarations.transformFlat(transformer::transformFlatRestricted) + + if (transformer.withLocalDeclarations) { + declaration.statements.forEach { it.accept(this, null) } + } + + declaration.thisReceiver.accept(this, null) + } } -} \ No newline at end of file +} diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/DefaultArgumentStubGenerator.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/DefaultArgumentStubGenerator.kt index 08d5200defa..0c3139c8558 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/DefaultArgumentStubGenerator.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/DefaultArgumentStubGenerator.kt @@ -8,9 +8,9 @@ package org.jetbrains.kotlin.backend.common.lower import org.jetbrains.kotlin.backend.common.* import org.jetbrains.kotlin.backend.common.descriptors.synthesizedString import org.jetbrains.kotlin.backend.common.ir.* -import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.DescriptorVisibilities import org.jetbrains.kotlin.descriptors.DescriptorVisibility +import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET import org.jetbrains.kotlin.ir.builders.* import org.jetbrains.kotlin.ir.builders.declarations.addValueParameter @@ -40,10 +40,7 @@ open class DefaultArgumentStubGenerator( private val skipExternalMethods: Boolean = false, private val forceSetOverrideSymbols: Boolean = true ) : DeclarationTransformer { - - override fun lower(irFile: IrFile) { - runPostfix(true).toFileLoweringPass().lower(irFile) - } + override val withLocalDeclarations: Boolean get() = true override fun transformFlat(declaration: IrDeclaration): List? { if (declaration is IrFunction) { @@ -447,9 +444,7 @@ class DefaultParameterCleaner( val context: CommonBackendContext, val replaceDefaultValuesWithStubs: Boolean = false ) : DeclarationTransformer { - override fun lower(irFile: IrFile) { - runPostfix(true).toFileLoweringPass().lower(irFile) - } + override val withLocalDeclarations: Boolean get() = true override fun transformFlat(declaration: IrDeclaration): List? { if (declaration is IrValueParameter && declaration.defaultValue != null) { diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InitializersLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InitializersLowering.kt index aa55bf7c980..d9e7b6b8e62 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InitializersLowering.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InitializersLowering.kt @@ -5,7 +5,10 @@ package org.jetbrains.kotlin.backend.common.lower -import org.jetbrains.kotlin.backend.common.* +import org.jetbrains.kotlin.backend.common.BodyLoweringPass +import org.jetbrains.kotlin.backend.common.CommonBackendContext +import org.jetbrains.kotlin.backend.common.DeclarationTransformer +import org.jetbrains.kotlin.backend.common.runOnFilePostfix import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.IrStatement import org.jetbrains.kotlin.ir.declarations.* @@ -16,7 +19,9 @@ import org.jetbrains.kotlin.ir.expressions.impl.IrSetFieldImpl import org.jetbrains.kotlin.ir.util.constructedClass import org.jetbrains.kotlin.ir.util.deepCopyWithSymbols import org.jetbrains.kotlin.ir.util.render -import org.jetbrains.kotlin.ir.visitors.* +import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid +import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid +import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid object SYNTHESIZED_INIT_BLOCK : IrStatementOriginImpl("SYNTHESIZED_INIT_BLOCK") @@ -88,10 +93,7 @@ class InitializersCleanupLowering( val context: CommonBackendContext, private val shouldEraseFieldInitializer: (IrField) -> Boolean = { it.correspondingPropertySymbol?.owner?.isConst != true } ) : DeclarationTransformer { - - override fun lower(irFile: IrFile) { - runPostfix(withLocalDeclarations = true).toFileLoweringPass().lower(irFile) - } + override val withLocalDeclarations: Boolean get() = true override fun transformFlat(declaration: IrDeclaration): List? { if (declaration is IrAnonymousInitializer) return emptyList() diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InnerClassesLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InnerClassesLowering.kt index d85a7e28e97..70b0a778377 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InnerClassesLowering.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InnerClassesLowering.kt @@ -31,9 +31,7 @@ interface InnerClassesSupport { } class InnerClassesLowering(val context: BackendContext, private val innerClassesSupport: InnerClassesSupport) : DeclarationTransformer { - override fun lower(irFile: IrFile) { - runPostfix(true).toFileLoweringPass().lower(irFile) - } + override val withLocalDeclarations: Boolean get() = true override fun transformFlat(declaration: IrDeclaration): List? { if (declaration is IrClass && declaration.isInner) { diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/LateinitLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/LateinitLowering.kt index 5a779ad7df1..3239b43cd0e 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/LateinitLowering.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/LateinitLowering.kt @@ -16,7 +16,10 @@ package org.jetbrains.kotlin.backend.common.lower -import org.jetbrains.kotlin.backend.common.* +import org.jetbrains.kotlin.backend.common.BodyLoweringPass +import org.jetbrains.kotlin.backend.common.CommonBackendContext +import org.jetbrains.kotlin.backend.common.DeclarationTransformer +import org.jetbrains.kotlin.backend.common.getOrPut import org.jetbrains.kotlin.backend.common.ir.Symbols import org.jetbrains.kotlin.ir.IrStatement import org.jetbrains.kotlin.ir.builders.* @@ -36,10 +39,7 @@ import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid class NullableFieldsForLateinitCreationLowering(val backendContext: CommonBackendContext) : DeclarationTransformer { - - override fun lower(irFile: IrFile) { - runPostfix(true).toFileLoweringPass().lower(irFile) - } + override val withLocalDeclarations: Boolean get() = true override fun transformFlat(declaration: IrDeclaration): List? { if (declaration is IrField) { @@ -56,10 +56,7 @@ class NullableFieldsForLateinitCreationLowering(val backendContext: CommonBacken // Transform declarations class NullableFieldsDeclarationLowering(val backendContext: CommonBackendContext) : DeclarationTransformer { - - override fun lower(irFile: IrFile) { - runPostfix(true).toFileLoweringPass().lower(irFile) - } + override val withLocalDeclarations: Boolean get() = true override fun transformFlat(declaration: IrDeclaration): List? { when (declaration) { diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/PropertiesLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/PropertiesLowering.kt index 44609409a71..e6018cc5561 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/PropertiesLowering.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/PropertiesLowering.kt @@ -5,7 +5,8 @@ package org.jetbrains.kotlin.backend.common.lower -import org.jetbrains.kotlin.backend.common.* +import org.jetbrains.kotlin.backend.common.BodyLoweringPass +import org.jetbrains.kotlin.backend.common.DeclarationTransformer import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.IrStatement import org.jetbrains.kotlin.ir.declarations.* @@ -15,9 +16,7 @@ import org.jetbrains.kotlin.ir.util.isEffectivelyExternal import org.jetbrains.kotlin.ir.visitors.* class PropertiesLowering : DeclarationTransformer { - override fun lower(irFile: IrFile) { - runPostfix(true).toFileLoweringPass().lower(irFile) - } + override val withLocalDeclarations: Boolean get() = true override fun transformFlat(declaration: IrDeclaration): List? { when (declaration) {