[IR SERIALIZATION] Do not track non-metadata descriptors in descriptor table

This commit is contained in:
Roman Artemev
2019-08-12 15:03:21 +03:00
committed by romanart
parent df5f6a2a12
commit 5e14b94a88
3 changed files with 40 additions and 12 deletions
@@ -6,7 +6,9 @@
package org.jetbrains.kotlin.backend.common.serialization
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.declarations.lazy.IrLazyDeclarationBase
import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
class DescriptorTable {
@@ -14,6 +16,7 @@ class DescriptorTable {
fun put(descriptor: DeclarationDescriptor, uniqId: UniqId) {
descriptors.getOrPut(descriptor) { uniqId.index }
}
fun get(descriptor: DeclarationDescriptor) = descriptors[descriptor]
}
@@ -46,7 +49,7 @@ class DeclarationTable(
private val table = mutableMapOf<IrDeclaration, UniqId>()
private fun IrDeclaration.isLocalDeclaration(): Boolean {
return origin == IrDeclarationOrigin.FAKE_OVERRIDE || !isExportedDeclaration(this) || this is IrVariable || this is IrValueParameter || this is IrAnonymousInitializer || this is IrLocalDelegatedProperty
return origin == IrDeclarationOrigin.FAKE_OVERRIDE || !isExportedDeclaration(this) || this is IrValueDeclaration || this is IrAnonymousInitializer || this is IrLocalDelegatedProperty
}
private var localIndex = startIndex
@@ -61,9 +64,40 @@ class DeclarationTable(
fun uniqIdByDeclaration(declaration: IrDeclaration): UniqId {
val uniqId = computeUniqIdByDeclaration(declaration)
descriptorTable.put(declaration.descriptor, uniqId)
if (declaration.isMetadataDeclaration(false)) {
descriptorTable.put(declaration.descriptor, uniqId)
}
return uniqId
}
private tailrec fun IrDeclaration.isMetadataDeclaration(isTypeParameter: Boolean): Boolean {
if (this is IrValueDeclaration || this is IrField) {
return false
}
if (origin == IrDeclarationOrigin.FAKE_OVERRIDE || origin == IrDeclarationOrigin.ENUM_CLASS_SPECIAL_MEMBER) {
return false
}
if (!isTypeParameter) {
if (this is IrSimpleFunction) {
if (correspondingPropertySymbol != null)
return false
}
}
if (this is IrDeclarationWithVisibility) {
if (visibility == Visibilities.LOCAL) {
return false
}
}
if (this is IrLazyDeclarationBase) return false
if (parent is IrPackageFragment) return true
return (parent as IrDeclaration).isMetadataDeclaration(this is IrTypeParameter || isTypeParameter)
}
}
// This is what we pre-populate tables with
@@ -296,7 +296,8 @@ fun serializeModuleIntoKlib(
) {
val descriptorTable = DescriptorTable()
val serializedIr = JsIrModuleSerializer(emptyLoggingContext, moduleFragment.irBuiltins, descriptorTable).serializedIrModule(moduleFragment)
val serializedIr =
JsIrModuleSerializer(emptyLoggingContext, moduleFragment.irBuiltins, descriptorTable).serializedIrModule(moduleFragment)
val serializer = JsKlibMetadataSerializationUtil
val moduleDescription =
@@ -307,8 +308,8 @@ fun serializeModuleIntoKlib(
languageVersionSettings,
metadataVersion
) { declarationDescriptor ->
val index = descriptorTable.get(declarationDescriptor)
index?.let { newJsDescriptorUniqId(it) }
val index = descriptorTable.get(declarationDescriptor) ?: error("No descriptor ID found for $declarationDescriptor")
newJsDescriptorUniqId(index)
}
val abiVersion = KotlinAbiVersion.CURRENT
@@ -31,8 +31,6 @@ class JsKlibMetadataSerializerExtension(
}
private fun uniqId(descriptor: DeclarationDescriptor): JsKlibMetadataProtoBuf.DescriptorUniqId? {
// val index = declarationTable.descriptorTable.get(descriptor)
// return index?.let { newDescriptorUniqId(it) }
return declarationTableHandler(descriptor)
}
@@ -46,11 +44,6 @@ class JsKlibMetadataSerializerExtension(
super.serializeTypeAlias(typeAlias, proto)
}
override fun serializeValueParameter(descriptor: ValueParameterDescriptor, proto: ProtoBuf.ValueParameter.Builder) {
uniqId(descriptor)?.let { proto.setExtension(JsKlibMetadataProtoBuf.valueParamUniqId, it) }
super.serializeValueParameter(descriptor, proto)
}
override fun serializeEnumEntry(descriptor: ClassDescriptor, proto: ProtoBuf.EnumEntry.Builder) {
uniqId(descriptor)?.let { proto.setExtension(JsKlibMetadataProtoBuf.enumEntryUniqId, it) }
super.serializeEnumEntry(descriptor, proto)