diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt index f53f4845816..a2b5387b98f 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt @@ -868,9 +868,15 @@ class Fir2IrDeclarationStorage( symbol = FirPropertySymbol(field.symbol.callableId) isLocal = false status = field.status + }.apply { + isStubPropertyForPureField = true } } + private object IsStubPropertyForPureFieldKey : FirDeclarationDataKey() + + private var FirProperty.isStubPropertyForPureField: Boolean? by FirDeclarationDataRegistry.data(IsStubPropertyForPureFieldKey) + fun createIrProperty( property: FirProperty, irParent: IrDeclarationParent?, @@ -1467,17 +1473,30 @@ class Fir2IrDeclarationStorage( ): IrProperty { val symbol = Fir2IrPropertySymbol(signature) val firPropertySymbol = fir.symbol + + fun create(startOffset: Int, endOffset: Int): Fir2IrLazyProperty { + val isFakeOverride = + fir.isSubstitutionOrIntersectionOverride && + firPropertySymbol.dispatchReceiverClassLookupTagOrNull() != + firPropertySymbol.originalForSubstitutionOverride?.dispatchReceiverClassLookupTagOrNull() + return Fir2IrLazyProperty( + components, startOffset, endOffset, declarationOrigin, + fir, (lazyParent as? Fir2IrLazyClass)?.fir, symbol, isFakeOverride + ).apply { + this.parent = lazyParent + } + } + val irProperty = fir.convertWithOffsets { startOffset, endOffset -> - symbolTable.declareProperty(signature, { symbol }) { - val isFakeOverride = - fir.isSubstitutionOrIntersectionOverride && - firPropertySymbol.dispatchReceiverClassLookupTagOrNull() != - firPropertySymbol.originalForSubstitutionOverride?.dispatchReceiverClassLookupTagOrNull() - Fir2IrLazyProperty( - components, startOffset, endOffset, declarationOrigin, - fir, (lazyParent as? Fir2IrLazyClass)?.fir, symbol, isFakeOverride - ).apply { - this.parent = lazyParent + if (fir.isStubPropertyForPureField == true) { + // Very special case when two similar properties can exist so conflicts in SymbolTable are possible. + // See javaCloseFieldAndKotlinProperty.kt in BB tests + symbolTable.declarePropertyWithSignature(signature, symbol) + create(startOffset, endOffset) + symbol.owner + } else { + symbolTable.declareProperty(signature, { symbol }) { + create(startOffset, endOffset) } } }