[KLIB IC] Fix file index allocation, make them stable between recompilations
This commit is contained in:
+3
-24
@@ -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()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+5
-1
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user