From 098561dd5f4a7519ea0d2ca874051d7f71d19b52 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Mon, 21 Oct 2019 15:48:39 +0200 Subject: [PATCH] IR: cleanup InitializersLowering.kt --- .../common/lower/InitializersLowering.kt | 49 ++++++------------- .../jetbrains/kotlin/backend/jvm/JvmLower.kt | 22 ++++++++- 2 files changed, 35 insertions(+), 36 deletions(-) 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 22379b54a08..bc66b6ff837 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 @@ -9,10 +9,8 @@ import org.jetbrains.kotlin.backend.common.ClassLoweringPass import org.jetbrains.kotlin.backend.common.CommonBackendContext import org.jetbrains.kotlin.backend.common.descriptors.WrappedSimpleFunctionDescriptor 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.* @@ -28,33 +26,15 @@ import org.jetbrains.kotlin.ir.expressions.impl.IrSetFieldImpl import org.jetbrains.kotlin.ir.symbols.impl.IrSimpleFunctionSymbolImpl import org.jetbrains.kotlin.ir.util.deepCopyWithSymbols import org.jetbrains.kotlin.ir.util.patchDeclarationParents -import org.jetbrains.kotlin.ir.visitors.* +import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid +import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid import org.jetbrains.kotlin.name.Name -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", - 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") - } - }) -} +object SYNTHESIZED_INIT_BLOCK : IrStatementOriginImpl("SYNTHESIZED_INIT_BLOCK") class InitializersLowering( val context: CommonBackendContext, - val declarationOrigin: IrDeclarationOrigin, + private val declarationOrigin: IrDeclarationOrigin, private val clinitNeeded: Boolean ) : ClassLoweringPass { override fun lower(irClass: IrClass) { @@ -68,13 +48,13 @@ class InitializersLowering( irClass.patchDeclarationParents(irClass.parent) } - fun handleNonStatics(irClass: IrClass) = + private fun handleNonStatics(irClass: IrClass) = irClass.declarations.filter { (it is IrField && !it.isStatic) || (it is IrAnonymousInitializer && !it.isStatic) }.mapNotNull { handleDeclaration(irClass, it) } - fun handleStatics(irClass: IrClass) = - // Hardcoded order of initializers + private fun handleStatics(irClass: IrClass) = + // Hardcoded order of initializers (irClass.declarations.filter { it is IrField && it.origin == IrDeclarationOrigin.FIELD_FOR_ENUM_ENTRY } + irClass.declarations.filter { it is IrField && it.origin == IrDeclarationOrigin.FIELD_FOR_ENUM_VALUES } + irClass.declarations.filter { it is IrField && it.origin == IrDeclarationOrigin.FIELD_FOR_OBJECT_INSTANCE } + @@ -87,13 +67,13 @@ class InitializersLowering( }) .mapNotNull { handleDeclaration(irClass, it) } - fun handleDeclaration(irClass: IrClass, declaration: IrDeclaration): IrStatement? = when(declaration) { + private fun handleDeclaration(irClass: IrClass, declaration: IrDeclaration): IrStatement? = when (declaration) { is IrField -> handleField(irClass, declaration) is IrAnonymousInitializer -> handleAnonymousInitializer(declaration) else -> null } - fun handleField(irClass: IrClass, declaration: IrField): IrStatement? { + private fun handleField(irClass: IrClass, declaration: IrField): IrStatement? { val irFieldInitializer = declaration.initializer?.expression ?: return null val receiver = @@ -113,15 +93,14 @@ class InitializersLowering( ) } - - fun handleAnonymousInitializer(declaration: IrAnonymousInitializer): IrStatement = IrBlockImpl( + private fun handleAnonymousInitializer(declaration: IrAnonymousInitializer): IrStatement = IrBlockImpl( declaration.startOffset, declaration.endOffset, context.irBuiltIns.unitType, SYNTHESIZED_INIT_BLOCK, declaration.body.statements ) - fun transformInstanceInitializerCallsInConstructors(irClass: IrClass, instanceInitializerStatements: List) { + private fun transformInstanceInitializerCallsInConstructors(irClass: IrClass, instanceInitializerStatements: List) { irClass.transformChildrenVoid(object : IrElementTransformerVoid() { override fun visitInstanceInitializerCall(expression: IrInstanceInitializerCall): IrExpression { val copiedBlock = @@ -133,7 +112,7 @@ class InitializersLowering( }) } - fun createStaticInitializationMethod(irClass: IrClass, staticInitializerStatements: List) { + private fun createStaticInitializationMethod(irClass: IrClass, staticInitializerStatements: List) { // TODO: mark as synthesized val staticInitializerDescriptor = WrappedSimpleFunctionDescriptor() val staticInitializer = IrFunctionImpl( @@ -165,7 +144,7 @@ class InitializersLowering( companion object { val clinitName = Name.special("") - fun IrStatement.copy(containingDeclaration: IrDeclarationParent) = deepCopyWithSymbols(containingDeclaration) - fun IrExpression.copy(containingDeclaration: IrDeclarationParent) = deepCopyWithSymbols(containingDeclaration) + private fun IrStatement.copy(containingDeclaration: IrDeclarationParent) = deepCopyWithSymbols(containingDeclaration) + private fun IrExpression.copy(containingDeclaration: IrDeclarationParent) = deepCopyWithSymbols(containingDeclaration) } } diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt index 11c437f9e2b..152813a7682 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt @@ -13,12 +13,15 @@ import org.jetbrains.kotlin.backend.jvm.lower.* import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.descriptors.Visibility +import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.builders.IrBuilderWithScope import org.jetbrains.kotlin.ir.builders.irBlock import org.jetbrains.kotlin.ir.builders.irNull import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.expressions.IrExpression import org.jetbrains.kotlin.ir.util.PatchDeclarationParentsVisitor +import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid +import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid import org.jetbrains.kotlin.ir.visitors.acceptVoid import org.jetbrains.kotlin.load.java.JavaVisibilities import org.jetbrains.kotlin.load.java.JvmAbi @@ -170,6 +173,23 @@ private val innerClassesPhase = makeIrFilePhase( prerequisite = setOf(localDeclarationsPhase) ) +private val initializersPhase = makeIrFilePhase( + { context -> InitializersLowering(context, JvmLoweredDeclarationOrigin.CLASS_STATIC_INITIALIZER, clinitNeeded = true) }, + name = "Initializers", + description = "Merge init blocks and field initializers into constructors", + stickyPostconditions = setOf(fun(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") + } + }) + }) +) + private val returnableBlocksPhase = makeIrFilePhase( ::ReturnableBlockLowering, name = "ReturnableBlock", @@ -256,7 +276,7 @@ private val jvmFilePhases = enumClassPhase then objectClassPhase then - makeInitializersPhase(JvmLoweredDeclarationOrigin.CLASS_STATIC_INITIALIZER, true) then + initializersPhase then collectionStubMethodLowering then functionNVarargBridgePhase then bridgePhase then