[KLIB IC] Fix file index allocation, make them stable between recompilations

This commit is contained in:
Roman Artemev
2019-10-11 19:13:35 +03:00
committed by romanart
parent ab506c1579
commit 1bced5d2a2
3 changed files with 10 additions and 26 deletions
@@ -11,15 +11,12 @@ 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.incremental.components.NoLookupLocation 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.library.metadata.KlibMetadataProtoBuf
import org.jetbrains.kotlin.metadata.ProtoBuf import org.jetbrains.kotlin.metadata.ProtoBuf
import org.jetbrains.kotlin.metadata.deserialization.BinaryVersion import org.jetbrains.kotlin.metadata.deserialization.BinaryVersion
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.descriptorUtil.filterOutSourceAnnotations
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter
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
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedClassDescriptor import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedClassDescriptor
@@ -34,7 +31,6 @@ abstract class KlibMetadataSerializer(
val metadataVersion: BinaryVersion, val metadataVersion: BinaryVersion,
val descriptorTable: DescriptorTable val descriptorTable: DescriptorTable
) { ) {
val fileRegistry = KlibMetadataFileRegistry()
lateinit var serializerContext: SerializerContext lateinit var serializerContext: SerializerContext
@@ -44,9 +40,9 @@ abstract class KlibMetadataSerializer(
var classSerializer: DescriptorSerializer = topSerializer 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") val index = descriptorTable.get(declarationDescriptor) ?: error("No descriptor ID found for $declarationDescriptor")
return index.let { newDescriptorUniqId(it) } return newDescriptorUniqId(index)
} }
protected fun createNewContext(): SerializerContext { protected fun createNewContext(): SerializerContext {
@@ -55,7 +51,6 @@ abstract class KlibMetadataSerializer(
languageVersionSettings, languageVersionSettings,
metadataVersion, metadataVersion,
::declarationTableHandler, ::declarationTableHandler,
{descriptor: DeclarationDescriptorWithSource -> fileRegistry.assign(descriptor.source.containingFile) } ,
KlibMetadataStringTable() KlibMetadataStringTable()
) )
return SerializerContext( return SerializerContext(
@@ -216,20 +211,6 @@ abstract class KlibMetadataSerializer(
return result 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<FqName> { protected fun getPackagesFqNames(module: ModuleDescriptor): Set<FqName> {
val result = mutableSetOf<FqName>() val result = mutableSetOf<FqName>()
@@ -245,7 +226,7 @@ abstract class KlibMetadataSerializer(
fun serializeHeader( fun serializeHeader(
moduleDescriptor: ModuleDescriptor, moduleDescriptor: ModuleDescriptor,
fragmentNames: List<String>, fragmentNames: List<String>,
emptyPackages: List<String> = emptyList() emptyPackages: List<String>
): KlibMetadataProtoBuf.Header { ): KlibMetadataProtoBuf.Header {
val header = KlibMetadataProtoBuf.Header.newBuilder() val header = KlibMetadataProtoBuf.Header.newBuilder()
@@ -275,8 +256,6 @@ abstract class KlibMetadataSerializer(
header.addEmptyPackage(it) header.addEmptyPackage(it)
} }
serializeFiles(header, fileRegistry)
return header.build() return header.build()
} }
@@ -22,11 +22,15 @@ class KlibMetadataSerializerExtension(
private val languageVersionSettings: LanguageVersionSettings, private val languageVersionSettings: LanguageVersionSettings,
override val metadataVersion: BinaryVersion, override val metadataVersion: BinaryVersion,
val declarationTableHandler: (DeclarationDescriptor) -> KlibMetadataProtoBuf.DescriptorUniqId?, val declarationTableHandler: (DeclarationDescriptor) -> KlibMetadataProtoBuf.DescriptorUniqId?,
val descriptorFileId: (DeclarationDescriptorWithSource) -> Int?,
override val stringTable: StringTableImpl override val stringTable: StringTableImpl
) : KotlinSerializerExtensionBase(KlibMetadataSerializerProtocol) { ) : KotlinSerializerExtensionBase(KlibMetadataSerializerProtocol) {
override fun shouldUseTypeTable(): Boolean = true 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) { override fun serializeFlexibleType(flexibleType: FlexibleType, lowerProto: ProtoBuf.Type.Builder, upperProto: ProtoBuf.Type.Builder) {
lowerProto.flexibleTypeCapabilitiesId = stringTable.getStringIndex(DynamicTypeDeserializer.id) lowerProto.flexibleTypeCapabilitiesId = stringTable.getStringIndex(DynamicTypeDeserializer.id)
} }
@@ -365,7 +365,8 @@ fun serializeModuleIntoKlib(
val header = metadataSerializer.serializeHeader( val header = metadataSerializer.serializeHeader(
moduleDescriptor, moduleDescriptor,
compiledKotlinFiles.map { it.irData.fqName }.distinct() compiledKotlinFiles.map { it.irData.fqName }.distinct(),
emptyList()
).toByteArray() ).toByteArray()
incrementalResultsConsumer?.run { incrementalResultsConsumer?.run {
processHeader(header) processHeader(header)