From f8779ddf9dc92c9f4fd7b60deae05a71eeb775a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Steven=20Sch=C3=A4fer?= Date: Thu, 9 Jan 2020 14:03:42 +0100 Subject: [PATCH] Psi2Ir: Create instance initializer calls in enum class constructors --- .../ir/backend/js/lower/EnumClassLowering.kt | 30 ------------------- .../backend/jvm/lower/EnumClassLowering.kt | 30 ------------------- .../jetbrains/kotlin/psi2ir/KotlinUtils.kt | 12 +++++--- 3 files changed, 8 insertions(+), 64 deletions(-) diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/EnumClassLowering.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/EnumClassLowering.kt index adbe77d9e9d..c3b526b0c46 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/EnumClassLowering.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/EnumClassLowering.kt @@ -125,9 +125,6 @@ class EnumClassConstructorTransformer(val context: CommonBackendContext, private private val loweredEnumConstructors = HashMap() fun transform(): List { - // Make sure InstanceInitializer exists - insertInstanceInitializer() - // Add `name` and `ordinal` parameters to enum class constructors lowerEnumConstructorsSignature() @@ -149,33 +146,6 @@ class EnumClassConstructorTransformer(val context: CommonBackendContext, private return listOf(irClass) } - private fun insertInstanceInitializer() { - irClass.transformChildrenVoid(object : IrElementTransformerVoid() { - override fun visitClass(declaration: IrClass) = declaration - - override fun visitConstructor(declaration: IrConstructor): IrStatement { - declaration.transformChildrenVoid(this) - - val blockBody = declaration.body as IrBlockBody - - if (!blockBody.statements.any { it is IrInstanceInitializerCall }) { - blockBody.statements.transformFlat { - if (it is IrEnumConstructorCall) - listOf( - it, IrInstanceInitializerCallImpl( - declaration.startOffset, declaration.startOffset, - irClass.symbol, context.irBuiltIns.unitType - ) - ) - else null - } - } - - return declaration - } - }) - } - private fun lowerEnumConstructorsSignature() { irClass.declarations.transform { declaration -> if (declaration is IrConstructor) { diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/EnumClassLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/EnumClassLowering.kt index 8a6faa75dc5..624a8b42a84 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/EnumClassLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/EnumClassLowering.kt @@ -69,7 +69,6 @@ private class EnumClassLowering(val context: JvmBackendContext) : ClassLoweringP private lateinit var valueOfFunction: IrFunction fun run() { - insertInstanceInitializer() assignOrdinalsToEnumEntries() lowerEnumConstructors(irClass) lowerEnumEntries() @@ -77,35 +76,6 @@ private class EnumClassLowering(val context: JvmBackendContext) : ClassLoweringP lowerEnumClassBody() } - // Make sure that an instance initializer call exists, so that field initialization code will be generated. - // TODO: This function is identical to the one used in the JS lowerings. Share them. - private fun insertInstanceInitializer() { - irClass.transformChildrenVoid(object : IrElementTransformerVoid() { - override fun visitClass(declaration: IrClass) = declaration - - override fun visitConstructor(declaration: IrConstructor): IrStatement { - declaration.transformChildrenVoid(this) - - val blockBody = declaration.body as IrBlockBody - - if (!blockBody.statements.any { it is IrInstanceInitializerCall }) { - blockBody.statements.transformFlat { - if (it is IrEnumConstructorCall) - listOf( - it, IrInstanceInitializerCallImpl( - declaration.startOffset, declaration.startOffset, - irClass.symbol, context.irBuiltIns.unitType - ) - ) - else null - } - } - - return declaration - } - }) - } - private fun assignOrdinalsToEnumEntries() { var ordinal = 0 irClass.declarations.forEach { diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/KotlinUtils.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/KotlinUtils.kt index 35216aee495..1bca51c1696 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/KotlinUtils.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/KotlinUtils.kt @@ -54,11 +54,15 @@ fun ResolvedCall<*>.isValueArgumentReorderingRequired(): Boolean { } fun KtSecondaryConstructor.isConstructorDelegatingToSuper(bindingContext: BindingContext): Boolean { - val delegatingResolvedCall = getDelegationCall().getResolvedCall(bindingContext) ?: return false val constructorDescriptor = bindingContext.get(BindingContext.CONSTRUCTOR, this) ?: return false - val ownerClassDescriptor = constructorDescriptor.containingDeclaration - val targetClassDescriptor = delegatingResolvedCall.resultingDescriptor.containingDeclaration - return targetClassDescriptor != ownerClassDescriptor + val delegatingResolvedCall = getDelegationCall().getResolvedCall(bindingContext) + return if (delegatingResolvedCall != null) { + val ownerClassDescriptor = constructorDescriptor.containingDeclaration + val targetClassDescriptor = delegatingResolvedCall.resultingDescriptor.containingDeclaration + targetClassDescriptor != ownerClassDescriptor + } else { + constructorDescriptor.constructedClass.kind == ClassKind.ENUM_CLASS + } } inline fun ClassDescriptor.findFirstFunction(name: String, predicate: (CallableMemberDescriptor) -> Boolean) =