diff --git a/core/deserialization/src/org/jetbrains/kotlin/builtins/BuiltInsLoaderImpl.kt b/core/deserialization/src/org/jetbrains/kotlin/builtins/BuiltInsLoaderImpl.kt index 68774177bd0..ff9d7ea5732 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/builtins/BuiltInsLoaderImpl.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/builtins/BuiltInsLoaderImpl.kt @@ -88,7 +88,7 @@ class BuiltInsLoaderImpl : BuiltInsLoader { ) for (packageFragment in packageFragments) { - packageFragment.components = components + packageFragment.initialize(components) } return provider diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/AbstractDeserializedPackageFragmentProvider.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/AbstractDeserializedPackageFragmentProvider.kt index ac06882990b..6d2152cb857 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/AbstractDeserializedPackageFragmentProvider.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/AbstractDeserializedPackageFragmentProvider.kt @@ -32,7 +32,7 @@ abstract class AbstractDeserializedPackageFragmentProvider( private val fragments = storageManager.createMemoizedFunctionWithNullableValues { fqName -> findPackage(fqName)?.apply { - components = this@AbstractDeserializedPackageFragmentProvider.components + initialize(components) } } diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/DeserializedPackageFragment.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/DeserializedPackageFragment.kt index 8cb441b7eb5..1db06368394 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/DeserializedPackageFragment.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/DeserializedPackageFragment.kt @@ -20,28 +20,19 @@ import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.impl.PackageFragmentDescriptorImpl import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name -import org.jetbrains.kotlin.resolve.scopes.MemberScope import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedMemberScope import org.jetbrains.kotlin.storage.StorageManager -import javax.inject.Inject abstract class DeserializedPackageFragment( fqName: FqName, protected val storageManager: StorageManager, module: ModuleDescriptor ) : PackageFragmentDescriptorImpl(module, fqName) { - // component dependency cycle - @set:Inject - lateinit var components: DeserializationComponents - private val memberScope = storageManager.createLazyValue { computeMemberScope() } + abstract fun initialize(components: DeserializationComponents) abstract val classDataFinder: ClassDataFinder - protected abstract fun computeMemberScope(): MemberScope - - override fun getMemberScope() = memberScope() - open fun hasTopLevelClass(name: Name): Boolean { val scope = getMemberScope() return scope is DeserializedMemberScope && name in scope.classNames diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/DeserializedPackageFragmentImpl.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/DeserializedPackageFragmentImpl.kt index 7871a1e2c1f..5863ac88f6c 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/DeserializedPackageFragmentImpl.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/DeserializedPackageFragmentImpl.kt @@ -21,28 +21,34 @@ import org.jetbrains.kotlin.descriptors.SourceElement import org.jetbrains.kotlin.metadata.ProtoBuf import org.jetbrains.kotlin.metadata.deserialization.NameResolverImpl import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.resolve.scopes.MemberScope import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedPackageMemberScope import org.jetbrains.kotlin.storage.StorageManager abstract class DeserializedPackageFragmentImpl( - fqName: FqName, - storageManager: StorageManager, - module: ModuleDescriptor, - protected val proto: ProtoBuf.PackageFragment, - private val containerSource: DeserializedContainerSource? + fqName: FqName, + storageManager: StorageManager, + module: ModuleDescriptor, + protected val proto: ProtoBuf.PackageFragment, + private val containerSource: DeserializedContainerSource? ) : DeserializedPackageFragment(fqName, storageManager, module) { protected val nameResolver = NameResolverImpl(proto.strings, proto.qualifiedNames) override val classDataFinder = ProtoBasedClassDataFinder(proto, nameResolver) { containerSource ?: SourceElement.NO_SOURCE } - override fun computeMemberScope() = - DeserializedPackageMemberScope( - this, proto.`package`, nameResolver, containerSource, components, - classNames = { - classDataFinder.allClassIds.filter { classId -> - !classId.isNestedClass && classId !in ClassDeserializer.BLACK_LIST - }.map { it.shortClassName } - } - ) + private lateinit var _memberScope: MemberScope + + override fun initialize(components: DeserializationComponents) { + _memberScope = DeserializedPackageMemberScope( + this, proto.`package`, nameResolver, containerSource, components, + classNames = { + classDataFinder.allClassIds.filter { classId -> + !classId.isNestedClass && classId !in ClassDeserializer.BLACK_LIST + }.map { it.shortClassName } + } + ) + } + + override fun getMemberScope(): MemberScope = _memberScope } diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MetadataPackageFragmentProvider.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MetadataPackageFragmentProvider.kt index 1baf152fb55..6016b2c2782 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MetadataPackageFragmentProvider.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MetadataPackageFragmentProvider.kt @@ -87,7 +87,15 @@ class MetadataPackageFragment( } } - override fun computeMemberScope(): MemberScope { + private lateinit var components: DeserializationComponents + + override fun initialize(components: DeserializationComponents) { + this.components = components + } + + private val memberScope = storageManager.createLazyValue { computeMemberScope() } + + private fun computeMemberScope(): MemberScope { // For each .kotlin_metadata file which represents a package part, add a separate deserialized scope // with top level callables and type aliases (but no classes) only from that part val packageParts = packagePartProvider.findMetadataPackageParts(fqName.asString()) @@ -115,6 +123,8 @@ class MetadataPackageFragment( return ChainedMemberScope.create("Metadata scope", scopes) } + override fun getMemberScope() = memberScope() + override fun hasTopLevelClass(name: Name): Boolean { // TODO: check if the corresponding file exists return true diff --git a/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptPackageFragment.kt b/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptPackageFragment.kt index b1e97805e04..6d04a34a34f 100644 --- a/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptPackageFragment.kt +++ b/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptPackageFragment.kt @@ -46,8 +46,11 @@ class KotlinJavascriptPackageFragment( } } - private val annotationDeserializer: AnnotationDeserializer by storageManager.createLazyValue { - AnnotationDeserializer(module, components.notFoundClasses) + private lateinit var annotationDeserializer: AnnotationDeserializer + + override fun initialize(components: DeserializationComponents) { + super.initialize(components) + this.annotationDeserializer = AnnotationDeserializer(components.moduleDescriptor, components.notFoundClasses) } fun getContainingFileAnnotations(descriptor: DeclarationDescriptor): List { diff --git a/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/kotlinJavascriptPackageFragmentProvider.kt b/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/kotlinJavascriptPackageFragmentProvider.kt index 17e6fba3110..49da1c6afa7 100644 --- a/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/kotlinJavascriptPackageFragmentProvider.kt +++ b/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/kotlinJavascriptPackageFragmentProvider.kt @@ -80,7 +80,7 @@ fun createKotlinJavascriptPackageFragmentProvider( ) for (packageFragment in packageFragments.filterIsInstance()) { - packageFragment.components = components + packageFragment.initialize(components) } return provider