From c9a8f433fb112a0dd96841aa590dc360c4748ef6 Mon Sep 17 00:00:00 2001 From: Ivan Kochurkin Date: Thu, 12 Jan 2023 16:48:05 +0100 Subject: [PATCH] [FIR2IR] Temporary fix of createIrEnumEntry Check if a bound entry with the same signature is already exist --- .../jetbrains/kotlin/fir/backend/Fir2IrClassifierStorage.kt | 5 +++++ .../ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt | 4 ++++ 2 files changed, 9 insertions(+) diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrClassifierStorage.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrClassifierStorage.kt index 592ce93ff97..e3d3821dca7 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrClassifierStorage.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrClassifierStorage.kt @@ -535,6 +535,11 @@ class Fir2IrClassifierStorage( ): IrEnumEntry { return enumEntry.convertWithOffsets { startOffset, endOffset -> val signature = signatureComposer.composeSignature(enumEntry, forceTopLevelPrivate = forceTopLevelPrivate) + if (signature != null) { + // Compilation of kotlinx-serialization-protobuf fails with "already bound" exception if this check is removed + // TODO: get rid of this check + symbolTable.referenceEnumEntryIfAny(signature)?.let { if (it.isBound) return@convertWithOffsets it.owner } + } val result = declareIrEnumEntry(signature) { symbol -> val origin = enumEntry.computeIrOrigin(predefinedOrigin) irFactory.createEnumEntry( diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt index 3d41b2b844b..5d0f66e01ef 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt @@ -664,6 +664,10 @@ open class SymbolTable( else IrEnumEntrySymbolImpl() } + fun referenceEnumEntryIfAny(sig: IdSignature): IrEnumEntrySymbol? { + return enumEntrySymbolTable.get(sig) + } + val unboundEnumEntries: Set get() = enumEntrySymbolTable.unboundSymbols private fun createFieldSymbol(descriptor: PropertyDescriptor, signature: IdSignature?): IrFieldSymbol =