[FIR] Implement proper copy utility for FirDeclarationStatus

This commit is contained in:
Dmitriy Novozhilov
2022-05-13 16:21:13 +03:00
committed by teamcity
parent c7e3da8709
commit 399aaeca9d
4 changed files with 51 additions and 20 deletions
@@ -52,7 +52,7 @@ class JavaAnnotationSyntheticPropertiesScope(
name, name,
isVar = false, isVar = false,
it, it,
function.status.copy(newModality = Modality.FINAL), function.status.copy(modality = Modality.FINAL),
function.resolvePhase, function.resolvePhase,
accessor accessor
) )
@@ -82,7 +82,7 @@ class JavaClassUseSiteMemberScope(
delegateGetter = getterSymbol.fir delegateGetter = getterSymbol.fir
delegateSetter = setterSymbol?.fir delegateSetter = setterSymbol?.fir
status = getterSymbol.fir.status.copy( status = getterSymbol.fir.status.copy(
newModality = if (takeModalityFromGetter) { modality = if (takeModalityFromGetter) {
delegateGetter.modality ?: property.modality delegateGetter.modality ?: property.modality
} else { } else {
chooseModalityForAccessor(property, delegateGetter) chooseModalityForAccessor(property, delegateGetter)
@@ -9,9 +9,11 @@ import org.jetbrains.kotlin.descriptors.EffectiveVisibility
import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.fir.declarations.FirDeclarationStatus 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.FirTypeParameter
import org.jetbrains.kotlin.fir.declarations.builder.buildTypeParameter import org.jetbrains.kotlin.fir.declarations.builder.buildTypeParameter
import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl 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.diagnostics.ConeDiagnostic
import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.expressions.builder.* import org.jetbrains.kotlin.fir.expressions.builder.*
@@ -67,23 +69,52 @@ fun FirTypeRef.errorTypeFromPrototype(
} }
fun FirDeclarationStatus.copy( fun FirDeclarationStatus.copy(
visibility: Visibility? = this.visibility,
modality: Modality? = this.modality,
isExpect: Boolean = this.isExpect, isExpect: Boolean = this.isExpect,
newModality: Modality? = null, isActual: Boolean = this.isActual,
newVisibility: Visibility? = null, isOverride: Boolean = this.isOverride,
newEffectiveVisibility: EffectiveVisibility? = null, isOperator: Boolean = this.isOperator,
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 { ): FirDeclarationStatus {
return if (this.isExpect == isExpect && newModality == null && newVisibility == null && this.isOperator == isOperator) { val newVisibility = visibility ?: this.visibility
this val newModality = modality ?: this.modality
val newStatus = if (this is FirResolvedDeclarationStatus) {
FirResolvedDeclarationStatusImpl(newVisibility, newModality!!, effectiveVisibility)
} else { } else {
require(this is FirDeclarationStatusImpl) { "Unexpected class ${this::class}" } FirDeclarationStatusImpl(newVisibility, newModality)
this.resolved( }
newVisibility ?: visibility, return newStatus.apply {
newModality ?: modality!!, this.isExpect = isExpect
newEffectiveVisibility ?: EffectiveVisibility.Public this.isActual = isActual
).apply { this.isOverride = isOverride
this.isExpect = isExpect this.isOperator = isOperator
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
} }
} }
@@ -112,7 +112,7 @@ object FirFakeOverrideGenerator {
moduleData = session.nullableModuleData ?: baseFunction.moduleData moduleData = session.nullableModuleData ?: baseFunction.moduleData
this.origin = origin this.origin = origin
name = baseFunction.name name = baseFunction.name
status = baseFunction.status.copy(isExpect, newModality, newVisibility) status = baseFunction.status.copy(newVisibility, newModality, isExpect = isExpect)
symbol = newSymbol symbol = newSymbol
resolvePhase = baseFunction.resolvePhase resolvePhase = baseFunction.resolvePhase
@@ -145,7 +145,7 @@ object FirFakeOverrideGenerator {
moduleData = session.moduleData moduleData = session.moduleData
this.origin = origin this.origin = origin
receiverTypeRef = baseConstructor.receiverTypeRef?.withReplacedConeType(null) receiverTypeRef = baseConstructor.receiverTypeRef?.withReplacedConeType(null)
status = baseConstructor.status.copy(isExpect) status = baseConstructor.status.copy(isExpect = isExpect)
symbol = fakeOverrideSymbol symbol = fakeOverrideSymbol
typeParameters += configureAnnotationsTypeParametersAndSignature( typeParameters += configureAnnotationsTypeParametersAndSignature(
@@ -330,7 +330,7 @@ object FirFakeOverrideGenerator {
isVar = baseProperty.isVar isVar = baseProperty.isVar
this.symbol = newSymbol this.symbol = newSymbol
isLocal = false isLocal = false
status = baseProperty.status.copy(isExpect, newModality, newVisibility) status = baseProperty.status.copy(newVisibility, newModality, isExpect = isExpect)
resolvePhase = baseProperty.resolvePhase resolvePhase = baseProperty.resolvePhase
dispatchReceiverType = newDispatchReceiverType dispatchReceiverType = newDispatchReceiverType