From a005f2e75d236733a32ba18ca42d4a13611ea8a1 Mon Sep 17 00:00:00 2001 From: Wojciech Litewka Date: Wed, 21 Feb 2024 15:06:56 +0100 Subject: [PATCH] [IR] Make IrFunction.returnType lateinit to replace custom logic that would throw in case of IrUninitialized. This is to remove custom logic from those classes, so that source generator will be able to generate them in a straight-forward way. Otherwise, it would need to be thought about those special cases, which is better to be avoided. There are two consequences: - The error message will be more generic, and won't contain reference to the element. - It becomes possible to reassign returnType property with IrUninitializedType and read it afterward. ^KT-65773 In Progress --- .../ir/declarations/impl/IrConstructorImpl.kt | 10 ++------ .../ir/declarations/impl/IrFactoryImpl.kt | 24 ++++++++++++++----- .../ir/declarations/impl/IrFunctionImpl.kt | 10 ++------ .../impl/IrFunctionWithLateBindingImpl.kt | 10 ++------ 4 files changed, 24 insertions(+), 30 deletions(-) diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrConstructorImpl.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrConstructorImpl.kt index 09ffc2c7bf8..d8c153ce5fe 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrConstructorImpl.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrConstructorImpl.kt @@ -26,7 +26,6 @@ class IrConstructorImpl @IrImplementationDetail constructor( override val symbol: IrConstructorSymbol, override var name: Name, override var visibility: DescriptorVisibility, - returnType: IrType, override var isInline: Boolean, override var isExternal: Boolean, override var isPrimary: Boolean, @@ -41,13 +40,6 @@ class IrConstructorImpl @IrImplementationDetail constructor( override lateinit var parent: IrDeclarationParent override var annotations: List = emptyList() - override var returnType: IrType = returnType - get() = if (field === IrUninitializedType) { - throw ReturnTypeIsNotInitializedException(this) - } else { - field - } - override var typeParameters: List = emptyList() override var dispatchReceiverParameter: IrValueParameter? = null @@ -55,6 +47,8 @@ class IrConstructorImpl @IrImplementationDetail constructor( override var contextReceiverParametersCount: Int = 0 override var valueParameters: List = emptyList() + override lateinit var returnType: IrType + override var body: IrBody? = null override var metadata: MetadataSource? = null diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrFactoryImpl.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrFactoryImpl.kt index 861317980a9..98419ac09f6 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrFactoryImpl.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrFactoryImpl.kt @@ -15,6 +15,7 @@ import org.jetbrains.kotlin.ir.expressions.impl.IrBlockBodyImpl import org.jetbrains.kotlin.ir.expressions.impl.IrExpressionBodyImpl import org.jetbrains.kotlin.ir.symbols.* import org.jetbrains.kotlin.ir.types.IrType +import org.jetbrains.kotlin.ir.types.impl.IrUninitializedType import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource import org.jetbrains.kotlin.types.Variance @@ -83,9 +84,13 @@ abstract class AbstractIrFactoryImpl : IrFactory { containerSource: DeserializedContainerSource?, ): IrConstructor = IrConstructorImpl( - startOffset, endOffset, origin, symbol, name, visibility, returnType, isInline, isExternal, isPrimary, isExpect, + startOffset, endOffset, origin, symbol, name, visibility, isInline, isExternal, isPrimary, isExpect, containerSource, factory = this - ) + ).apply { + if (returnType != IrUninitializedType) { + this.returnType = returnType + } + } override fun createEnumEntry( startOffset: Int, @@ -137,10 +142,14 @@ abstract class AbstractIrFactoryImpl : IrFactory { isFakeOverride: Boolean, ): IrSimpleFunction = IrFunctionImpl( - startOffset, endOffset, origin, symbol, name, visibility, modality, returnType, + startOffset, endOffset, origin, symbol, name, visibility, modality, isInline, isExternal, isTailrec, isSuspend, isOperator, isInfix, isExpect, isFakeOverride, containerSource, factory = this - ) + ).apply { + if (returnType != IrUninitializedType) { + this.returnType = returnType + } + } override fun createFunctionWithLateBinding( startOffset: Int, @@ -166,7 +175,6 @@ abstract class AbstractIrFactoryImpl : IrFactory { name = name, visibility = visibility, modality = modality, - returnType = returnType, isInline = isInline, isExternal = isExternal, isTailrec = isTailrec, @@ -176,7 +184,11 @@ abstract class AbstractIrFactoryImpl : IrFactory { isExpect = isExpect, isFakeOverride = isFakeOverride, factory = this - ) + ).apply { + if (returnType != IrUninitializedType) { + this.returnType = returnType + } + } override fun createLocalDelegatedProperty( startOffset: Int, diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrFunctionImpl.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrFunctionImpl.kt index a73486f0c39..576d8e3a315 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrFunctionImpl.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrFunctionImpl.kt @@ -32,7 +32,6 @@ class IrFunctionImpl @IrImplementationDetail constructor( override var name: Name, override var visibility: DescriptorVisibility, override var modality: Modality, - returnType: IrType, override var isInline: Boolean, override var isExternal: Boolean, override var isTailrec: Boolean, @@ -55,13 +54,6 @@ class IrFunctionImpl @IrImplementationDetail constructor( override lateinit var parent: IrDeclarationParent override var annotations: List = emptyList() - override var returnType: IrType = returnType - get() = if (field === IrUninitializedType) { - throw ReturnTypeIsNotInitializedException(this) - } else { - field - } - override var typeParameters: List = emptyList() override var dispatchReceiverParameter: IrValueParameter? = null @@ -70,6 +62,8 @@ class IrFunctionImpl @IrImplementationDetail constructor( override var contextReceiverParametersCount: Int = 0 + override lateinit var returnType: IrType + override var body: IrBody? = null override var metadata: MetadataSource? = null diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrFunctionWithLateBindingImpl.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrFunctionWithLateBindingImpl.kt index 6d9d31eaa21..05c31c11594 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrFunctionWithLateBindingImpl.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrFunctionWithLateBindingImpl.kt @@ -28,7 +28,6 @@ class IrFunctionWithLateBindingImpl @IrImplementationDetail constructor( override var name: Name, override var visibility: DescriptorVisibility, override var modality: Modality, - returnType: IrType, override var isInline: Boolean, override var isExternal: Boolean, override var isTailrec: Boolean, @@ -66,13 +65,6 @@ class IrFunctionWithLateBindingImpl @IrImplementationDetail constructor( override var annotations: List = emptyList() - override var returnType: IrType = returnType - get() = if (field === IrUninitializedType) { - throw ReturnTypeIsNotInitializedException(this) - } else { - field - } - override var typeParameters: List = emptyList() override var dispatchReceiverParameter: IrValueParameter? = null @@ -81,6 +73,8 @@ class IrFunctionWithLateBindingImpl @IrImplementationDetail constructor( override var contextReceiverParametersCount: Int = 0 + override lateinit var returnType: IrType + override var body: IrBody? = null override var metadata: MetadataSource? = null