[FIR] Implement proper copy utility for FirDeclarationStatus
This commit is contained in:
committed by
teamcity
parent
c7e3da8709
commit
399aaeca9d
+1
-1
@@ -52,7 +52,7 @@ class JavaAnnotationSyntheticPropertiesScope(
|
||||
name,
|
||||
isVar = false,
|
||||
it,
|
||||
function.status.copy(newModality = Modality.FINAL),
|
||||
function.status.copy(modality = Modality.FINAL),
|
||||
function.resolvePhase,
|
||||
accessor
|
||||
)
|
||||
|
||||
+1
-1
@@ -82,7 +82,7 @@ class JavaClassUseSiteMemberScope(
|
||||
delegateGetter = getterSymbol.fir
|
||||
delegateSetter = setterSymbol?.fir
|
||||
status = getterSymbol.fir.status.copy(
|
||||
newModality = if (takeModalityFromGetter) {
|
||||
modality = if (takeModalityFromGetter) {
|
||||
delegateGetter.modality ?: property.modality
|
||||
} else {
|
||||
chooseModalityForAccessor(property, delegateGetter)
|
||||
|
||||
@@ -9,9 +9,11 @@ import org.jetbrains.kotlin.descriptors.EffectiveVisibility
|
||||
import org.jetbrains.kotlin.descriptors.Modality
|
||||
import org.jetbrains.kotlin.descriptors.Visibility
|
||||
import org.jetbrains.kotlin.fir.declarations.FirDeclarationStatus
|
||||
import org.jetbrains.kotlin.fir.declarations.FirResolvedDeclarationStatus
|
||||
import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.buildTypeParameter
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedDeclarationStatusImpl
|
||||
import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic
|
||||
import org.jetbrains.kotlin.fir.expressions.*
|
||||
import org.jetbrains.kotlin.fir.expressions.builder.*
|
||||
@@ -67,23 +69,52 @@ fun FirTypeRef.errorTypeFromPrototype(
|
||||
}
|
||||
|
||||
fun FirDeclarationStatus.copy(
|
||||
visibility: Visibility? = this.visibility,
|
||||
modality: Modality? = this.modality,
|
||||
isExpect: Boolean = this.isExpect,
|
||||
newModality: Modality? = null,
|
||||
newVisibility: Visibility? = null,
|
||||
newEffectiveVisibility: EffectiveVisibility? = null,
|
||||
isOperator: Boolean = this.isOperator
|
||||
isActual: Boolean = this.isActual,
|
||||
isOverride: Boolean = this.isOverride,
|
||||
isOperator: Boolean = this.isOperator,
|
||||
isInfix: Boolean = this.isInfix,
|
||||
isInline: Boolean = this.isInline,
|
||||
isTailRec: Boolean = this.isTailRec,
|
||||
isExternal: Boolean = this.isExternal,
|
||||
isConst: Boolean = this.isConst,
|
||||
isLateInit: Boolean = this.isLateInit,
|
||||
isInner: Boolean = this.isInner,
|
||||
isCompanion: Boolean = this.isCompanion,
|
||||
isData: Boolean = this.isData,
|
||||
isSuspend: Boolean = this.isSuspend,
|
||||
isStatic: Boolean = this.isStatic,
|
||||
isFromSealedClass: Boolean = this.isFromSealedClass,
|
||||
isFromEnumClass: Boolean = this.isFromEnumClass,
|
||||
isFun: Boolean = this.isFun,
|
||||
): FirDeclarationStatus {
|
||||
return if (this.isExpect == isExpect && newModality == null && newVisibility == null && this.isOperator == isOperator) {
|
||||
this
|
||||
val newVisibility = visibility ?: this.visibility
|
||||
val newModality = modality ?: this.modality
|
||||
val newStatus = if (this is FirResolvedDeclarationStatus) {
|
||||
FirResolvedDeclarationStatusImpl(newVisibility, newModality!!, effectiveVisibility)
|
||||
} else {
|
||||
require(this is FirDeclarationStatusImpl) { "Unexpected class ${this::class}" }
|
||||
this.resolved(
|
||||
newVisibility ?: visibility,
|
||||
newModality ?: modality!!,
|
||||
newEffectiveVisibility ?: EffectiveVisibility.Public
|
||||
).apply {
|
||||
this.isExpect = isExpect
|
||||
this.isOperator = isOperator
|
||||
}
|
||||
FirDeclarationStatusImpl(newVisibility, newModality)
|
||||
}
|
||||
return newStatus.apply {
|
||||
this.isExpect = isExpect
|
||||
this.isActual = isActual
|
||||
this.isOverride = isOverride
|
||||
this.isOperator = isOperator
|
||||
this.isInfix = isInfix
|
||||
this.isInline = isInline
|
||||
this.isTailRec = isTailRec
|
||||
this.isExternal = isExternal
|
||||
this.isConst = isConst
|
||||
this.isLateInit = isLateInit
|
||||
this.isInner = isInner
|
||||
this.isCompanion = isCompanion
|
||||
this.isData = isData
|
||||
this.isSuspend = isSuspend
|
||||
this.isStatic = isStatic
|
||||
this.isFromSealedClass = isFromSealedClass
|
||||
this.isFromEnumClass = isFromEnumClass
|
||||
this.isFun = isFun
|
||||
}
|
||||
}
|
||||
|
||||
+3
-3
@@ -112,7 +112,7 @@ object FirFakeOverrideGenerator {
|
||||
moduleData = session.nullableModuleData ?: baseFunction.moduleData
|
||||
this.origin = origin
|
||||
name = baseFunction.name
|
||||
status = baseFunction.status.copy(isExpect, newModality, newVisibility)
|
||||
status = baseFunction.status.copy(newVisibility, newModality, isExpect = isExpect)
|
||||
symbol = newSymbol
|
||||
resolvePhase = baseFunction.resolvePhase
|
||||
|
||||
@@ -145,7 +145,7 @@ object FirFakeOverrideGenerator {
|
||||
moduleData = session.moduleData
|
||||
this.origin = origin
|
||||
receiverTypeRef = baseConstructor.receiverTypeRef?.withReplacedConeType(null)
|
||||
status = baseConstructor.status.copy(isExpect)
|
||||
status = baseConstructor.status.copy(isExpect = isExpect)
|
||||
symbol = fakeOverrideSymbol
|
||||
|
||||
typeParameters += configureAnnotationsTypeParametersAndSignature(
|
||||
@@ -330,7 +330,7 @@ object FirFakeOverrideGenerator {
|
||||
isVar = baseProperty.isVar
|
||||
this.symbol = newSymbol
|
||||
isLocal = false
|
||||
status = baseProperty.status.copy(isExpect, newModality, newVisibility)
|
||||
status = baseProperty.status.copy(newVisibility, newModality, isExpect = isExpect)
|
||||
|
||||
resolvePhase = baseProperty.resolvePhase
|
||||
dispatchReceiverType = newDispatchReceiverType
|
||||
|
||||
Reference in New Issue
Block a user