From 9c0ac27307185201749e30453cd3c9b7c522293c Mon Sep 17 00:00:00 2001 From: Nikolay Lunyak Date: Wed, 3 Jan 2024 14:45:48 +0200 Subject: [PATCH] [FIR] Don't miss annotations on properties from primary constructors ^KT-64609 Fixed --- .../LightTreeRawFirDeclarationBuilder.kt | 6 +++--- .../fir/lightTree/fir/ValueParameter.kt | 10 ++-------- .../kotlin/fir/builder/PsiRawFirBuilder.kt | 10 ++++------ .../fir/builder/AbstractRawFirBuilder.kt | 16 ++++++++++++++++ ...opertyImmutableInPrimaryConstructor.fir.kt | 19 ------------------- ...etPropertyImmutableInPrimaryConstructor.kt | 1 + 6 files changed, 26 insertions(+), 36 deletions(-) delete mode 100644 compiler/testData/diagnostics/tests/inapplicableTargetPropertyImmutableInPrimaryConstructor.fir.kt diff --git a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/LightTreeRawFirDeclarationBuilder.kt b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/LightTreeRawFirDeclarationBuilder.kt index e41aeb3481b..bdab68d74a5 100644 --- a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/LightTreeRawFirDeclarationBuilder.kt +++ b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/LightTreeRawFirDeclarationBuilder.kt @@ -1446,9 +1446,9 @@ class LightTreeRawFirDeclarationBuilder( ) } } - annotations += if (isLocal) propertyAnnotations else propertyAnnotations.filter { - it.useSiteTarget != FIELD && it.useSiteTarget != PROPERTY_DELEGATE_FIELD && it.useSiteTarget != PROPERTY_GETTER && - (!isVar || it.useSiteTarget != SETTER_PARAMETER && it.useSiteTarget != PROPERTY_SETTER) + annotations += when { + isLocal -> propertyAnnotations + else -> propertyAnnotations.filterStandalonePropertyRelevantAnnotations(isVar) } contextReceivers.addAll(convertContextReceivers(property)) 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 613d0fcb80a..c5dbf68cdd0 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 @@ -10,11 +10,7 @@ import org.jetbrains.kotlin.KtSourceElement import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget.* import org.jetbrains.kotlin.fakeElement import org.jetbrains.kotlin.fir.FirModuleData -import org.jetbrains.kotlin.fir.builder.Context -import org.jetbrains.kotlin.fir.builder.appliesToPrimaryConstructorParameter -import org.jetbrains.kotlin.fir.builder.filterUseSiteTarget -import org.jetbrains.kotlin.fir.builder.initContainingClassAttr -import org.jetbrains.kotlin.fir.builder.wrapIntoArray +import org.jetbrains.kotlin.fir.builder.* import org.jetbrains.kotlin.fir.copy import org.jetbrains.kotlin.fir.copyWithNewSourceKind import org.jetbrains.kotlin.fir.correspondingProperty @@ -166,9 +162,7 @@ class ValueParameter( status = status.copy(isLateInit = false), ) - annotations += remappedAnnotations.filter { - it.useSiteTarget == null || it.useSiteTarget == PROPERTY - } + annotations += remappedAnnotations.filterConstructorPropertyRelevantAnnotations(this.isVar) getter = FirDefaultPropertyGetter( defaultAccessorSource, diff --git a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/PsiRawFirBuilder.kt b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/PsiRawFirBuilder.kt index dcbe12f5e60..72d8ad2c05d 100644 --- a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/PsiRawFirBuilder.kt +++ b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/PsiRawFirBuilder.kt @@ -782,9 +782,7 @@ open class PsiRawFirBuilder( setter.initContainingClassAttr() setter.replaceAnnotations(parameterAnnotations.filterUseSiteTarget(PROPERTY_SETTER)) } else null - annotations += parameterAnnotations.filter { - it.useSiteTarget == null || it.useSiteTarget == PROPERTY - } + annotations += parameterAnnotations.filterConstructorPropertyRelevantAnnotations(isMutable) dispatchReceiverType = currentDispatchReceiverType() }.apply { @@ -2197,9 +2195,9 @@ open class PsiRawFirBuilder( } } } - annotations += if (isLocal) propertyAnnotations else propertyAnnotations.filter { - it.useSiteTarget != FIELD && it.useSiteTarget != PROPERTY_DELEGATE_FIELD && it.useSiteTarget != PROPERTY_GETTER && - (!isVar || it.useSiteTarget != SETTER_PARAMETER && it.useSiteTarget != PROPERTY_SETTER) + annotations += when { + isLocal -> propertyAnnotations + else -> propertyAnnotations.filterStandalonePropertyRelevantAnnotations(isVar) } contextReceivers.addAll(convertContextReceivers(this@toFirProperty.contextReceivers)) diff --git a/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/AbstractRawFirBuilder.kt b/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/AbstractRawFirBuilder.kt index b0aeb8b7d4d..928b2c2d05b 100644 --- a/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/AbstractRawFirBuilder.kt +++ b/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/AbstractRawFirBuilder.kt @@ -14,6 +14,7 @@ import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.EffectiveVisibility import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Visibilities +import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.builder.* @@ -1203,3 +1204,18 @@ fun FirRegularClassBuilder.createDa // Refer to FIR backend ClassMemberGenerator for body generation. } } + +/** + * Not the same as [filterStandalonePropertyRelevantAnnotations], because on + * primary constructor value parameters annotations should go to the + * [FirValueParameter] first. + */ +fun List.filterConstructorPropertyRelevantAnnotations(isVar: Boolean) = filter { + it.useSiteTarget == null || it.useSiteTarget == AnnotationUseSiteTarget.PROPERTY + || !isVar && (it.useSiteTarget == AnnotationUseSiteTarget.SETTER_PARAMETER || it.useSiteTarget == AnnotationUseSiteTarget.PROPERTY_SETTER) +} + +fun List.filterStandalonePropertyRelevantAnnotations(isVar: Boolean) = filter { + it.useSiteTarget != AnnotationUseSiteTarget.FIELD && it.useSiteTarget != AnnotationUseSiteTarget.PROPERTY_DELEGATE_FIELD && it.useSiteTarget != AnnotationUseSiteTarget.PROPERTY_GETTER && + (!isVar || it.useSiteTarget != AnnotationUseSiteTarget.SETTER_PARAMETER && it.useSiteTarget != AnnotationUseSiteTarget.PROPERTY_SETTER) +} diff --git a/compiler/testData/diagnostics/tests/inapplicableTargetPropertyImmutableInPrimaryConstructor.fir.kt b/compiler/testData/diagnostics/tests/inapplicableTargetPropertyImmutableInPrimaryConstructor.fir.kt deleted file mode 100644 index b0f224e1142..00000000000 --- a/compiler/testData/diagnostics/tests/inapplicableTargetPropertyImmutableInPrimaryConstructor.fir.kt +++ /dev/null @@ -1,19 +0,0 @@ -// ISSUE: KT-64609 - -package second - -annotation class Anno - -class SimpleVarClass( - @Anno - @get:Anno - @set:Anno - @setparam:Anno - val constructorVariableWithAnnotations: Long, -) { - @Anno - @get:Anno - @set:Anno - @setparam:Anno - val memberVariableWithAnnotations: Long = 0L -} diff --git a/compiler/testData/diagnostics/tests/inapplicableTargetPropertyImmutableInPrimaryConstructor.kt b/compiler/testData/diagnostics/tests/inapplicableTargetPropertyImmutableInPrimaryConstructor.kt index a158262a965..2b406e6ba5c 100644 --- a/compiler/testData/diagnostics/tests/inapplicableTargetPropertyImmutableInPrimaryConstructor.kt +++ b/compiler/testData/diagnostics/tests/inapplicableTargetPropertyImmutableInPrimaryConstructor.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // ISSUE: KT-64609 package second