From 49e786f088d209fdcada052e4ab2aba1fd0ebeba Mon Sep 17 00:00:00 2001 From: Kirill Rakhman Date: Wed, 15 Nov 2023 17:20:23 +0100 Subject: [PATCH] [FIR] Copy java enum entry during enhancement instead of mutating it #KT-57949 Fixed --- .../java/enhancement/SignatureEnhancement.kt | 12 ++++++--- .../builder/FirEnumEntryBuilder.kt | 26 +++++++++++++++++++ .../fir/tree/generator/BuilderConfigurator.kt | 4 +++ 3 files changed, 38 insertions(+), 4 deletions(-) diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/SignatureEnhancement.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/SignatureEnhancement.kt index b4602a4f104..488407fd8e8 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/SignatureEnhancement.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/SignatureEnhancement.kt @@ -109,10 +109,14 @@ class FirSignatureEnhancement( ) val newReturnTypeRef = enhanceReturnType(firElement, emptyList(), firElement.computeDefaultQualifiers(), predefinedInfo) - return firElement.symbol.apply { - this.fir.replaceReturnTypeRef(newReturnTypeRef) - session.lookupTracker?.recordTypeResolveAsLookup(newReturnTypeRef, this.fir.source, null) - } + + return buildEnumEntryCopy(firElement) { + symbol = FirEnumEntrySymbol(firElement.symbol.callableId) + returnTypeRef = newReturnTypeRef + origin = FirDeclarationOrigin.Enhancement + }.apply { + session.lookupTracker?.recordTypeResolveAsLookup(newReturnTypeRef, this.source, null) + }.symbol } is FirField -> { if (firElement.returnTypeRef !is FirJavaTypeRef) return original diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/builder/FirEnumEntryBuilder.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/builder/FirEnumEntryBuilder.kt index 752db349d0a..499897a2a62 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/builder/FirEnumEntryBuilder.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/builder/FirEnumEntryBuilder.kt @@ -77,3 +77,29 @@ inline fun buildEnumEntry(init: FirEnumEntryBuilder.() -> Unit): FirEnumEntry { } return FirEnumEntryBuilder().apply(init).build() } + +@OptIn(ExperimentalContracts::class) +inline fun buildEnumEntryCopy(original: FirEnumEntry, init: FirEnumEntryBuilder.() -> Unit): FirEnumEntry { + contract { + callsInPlace(init, kotlin.contracts.InvocationKind.EXACTLY_ONCE) + } + val copyBuilder = FirEnumEntryBuilder() + copyBuilder.source = original.source + copyBuilder.resolvePhase = original.resolvePhase + copyBuilder.moduleData = original.moduleData + copyBuilder.origin = original.origin + copyBuilder.attributes = original.attributes.copy() + copyBuilder.typeParameters.addAll(original.typeParameters) + copyBuilder.status = original.status + copyBuilder.returnTypeRef = original.returnTypeRef + copyBuilder.deprecationsProvider = original.deprecationsProvider + copyBuilder.containerSource = original.containerSource + copyBuilder.dispatchReceiverType = original.dispatchReceiverType + copyBuilder.contextReceivers.addAll(original.contextReceivers) + copyBuilder.name = original.name + copyBuilder.initializer = original.initializer + copyBuilder.backingField = original.backingField + copyBuilder.annotations.addAll(original.annotations) + copyBuilder.symbol = original.symbol + return copyBuilder.apply(init).build() +} diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/BuilderConfigurator.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/BuilderConfigurator.kt index 6c2de9fadd7..08afe0b5e3a 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/BuilderConfigurator.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/BuilderConfigurator.kt @@ -260,6 +260,10 @@ object BuilderConfigurator : AbstractBuilderConfigurator(FirTree withCopy() } + builder(enumEntry) { + withCopy() + } + builder(typeOperatorCall) { parents += callBuilder default("argumentList") {