JS: don't visit all descriptors on metadata serialization
This commit is contained in:
@@ -47,6 +47,10 @@ class ModuleDescriptorImpl @JvmOverloads constructor(
|
|||||||
private var dependencies: ModuleDependencies? = null
|
private var dependencies: ModuleDependencies? = null
|
||||||
private var packageFragmentProviderForModuleContent: PackageFragmentProvider? = 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 var isValid: Boolean = true
|
||||||
|
|
||||||
override fun assertValid() {
|
override fun assertValid() {
|
||||||
|
|||||||
+12
-10
@@ -19,6 +19,7 @@ package org.jetbrains.kotlin.serialization.js
|
|||||||
import org.jetbrains.kotlin.config.AnalysisFlags
|
import org.jetbrains.kotlin.config.AnalysisFlags
|
||||||
import org.jetbrains.kotlin.config.LanguageVersionSettings
|
import org.jetbrains.kotlin.config.LanguageVersionSettings
|
||||||
import org.jetbrains.kotlin.descriptors.*
|
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.LookupTracker
|
||||||
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
|
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
|
||||||
import org.jetbrains.kotlin.metadata.ProtoBuf
|
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.filterOutSourceAnnotations
|
||||||
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe
|
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe
|
||||||
import org.jetbrains.kotlin.resolve.descriptorUtil.module
|
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.AnnotationSerializer
|
||||||
import org.jetbrains.kotlin.serialization.DescriptorSerializer
|
import org.jetbrains.kotlin.serialization.DescriptorSerializer
|
||||||
import org.jetbrains.kotlin.serialization.StringTableImpl
|
import org.jetbrains.kotlin.serialization.StringTableImpl
|
||||||
@@ -280,21 +279,18 @@ object KotlinJavascriptSerializationUtil {
|
|||||||
|
|
||||||
fun getPackagesFqNames(module: ModuleDescriptor): Set<FqName> {
|
fun getPackagesFqNames(module: ModuleDescriptor): Set<FqName> {
|
||||||
return mutableSetOf<FqName>().apply {
|
return mutableSetOf<FqName>().apply {
|
||||||
getSubPackagesFqNames(module.getPackage(FqName.ROOT), this)
|
getSubPackagesFqNames(module.packageFragmentProviderForModuleContentWithoutDependencies, FqName.ROOT, this)
|
||||||
add(FqName.ROOT)
|
add(FqName.ROOT)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getSubPackagesFqNames(packageView: PackageViewDescriptor, result: MutableSet<FqName>) {
|
private fun getSubPackagesFqNames(packageFragmentProvider: PackageFragmentProvider, fqName: FqName, result: MutableSet<FqName>) {
|
||||||
val fqName = packageView.fqName
|
|
||||||
if (!fqName.isRoot) {
|
if (!fqName.isRoot) {
|
||||||
result.add(fqName)
|
result.add(fqName)
|
||||||
}
|
}
|
||||||
|
|
||||||
for (descriptor in packageView.memberScope.getContributedDescriptors(DescriptorKindFilter.PACKAGES, MemberScope.ALL_NAME_FILTER)) {
|
for (subPackage in packageFragmentProvider.getSubPackagesOf(fqName) { true }) {
|
||||||
if (descriptor is PackageViewDescriptor) {
|
getSubPackagesFqNames(packageFragmentProvider, subPackage, result)
|
||||||
getSubPackagesFqNames(descriptor, result)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -329,7 +325,9 @@ fun Map<FqName, ByteArray>.missingMetadata(
|
|||||||
|
|
||||||
val fragment = KotlinJavascriptSerializationUtil.serializeDescriptors(
|
val fragment = KotlinJavascriptSerializationUtil.serializeDescriptors(
|
||||||
bindingContext, moduleDescriptor,
|
bindingContext, moduleDescriptor,
|
||||||
moduleDescriptor.getPackage(fqName).memberScope.getContributedDescriptors(),
|
moduleDescriptor.packageFragmentProviderForModuleContentWithoutDependencies.getPackageFragments(fqName).flatMap {
|
||||||
|
it.getMemberScope().getContributedDescriptors()
|
||||||
|
},
|
||||||
fqName, languageVersionSettings, metadataVersion
|
fqName, languageVersionSettings, metadataVersion
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -341,6 +339,10 @@ fun Map<FqName, ByteArray>.missingMetadata(
|
|||||||
return serializedFragments
|
return serializedFragments
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private val ModuleDescriptor.packageFragmentProviderForModuleContentWithoutDependencies
|
||||||
|
get() = (this as? ModuleDescriptorImpl)?.packageFragmentProviderForModuleContentWithoutDependencies
|
||||||
|
?: throw IllegalStateException("Unsupported ModuleDescriptor kind: ${this::javaClass}")
|
||||||
|
|
||||||
private fun ProtoBuf.PackageFragment.isEmpty(): Boolean =
|
private fun ProtoBuf.PackageFragment.isEmpty(): Boolean =
|
||||||
class_Count == 0 && `package`.let { it.functionCount == 0 && it.propertyCount == 0 && it.typeAliasCount == 0 }
|
class_Count == 0 && `package`.let { it.functionCount == 0 && it.propertyCount == 0 && it.typeAliasCount == 0 }
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user