diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/CopyUtils.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/CopyUtils.kt index 8db21a212db..b82bb2f4440 100644 --- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/CopyUtils.kt +++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/CopyUtils.kt @@ -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 - } -} diff --git a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/fir/ValueParameter.kt b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/fir/ValueParameter.kt index 33eeaf6b183..9a71eea0b4e 100644 --- a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/fir/ValueParameter.kt +++ b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/fir/ValueParameter.kt @@ -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 || diff --git a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt index e23e12ca5c2..6487a9e6b15 100644 --- a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt +++ b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt @@ -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( diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirTypeResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirTypeResolveTransformer.kt index 2706a2c59e9..ee96cb9a03a 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirTypeResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirTypeResolveTransformer.kt @@ -127,6 +127,7 @@ open class FirTypeResolveTransformer( .transformAnnotations(this, data) if (property.isFromVararg == true) { property.transformTypeToArrayType() + property.backingField?.transformTypeToArrayType() setAccessorTypesByPropertyType(property) } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/Utils.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/Utils.kt index a43e5d1d714..6bdb95696df 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/Utils.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/Utils.kt @@ -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 + } +}