[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 package org.jetbrains.kotlin.backend.common.serialization
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.declarations.lazy.IrLazyDeclarationBase
import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
class DescriptorTable { class DescriptorTable {
@@ -14,6 +16,7 @@ class DescriptorTable {
fun put(descriptor: DeclarationDescriptor, uniqId: UniqId) { fun put(descriptor: DeclarationDescriptor, uniqId: UniqId) {
descriptors.getOrPut(descriptor) { uniqId.index } descriptors.getOrPut(descriptor) { uniqId.index }
} }
fun get(descriptor: DeclarationDescriptor) = descriptors[descriptor] fun get(descriptor: DeclarationDescriptor) = descriptors[descriptor]
} }
@@ -46,7 +49,7 @@ class DeclarationTable(
private val table = mutableMapOf<IrDeclaration, UniqId>() private val table = mutableMapOf<IrDeclaration, UniqId>()
private fun IrDeclaration.isLocalDeclaration(): Boolean { 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 private var localIndex = startIndex
@@ -61,9 +64,40 @@ class DeclarationTable(
fun uniqIdByDeclaration(declaration: IrDeclaration): UniqId { fun uniqIdByDeclaration(declaration: IrDeclaration): UniqId {
val uniqId = computeUniqIdByDeclaration(declaration) val uniqId = computeUniqIdByDeclaration(declaration)
descriptorTable.put(declaration.descriptor, uniqId) if (declaration.isMetadataDeclaration(false)) {
descriptorTable.put(declaration.descriptor, uniqId)
}
return 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 // This is what we pre-populate tables with
@@ -296,7 +296,8 @@ fun serializeModuleIntoKlib(
) { ) {
val descriptorTable = DescriptorTable() 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 serializer = JsKlibMetadataSerializationUtil
val moduleDescription = val moduleDescription =
@@ -307,8 +308,8 @@ fun serializeModuleIntoKlib(
languageVersionSettings, languageVersionSettings,
metadataVersion metadataVersion
) { declarationDescriptor -> ) { declarationDescriptor ->
val index = descriptorTable.get(declarationDescriptor) val index = descriptorTable.get(declarationDescriptor) ?: error("No descriptor ID found for $declarationDescriptor")
index?.let { newJsDescriptorUniqId(it) } newJsDescriptorUniqId(index)
} }
val abiVersion = KotlinAbiVersion.CURRENT val abiVersion = KotlinAbiVersion.CURRENT
@@ -31,8 +31,6 @@ class JsKlibMetadataSerializerExtension(
} }
private fun uniqId(descriptor: DeclarationDescriptor): JsKlibMetadataProtoBuf.DescriptorUniqId? { private fun uniqId(descriptor: DeclarationDescriptor): JsKlibMetadataProtoBuf.DescriptorUniqId? {
// val index = declarationTable.descriptorTable.get(descriptor)
// return index?.let { newDescriptorUniqId(it) }
return declarationTableHandler(descriptor) return declarationTableHandler(descriptor)
} }
@@ -46,11 +44,6 @@ class JsKlibMetadataSerializerExtension(
super.serializeTypeAlias(typeAlias, proto) 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) { override fun serializeEnumEntry(descriptor: ClassDescriptor, proto: ProtoBuf.EnumEntry.Builder) {
uniqId(descriptor)?.let { proto.setExtension(JsKlibMetadataProtoBuf.enumEntryUniqId, it) } uniqId(descriptor)?.let { proto.setExtension(JsKlibMetadataProtoBuf.enumEntryUniqId, it) }
super.serializeEnumEntry(descriptor, proto) super.serializeEnumEntry(descriptor, proto)