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 c4aee08c7a7..a128e6b2712 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 @@ -13,6 +13,7 @@ import org.jetbrains.kotlin.backend.common.ir.SetDeclarationsParentVisitor import org.jetbrains.kotlin.backend.common.phaser.makeIrFilePhase import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Visibilities +import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.IrStatement import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET import org.jetbrains.kotlin.ir.declarations.* @@ -26,6 +27,7 @@ import org.jetbrains.kotlin.ir.util.patchDeclarationParents import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid import org.jetbrains.kotlin.ir.symbols.impl.IrSimpleFunctionSymbolImpl +import org.jetbrains.kotlin.ir.visitors.* import org.jetbrains.kotlin.name.Name object SYNTHESIZED_INIT_BLOCK: IrStatementOriginImpl("SYNTHESIZED_INIT_BLOCK") @@ -33,9 +35,22 @@ object SYNTHESIZED_INIT_BLOCK: IrStatementOriginImpl("SYNTHESIZED_INIT_BLOCK") fun makeInitializersPhase(origin: IrDeclarationOrigin, clinitNeeded: Boolean)= makeIrFilePhase( { context -> InitializersLowering(context, origin, clinitNeeded) }, name = "Initializers", - description = "Handle initializer statements" + description = "Handle initializer statements", + stickyPostconditions = setOf(::checkNonAnonymousInitializers) ) +fun checkNonAnonymousInitializers(irFile: IrFile) { + irFile.acceptVoid(object : IrElementVisitorVoid { + override fun visitElement(element: IrElement) { + element.acceptChildrenVoid(this) + } + + override fun visitAnonymousInitializer(declaration: IrAnonymousInitializer) { + error("No anonymous initializers should remain at this stage") + } + }) +} + class InitializersLowering( val context: CommonBackendContext, val declarationOrigin: IrDeclarationOrigin, @@ -48,6 +63,7 @@ class InitializersLowering( val staticInitializerStatements = handleStatics(irClass) if (clinitNeeded && staticInitializerStatements.isNotEmpty()) createStaticInitializationMethod(irClass, staticInitializerStatements) + irClass.declarations.removeAll { it is IrAnonymousInitializer } irClass.patchDeclarationParents(irClass.parent) } 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 e5cb60c86d1..d39336512c3 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 @@ -12,6 +12,7 @@ import org.jetbrains.kotlin.backend.common.phaser.makeIrFilePhase import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Visibilities +import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.IrStatement import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.impl.IrFunctionImpl @@ -23,15 +24,29 @@ import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid import org.jetbrains.kotlin.load.java.JvmAbi import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.ir.visitors.* import org.jetbrains.kotlin.utils.addIfNotNull import java.util.* fun makePropertiesPhase(originOfSyntheticMethodForAnnotations: IrDeclarationOrigin?) = makeIrFilePhase( { context -> PropertiesLowering(context, originOfSyntheticMethodForAnnotations) }, name = "Properties", - description = "Move fields and accessors for properties to their classes" + description = "Move fields and accessors for properties to their classes", + stickyPostconditions = setOf(::checkNoProperties) ) +fun checkNoProperties(irFile: IrFile) { + irFile.acceptVoid(object : IrElementVisitorVoid { + override fun visitElement(element: IrElement) { + element.acceptChildrenVoid(this) + } + + override fun visitProperty(declaration: IrProperty) { + error("No properties should remain at this stage") + } + }) +} + class PropertiesLowering( private val context: BackendContext, private val originOfSyntheticMethodForAnnotations: IrDeclarationOrigin? @@ -49,6 +64,7 @@ class PropertiesLowering( override fun visitClass(declaration: IrClass): IrStatement { declaration.transformChildrenVoid(this) declaration.transformDeclarationsFlat { lowerProperty(it, declaration.kind) } + declaration.declarations.removeAll { it is IrProperty } return declaration } diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/FileClassLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/FileClassLowering.kt index 3ca40fa08db..96d8fe94703 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/FileClassLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/FileClassLowering.kt @@ -39,9 +39,14 @@ import java.util.* internal val fileClassPhase = makeIrFilePhase( ::FileClassLowering, name = "FileClass", - description = "Put file level function and property declaration into a class" + description = "Put file level function and property declaration into a class", + stickyPostconditions = setOf(::checkAllFileLevelDeclarationsAreClasses) ) +private fun checkAllFileLevelDeclarationsAreClasses(irFile: IrFile) { + assert(irFile.declarations.all { it is IrClass }) +} + private class FileClassLowering(val context: JvmBackendContext) : FileLoweringPass { override fun lower(irFile: IrFile) { val classes = ArrayList()