[Commonizer] Serialize commonized metadata for KLIB writer
- introduce EmptyDescriptorTable - wipe out unused BindingContext from KlibMetadataSerializer
This commit is contained in:
+14
-6
@@ -13,13 +13,21 @@ import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
|
||||
import org.jetbrains.kotlin.ir.util.KotlinMangler
|
||||
import org.jetbrains.kotlin.ir.util.UniqId
|
||||
|
||||
class DescriptorTable {
|
||||
private val descriptors = mutableMapOf<DeclarationDescriptor, Long>()
|
||||
fun put(descriptor: DeclarationDescriptor, uniqId: UniqId) {
|
||||
descriptors.getOrPut(descriptor) { uniqId.index }
|
||||
}
|
||||
interface DescriptorTable {
|
||||
fun put(descriptor: DeclarationDescriptor, uniqId: UniqId)
|
||||
fun get(descriptor: DeclarationDescriptor): Long?
|
||||
|
||||
fun get(descriptor: DeclarationDescriptor) = descriptors[descriptor]
|
||||
companion object {
|
||||
fun createDefault() = object : DescriptorTable {
|
||||
private val descriptors = mutableMapOf<DeclarationDescriptor, Long>()
|
||||
|
||||
override fun put(descriptor: DeclarationDescriptor, uniqId: UniqId) {
|
||||
descriptors.getOrPut(descriptor) { uniqId.index }
|
||||
}
|
||||
|
||||
override fun get(descriptor: DeclarationDescriptor) = descriptors[descriptor]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
interface UniqIdClashTracker {
|
||||
|
||||
+1
-4
@@ -9,7 +9,6 @@ import org.jetbrains.kotlin.backend.common.serialization.DescriptorTable
|
||||
import org.jetbrains.kotlin.backend.common.serialization.isExpectMember
|
||||
import org.jetbrains.kotlin.backend.common.serialization.isSerializableExpectClass
|
||||
import org.jetbrains.kotlin.backend.common.serialization.metadata.KlibMetadataSerializer
|
||||
import org.jetbrains.kotlin.backend.common.serialization.metadata.KlibMetadataVersion
|
||||
import org.jetbrains.kotlin.config.LanguageVersionSettings
|
||||
import org.jetbrains.kotlin.descriptors.CallableDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.ClassifierDescriptor
|
||||
@@ -19,7 +18,6 @@ import org.jetbrains.kotlin.library.SerializedMetadata
|
||||
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.fqNameSafe
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.module
|
||||
import org.jetbrains.kotlin.serialization.DescriptorSerializer
|
||||
@@ -32,7 +30,6 @@ class KlibMetadataIncrementalSerializer(
|
||||
) : KlibMetadataSerializer(languageVersionSettings, metadataVersion, descriptorTable) {
|
||||
|
||||
fun serializePackageFragment(
|
||||
bindingContext: BindingContext,
|
||||
module: ModuleDescriptor,
|
||||
scope: Collection<DeclarationDescriptor>,
|
||||
fqName: FqName
|
||||
@@ -58,7 +55,7 @@ class KlibMetadataIncrementalSerializer(
|
||||
// This is no always the case, actually.
|
||||
// But marrying split package fragments with incremental compilation is an endeavour.
|
||||
// See monolithic serializer for details.
|
||||
return serializeDescriptors(fqName, classifierDescriptors, topLevelDescriptors, bindingContext).single()
|
||||
return serializeDescriptors(fqName, classifierDescriptors, topLevelDescriptors).single()
|
||||
}
|
||||
|
||||
fun serializedMetadata(
|
||||
|
||||
+4
-10
@@ -10,7 +10,6 @@ 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.module
|
||||
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter
|
||||
import org.jetbrains.kotlin.resolve.scopes.getDescriptorsFiltered
|
||||
@@ -20,15 +19,10 @@ import org.jetbrains.kotlin.serialization.DescriptorSerializer
|
||||
class KlibMetadataMonolithicSerializer(
|
||||
languageVersionSettings: LanguageVersionSettings,
|
||||
metadataVersion: BinaryVersion,
|
||||
descriptorTable: DescriptorTable,
|
||||
val bindingContext: BindingContext
|
||||
descriptorTable: DescriptorTable
|
||||
) : KlibMetadataSerializer(languageVersionSettings, metadataVersion, descriptorTable) {
|
||||
|
||||
protected fun serializePackageFragment(fqName: FqName,
|
||||
module: ModuleDescriptor,
|
||||
bindingContext: BindingContext
|
||||
):
|
||||
List<ProtoBuf.PackageFragment> {
|
||||
private fun serializePackageFragment(fqName: FqName, module: ModuleDescriptor): List<ProtoBuf.PackageFragment> {
|
||||
|
||||
// TODO: ModuleDescriptor should be able to return
|
||||
// the package only with the contents of that module, without dependencies
|
||||
@@ -48,7 +42,7 @@ class KlibMetadataMonolithicSerializer(
|
||||
}.filter { !it.isExpectMember }
|
||||
)
|
||||
|
||||
return serializeDescriptors(fqName, classifierDescriptors, topLevelDescriptors, bindingContext)
|
||||
return serializeDescriptors(fqName, classifierDescriptors, topLevelDescriptors)
|
||||
}
|
||||
|
||||
fun serializeModule(moduleDescriptor: ModuleDescriptor): SerializedMetadata {
|
||||
@@ -59,7 +53,7 @@ class KlibMetadataMonolithicSerializer(
|
||||
|
||||
for (packageFqName in getPackagesFqNames(moduleDescriptor)) {
|
||||
val packageProtos =
|
||||
serializePackageFragment(packageFqName, moduleDescriptor, bindingContext)
|
||||
serializePackageFragment(packageFqName, moduleDescriptor)
|
||||
if (packageProtos.isEmpty()) continue
|
||||
|
||||
val packageFqNameStr = packageFqName.asString()
|
||||
|
||||
+6
-13
@@ -15,7 +15,6 @@ 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.scopes.DescriptorKindFilter
|
||||
import org.jetbrains.kotlin.serialization.DescriptorSerializer
|
||||
import org.jetbrains.kotlin.serialization.StringTableImpl
|
||||
@@ -69,8 +68,7 @@ abstract class KlibMetadataSerializer(
|
||||
packageProto: ProtoBuf.Package,
|
||||
classesProto: List<Pair<ProtoBuf.Class, Int>>,
|
||||
fqName: FqName,
|
||||
isEmpty: Boolean,
|
||||
bindingContext: BindingContext
|
||||
isEmpty: Boolean
|
||||
): ProtoBuf.PackageFragment {
|
||||
|
||||
val (stringTableProto, nameTableProto) = serializerExtension.stringTable.buildProto()
|
||||
@@ -130,8 +128,7 @@ abstract class KlibMetadataSerializer(
|
||||
protected fun serializeDescriptors(
|
||||
fqName: FqName,
|
||||
classifierDescriptors: List<DeclarationDescriptor>,
|
||||
topLevelDescriptors: List<DeclarationDescriptor>,
|
||||
bindingContext: BindingContext
|
||||
topLevelDescriptors: List<DeclarationDescriptor>
|
||||
): List<ProtoBuf.PackageFragment> {
|
||||
|
||||
if (TOP_LEVEL_CLASS_DECLARATION_COUNT_PER_FILE == null &&
|
||||
@@ -151,8 +148,7 @@ abstract class KlibMetadataSerializer(
|
||||
packageProto,
|
||||
serializeClasses(fqName, classifierDescriptors),
|
||||
fqName,
|
||||
topLevelDescriptors.isEmpty() && classifierDescriptors.isEmpty(),
|
||||
bindingContext
|
||||
topLevelDescriptors.isEmpty() && classifierDescriptors.isEmpty()
|
||||
)
|
||||
}
|
||||
)
|
||||
@@ -178,8 +174,7 @@ abstract class KlibMetadataSerializer(
|
||||
packageProto,
|
||||
classesProto,
|
||||
fqName,
|
||||
descriptors.isEmpty(),
|
||||
bindingContext
|
||||
descriptors.isEmpty()
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -190,8 +185,7 @@ abstract class KlibMetadataSerializer(
|
||||
buildPackageProto(fqName, descriptors),
|
||||
emptyList(),
|
||||
fqName,
|
||||
descriptors.isEmpty(),
|
||||
bindingContext
|
||||
descriptors.isEmpty()
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -202,8 +196,7 @@ abstract class KlibMetadataSerializer(
|
||||
emptyPackageProto(),
|
||||
emptyList(),
|
||||
fqName,
|
||||
true,
|
||||
bindingContext
|
||||
true
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user