From aa7b4cfbe627ae0996ab6c992085acbe978610ef Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Thu, 19 Jan 2023 14:49:59 +0100 Subject: [PATCH] Do not eagerly compute deserialized typealias constructors Otherwise, when adding a typealias to core/builtins, it leads to an exception "JvmBuiltins instance has not been initialized properly". It happens because we start computing typealias constructors even before the compiler has been initialized properly. Basically we're creating the container, and as a part of it, we're computing default imports, and for that we need to get all top-level classifiers from scopes imported by default, which includes typealiases. Eager call to `getTypeAliasConstructors` here results in computing constructors of the class descriptor on the RHS of the type alias, which is not possible if that class is built-in, since the container has not yet been created and thus `JvmBuiltIns` has not been initialized yet. No tests added, and no issue is affected because, as mentioned above, the problem is only reproducible if we add something to core/builtins. --- .../descriptors/LazyTypeAliasDescriptor.kt | 4 ++-- .../impl/AbstractTypeAliasDescriptor.kt | 8 ++++--- .../DeserializedMemberDescriptor.kt | 24 +++++++++---------- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyTypeAliasDescriptor.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyTypeAliasDescriptor.kt index 3b4698f416c..417b16d09de 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyTypeAliasDescriptor.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyTypeAliasDescriptor.kt @@ -32,14 +32,14 @@ import org.jetbrains.kotlin.storage.getValue import org.jetbrains.kotlin.types.* class LazyTypeAliasDescriptor( - override val storageManager: StorageManager, + storageManager: StorageManager, private val trace: BindingTrace, containingDeclaration: DeclarationDescriptor, annotations: Annotations, name: Name, sourceElement: SourceElement, visibility: DescriptorVisibility -) : AbstractTypeAliasDescriptor(containingDeclaration, annotations, name, sourceElement, visibility), +) : AbstractTypeAliasDescriptor(storageManager, containingDeclaration, annotations, name, sourceElement, visibility), TypeAliasDescriptor { override val constructors: Collection by storageManager.createLazyValue { getTypeAliasConstructors() diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/AbstractTypeAliasDescriptor.kt b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/AbstractTypeAliasDescriptor.kt index 08565623b66..cb46d5299ce 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/AbstractTypeAliasDescriptor.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/AbstractTypeAliasDescriptor.kt @@ -23,11 +23,12 @@ import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns import org.jetbrains.kotlin.resolve.scopes.MemberScope import org.jetbrains.kotlin.storage.StorageManager +import org.jetbrains.kotlin.storage.getValue import org.jetbrains.kotlin.types.* import org.jetbrains.kotlin.types.checker.KotlinTypeRefiner -import org.jetbrains.kotlin.types.TypeRefinement abstract class AbstractTypeAliasDescriptor( + protected val storageManager: StorageManager, containingDeclaration: DeclarationDescriptor, annotations: Annotations, name: Name, @@ -35,8 +36,9 @@ abstract class AbstractTypeAliasDescriptor( private val visibilityImpl: DescriptorVisibility ) : DeclarationDescriptorNonRootImpl(containingDeclaration, annotations, name, sourceElement), TypeAliasDescriptor { - - protected abstract val storageManager: StorageManager + override val constructors: Collection by storageManager.createLazyValue { + getTypeAliasConstructors() + } // TODO kotlinize some interfaces private lateinit var declaredTypeParametersImpl: List diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedMemberDescriptor.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedMemberDescriptor.kt index de19f433664..07449a5b709 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedMemberDescriptor.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedMemberDescriptor.kt @@ -155,19 +155,18 @@ class DeserializedClassConstructorDescriptor( } class DeserializedTypeAliasDescriptor( - override val storageManager: StorageManager, - containingDeclaration: DeclarationDescriptor, - annotations: Annotations, - name: Name, - visibility: DescriptorVisibility, - override val proto: ProtoBuf.TypeAlias, - override val nameResolver: NameResolver, - override val typeTable: TypeTable, - override val versionRequirementTable: VersionRequirementTable, - override val containerSource: DeserializedContainerSource? -) : AbstractTypeAliasDescriptor(containingDeclaration, annotations, name, SourceElement.NO_SOURCE, visibility), + storageManager: StorageManager, + containingDeclaration: DeclarationDescriptor, + annotations: Annotations, + name: Name, + visibility: DescriptorVisibility, + override val proto: ProtoBuf.TypeAlias, + override val nameResolver: NameResolver, + override val typeTable: TypeTable, + override val versionRequirementTable: VersionRequirementTable, + override val containerSource: DeserializedContainerSource? +) : AbstractTypeAliasDescriptor(storageManager, containingDeclaration, annotations, name, SourceElement.NO_SOURCE, visibility), DeserializedMemberDescriptor { - override lateinit var constructors: Collection private set override lateinit var underlyingType: SimpleType private set override lateinit var expandedType: SimpleType private set @@ -184,7 +183,6 @@ class DeserializedTypeAliasDescriptor( this.expandedType = expandedType typeConstructorParameters = computeConstructorTypeParameters() defaultTypeImpl = computeDefaultType() - constructors = getTypeAliasConstructors() } override val classDescriptor: ClassDescriptor?