diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/DeclarationTable.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/DeclarationTable.kt index 4c01b545658..7432ffc2b51 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/DeclarationTable.kt +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/DeclarationTable.kt @@ -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() 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 diff --git a/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/klib.kt b/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/klib.kt index ea1edecfd68..7fa61e48420 100644 --- a/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/klib.kt +++ b/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/klib.kt @@ -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 diff --git a/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/lower/serialization/metadata/JsKlibMetadataSerializerExtension.kt b/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/lower/serialization/metadata/JsKlibMetadataSerializerExtension.kt index 3888ba0abde..9bd1b5bd1a8 100644 --- a/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/lower/serialization/metadata/JsKlibMetadataSerializerExtension.kt +++ b/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/lower/serialization/metadata/JsKlibMetadataSerializerExtension.kt @@ -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)