From 1bced5d2a25a541b44514e1451589331a58393da Mon Sep 17 00:00:00 2001 From: Roman Artemev Date: Fri, 11 Oct 2019 19:13:35 +0300 Subject: [PATCH] [KLIB IC] Fix file index allocation, make them stable between recompilations --- .../metadata/KlibMetadataSerializer.kt | 27 +++---------------- .../KlibMetadataSerializerExtension.kt | 6 ++++- .../jetbrains/kotlin/ir/backend/js/klib.kt | 3 ++- 3 files changed, 10 insertions(+), 26 deletions(-) diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/metadata/KlibMetadataSerializer.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/metadata/KlibMetadataSerializer.kt index 5214ce8a0ab..d9c3a1d281e 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/metadata/KlibMetadataSerializer.kt +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/metadata/KlibMetadataSerializer.kt @@ -11,15 +11,12 @@ import org.jetbrains.kotlin.config.AnalysisFlags import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.incremental.components.NoLookupLocation -import org.jetbrains.kotlin.library.metadata.KlibMetadataFileRegistry import org.jetbrains.kotlin.library.metadata.KlibMetadataProtoBuf import org.jetbrains.kotlin.metadata.ProtoBuf import org.jetbrains.kotlin.metadata.deserialization.BinaryVersion import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.resolve.BindingContext -import org.jetbrains.kotlin.resolve.descriptorUtil.filterOutSourceAnnotations import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter -import org.jetbrains.kotlin.serialization.AnnotationSerializer import org.jetbrains.kotlin.serialization.DescriptorSerializer import org.jetbrains.kotlin.serialization.StringTableImpl import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedClassDescriptor @@ -34,7 +31,6 @@ abstract class KlibMetadataSerializer( val metadataVersion: BinaryVersion, val descriptorTable: DescriptorTable ) { - val fileRegistry = KlibMetadataFileRegistry() lateinit var serializerContext: SerializerContext @@ -44,9 +40,9 @@ abstract class KlibMetadataSerializer( var classSerializer: DescriptorSerializer = topSerializer ) - fun declarationTableHandler(declarationDescriptor: DeclarationDescriptor): KlibMetadataProtoBuf.DescriptorUniqId { + private fun declarationTableHandler(declarationDescriptor: DeclarationDescriptor): KlibMetadataProtoBuf.DescriptorUniqId { val index = descriptorTable.get(declarationDescriptor) ?: error("No descriptor ID found for $declarationDescriptor") - return index.let { newDescriptorUniqId(it) } + return newDescriptorUniqId(index) } protected fun createNewContext(): SerializerContext { @@ -55,7 +51,6 @@ abstract class KlibMetadataSerializer( languageVersionSettings, metadataVersion, ::declarationTableHandler, - {descriptor: DeclarationDescriptorWithSource -> fileRegistry.assign(descriptor.source.containingFile) } , KlibMetadataStringTable() ) return SerializerContext( @@ -216,20 +211,6 @@ abstract class KlibMetadataSerializer( return result } - private fun serializeFiles( - header: KlibMetadataProtoBuf.Header.Builder, - fileRegistry: KlibMetadataFileRegistry - ) { - - fileRegistry.filesAndClear().map { it.name ?: "" }.forEach { - val fileProto = KlibMetadataProtoBuf.File.newBuilder() - .setName(it) - .build() - - header.addFile(fileProto) - } - } - protected fun getPackagesFqNames(module: ModuleDescriptor): Set { val result = mutableSetOf() @@ -245,7 +226,7 @@ abstract class KlibMetadataSerializer( fun serializeHeader( moduleDescriptor: ModuleDescriptor, fragmentNames: List, - emptyPackages: List = emptyList() + emptyPackages: List ): KlibMetadataProtoBuf.Header { val header = KlibMetadataProtoBuf.Header.newBuilder() @@ -275,8 +256,6 @@ abstract class KlibMetadataSerializer( header.addEmptyPackage(it) } - serializeFiles(header, fileRegistry) - return header.build() } diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/metadata/KlibMetadataSerializerExtension.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/metadata/KlibMetadataSerializerExtension.kt index 215ba780ab4..c532f7fd330 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/metadata/KlibMetadataSerializerExtension.kt +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/metadata/KlibMetadataSerializerExtension.kt @@ -22,11 +22,15 @@ class KlibMetadataSerializerExtension( private val languageVersionSettings: LanguageVersionSettings, override val metadataVersion: BinaryVersion, val declarationTableHandler: (DeclarationDescriptor) -> KlibMetadataProtoBuf.DescriptorUniqId?, - val descriptorFileId: (DeclarationDescriptorWithSource) -> Int?, override val stringTable: StringTableImpl ) : KotlinSerializerExtensionBase(KlibMetadataSerializerProtocol) { override fun shouldUseTypeTable(): Boolean = true + private fun descriptorFileId(descriptor: DeclarationDescriptorWithSource): Int? { + val fileName = descriptor.source.containingFile.name ?: return null + return stringTable.getStringIndex(fileName) + } + override fun serializeFlexibleType(flexibleType: FlexibleType, lowerProto: ProtoBuf.Type.Builder, upperProto: ProtoBuf.Type.Builder) { lowerProto.flexibleTypeCapabilitiesId = stringTable.getStringIndex(DynamicTypeDeserializer.id) } diff --git a/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/klib.kt b/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/klib.kt index 2ac07eb2d4e..d789f1d41f7 100644 --- a/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/klib.kt +++ b/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/klib.kt @@ -365,7 +365,8 @@ fun serializeModuleIntoKlib( val header = metadataSerializer.serializeHeader( moduleDescriptor, - compiledKotlinFiles.map { it.irData.fqName }.distinct() + compiledKotlinFiles.map { it.irData.fqName }.distinct(), + emptyList() ).toByteArray() incrementalResultsConsumer?.run { processHeader(header)