diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ModuleDescriptorImpl.kt b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ModuleDescriptorImpl.kt index e029e3a4c36..2c561a014f8 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ModuleDescriptorImpl.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ModuleDescriptorImpl.kt @@ -47,6 +47,10 @@ class ModuleDescriptorImpl @JvmOverloads constructor( private var dependencies: ModuleDependencies? = null private var packageFragmentProviderForModuleContent: PackageFragmentProvider? = null + val packageFragmentProviderForModuleContentWithoutDependencies: PackageFragmentProvider + get() = packageFragmentProviderForModuleContent + ?: throw IllegalStateException("Module $id was not initialized by the time it's content without dependencies was queried") + override var isValid: Boolean = true override fun assertValid() { diff --git a/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptSerializationUtil.kt b/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptSerializationUtil.kt index 04df9b5f2ee..e487a2e269f 100644 --- a/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptSerializationUtil.kt +++ b/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptSerializationUtil.kt @@ -19,6 +19,7 @@ package org.jetbrains.kotlin.serialization.js import org.jetbrains.kotlin.config.AnalysisFlags import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.descriptors.* +import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.metadata.ProtoBuf @@ -31,8 +32,6 @@ import org.jetbrains.kotlin.resolve.checkers.ExpectedActualDeclarationChecker import org.jetbrains.kotlin.resolve.descriptorUtil.filterOutSourceAnnotations import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe import org.jetbrains.kotlin.resolve.descriptorUtil.module -import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter -import org.jetbrains.kotlin.resolve.scopes.MemberScope import org.jetbrains.kotlin.serialization.AnnotationSerializer import org.jetbrains.kotlin.serialization.DescriptorSerializer import org.jetbrains.kotlin.serialization.StringTableImpl @@ -280,21 +279,18 @@ object KotlinJavascriptSerializationUtil { fun getPackagesFqNames(module: ModuleDescriptor): Set { return mutableSetOf().apply { - getSubPackagesFqNames(module.getPackage(FqName.ROOT), this) + getSubPackagesFqNames(module.packageFragmentProviderForModuleContentWithoutDependencies, FqName.ROOT, this) add(FqName.ROOT) } } - private fun getSubPackagesFqNames(packageView: PackageViewDescriptor, result: MutableSet) { - val fqName = packageView.fqName + private fun getSubPackagesFqNames(packageFragmentProvider: PackageFragmentProvider, fqName: FqName, result: MutableSet) { if (!fqName.isRoot) { result.add(fqName) } - for (descriptor in packageView.memberScope.getContributedDescriptors(DescriptorKindFilter.PACKAGES, MemberScope.ALL_NAME_FILTER)) { - if (descriptor is PackageViewDescriptor) { - getSubPackagesFqNames(descriptor, result) - } + for (subPackage in packageFragmentProvider.getSubPackagesOf(fqName) { true }) { + getSubPackagesFqNames(packageFragmentProvider, subPackage, result) } } @@ -329,7 +325,9 @@ fun Map.missingMetadata( val fragment = KotlinJavascriptSerializationUtil.serializeDescriptors( bindingContext, moduleDescriptor, - moduleDescriptor.getPackage(fqName).memberScope.getContributedDescriptors(), + moduleDescriptor.packageFragmentProviderForModuleContentWithoutDependencies.getPackageFragments(fqName).flatMap { + it.getMemberScope().getContributedDescriptors() + }, fqName, languageVersionSettings, metadataVersion ) @@ -341,6 +339,10 @@ fun Map.missingMetadata( return serializedFragments } +private val ModuleDescriptor.packageFragmentProviderForModuleContentWithoutDependencies + get() = (this as? ModuleDescriptorImpl)?.packageFragmentProviderForModuleContentWithoutDependencies + ?: throw IllegalStateException("Unsupported ModuleDescriptor kind: ${this::javaClass}") + private fun ProtoBuf.PackageFragment.isEmpty(): Boolean = class_Count == 0 && `package`.let { it.functionCount == 0 && it.propertyCount == 0 && it.typeAliasCount == 0 }