[FIR] Copy java enum entry during enhancement instead of mutating it

#KT-57949 Fixed
This commit is contained in:
Kirill Rakhman
2023-11-15 17:20:23 +01:00
committed by Space Team
parent f5168527ae
commit 49e786f088
3 changed files with 38 additions and 4 deletions
@@ -109,10 +109,14 @@ class FirSignatureEnhancement(
) )
val newReturnTypeRef = enhanceReturnType(firElement, emptyList(), firElement.computeDefaultQualifiers(), predefinedInfo) val newReturnTypeRef = enhanceReturnType(firElement, emptyList(), firElement.computeDefaultQualifiers(), predefinedInfo)
return firElement.symbol.apply {
this.fir.replaceReturnTypeRef(newReturnTypeRef) return buildEnumEntryCopy(firElement) {
session.lookupTracker?.recordTypeResolveAsLookup(newReturnTypeRef, this.fir.source, null) symbol = FirEnumEntrySymbol(firElement.symbol.callableId)
} returnTypeRef = newReturnTypeRef
origin = FirDeclarationOrigin.Enhancement
}.apply {
session.lookupTracker?.recordTypeResolveAsLookup(newReturnTypeRef, this.source, null)
}.symbol
} }
is FirField -> { is FirField -> {
if (firElement.returnTypeRef !is FirJavaTypeRef) return original if (firElement.returnTypeRef !is FirJavaTypeRef) return original
@@ -77,3 +77,29 @@ inline fun buildEnumEntry(init: FirEnumEntryBuilder.() -> Unit): FirEnumEntry {
} }
return FirEnumEntryBuilder().apply(init).build() 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()
}
@@ -260,6 +260,10 @@ object BuilderConfigurator : AbstractBuilderConfigurator<FirTreeBuilder>(FirTree
withCopy() withCopy()
} }
builder(enumEntry) {
withCopy()
}
builder(typeOperatorCall) { builder(typeOperatorCall) {
parents += callBuilder parents += callBuilder
default("argumentList") { default("argumentList") {