[FIR] Copy java enum entry during enhancement instead of mutating it
#KT-57949 Fixed
This commit is contained in:
committed by
Space Team
parent
f5168527ae
commit
49e786f088
+8
-4
@@ -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
|
||||||
|
|||||||
+26
@@ -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()
|
||||||
|
}
|
||||||
|
|||||||
+4
@@ -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") {
|
||||||
|
|||||||
Reference in New Issue
Block a user