[FIR] Fix missing initialization of backingField for properties from primary constructor

This commit is contained in:
Dmitriy Novozhilov
2022-08-25 14:15:36 +03:00
committed by teamcity
parent 194741b96b
commit e1fd184d14
5 changed files with 76 additions and 51 deletions
@@ -67,54 +67,3 @@ fun FirTypeRef.errorTypeFromPrototype(
this.diagnostic = diagnostic
}
}
fun FirDeclarationStatus.copy(
visibility: Visibility? = this.visibility,
modality: Modality? = this.modality,
isExpect: Boolean = this.isExpect,
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 {
val newVisibility = visibility ?: this.visibility
val newModality = modality ?: this.modality
val newStatus = if (this is FirResolvedDeclarationStatus) {
FirResolvedDeclarationStatusImpl(newVisibility, newModality!!, effectiveVisibility)
} else {
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
}
}
@@ -17,6 +17,7 @@ import org.jetbrains.kotlin.fir.declarations.FirProperty
import org.jetbrains.kotlin.fir.declarations.FirValueParameter
import org.jetbrains.kotlin.fir.declarations.builder.buildProperty
import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyBackingField
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyGetter
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertySetter
import org.jetbrains.kotlin.fir.declarations.utils.fromPrimaryConstructor
@@ -83,6 +84,14 @@ class ValueParameter(
isConst = modifiers.hasConst()
isLateInit = false
}
backingField = FirDefaultPropertyBackingField(
moduleData = moduleData,
annotations = mutableListOf(),
returnTypeRef = returnTypeRef.copyWithNewSourceKind(KtFakeSourceElementKind.DefaultAccessor),
isVar = isVar,
propertySymbol = symbol,
status = status.copy(),
)
annotations += modifiers.annotations.filter {
it.useSiteTarget == null || it.useSiteTarget == AnnotationUseSiteTarget.PROPERTY ||
it.useSiteTarget == AnnotationUseSiteTarget.FIELD ||
@@ -601,6 +601,15 @@ open class RawFirBuilder(
isVar = isMutable
symbol = FirPropertySymbol(callableIdForName(propertyName))
isLocal = false
backingField = FirDefaultPropertyBackingField(
moduleData = baseModuleData,
annotations = mutableListOf(),
returnTypeRef = returnTypeRef.copyWithNewSourceKind(KtFakeSourceElementKind.DefaultAccessor),
isVar = isVar,
propertySymbol = symbol,
status = status.copy(),
)
this.status = status
val defaultAccessorSource = propertySource.fakeElement(KtFakeSourceElementKind.DefaultAccessor)
getter = FirDefaultPropertyGetter(
@@ -127,6 +127,7 @@ open class FirTypeResolveTransformer(
.transformAnnotations(this, data)
if (property.isFromVararg == true) {
property.transformTypeToArrayType()
property.backingField?.transformTypeToArrayType()
setAccessorTypesByPropertyType(property)
}
@@ -9,9 +9,15 @@ import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.KtFakeSourceElementKind
import org.jetbrains.kotlin.KtPsiSourceElement
import org.jetbrains.kotlin.KtRealPsiSourceElement
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.fakeElement
import org.jetbrains.kotlin.fir.declarations.FirContextReceiver
import org.jetbrains.kotlin.fir.declarations.FirDeclarationStatus
import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.declarations.FirResolvedDeclarationStatus
import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl
import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedDeclarationStatusImpl
import org.jetbrains.kotlin.fir.expressions.FirBlock
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.references.FirReference
@@ -85,3 +91,54 @@ fun FirElement.renderWithType(): String =
fun FirElement.render(): String =
FirRenderer().renderElementAsString(this)
fun FirDeclarationStatus.copy(
visibility: Visibility? = this.visibility,
modality: Modality? = this.modality,
isExpect: Boolean = this.isExpect,
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 {
val newVisibility = visibility ?: this.visibility
val newModality = modality ?: this.modality
val newStatus = if (this is FirResolvedDeclarationStatus) {
FirResolvedDeclarationStatusImpl(newVisibility, newModality!!, effectiveVisibility)
} else {
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
}
}