[Commonizer] Serialize commonized metadata for KLIB writer

- introduce EmptyDescriptorTable
- wipe out unused BindingContext from KlibMetadataSerializer
This commit is contained in:
Dmitriy Dolovov
2019-12-10 12:46:20 +03:00
parent ce376f49fd
commit 18117ed1f3
7 changed files with 77 additions and 66 deletions
@@ -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 {
@@ -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(
@@ -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()
@@ -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
)
}
}