[IR SERIALIZATION] Do not track non-metadata descriptors in descriptor table
This commit is contained in:
+36
-2
@@ -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
|
||||||
|
|||||||
-7
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user