[FIR] Don't miss annotations on properties from primary constructors

^KT-64609 Fixed
This commit is contained in:
Nikolay Lunyak
2024-01-03 14:45:48 +02:00
committed by Space Team
parent 1f46aed3e0
commit 9c0ac27307
6 changed files with 26 additions and 36 deletions
@@ -1446,9 +1446,9 @@ class LightTreeRawFirDeclarationBuilder(
) )
} }
} }
annotations += if (isLocal) propertyAnnotations else propertyAnnotations.filter { annotations += when {
it.useSiteTarget != FIELD && it.useSiteTarget != PROPERTY_DELEGATE_FIELD && it.useSiteTarget != PROPERTY_GETTER && isLocal -> propertyAnnotations
(!isVar || it.useSiteTarget != SETTER_PARAMETER && it.useSiteTarget != PROPERTY_SETTER) else -> propertyAnnotations.filterStandalonePropertyRelevantAnnotations(isVar)
} }
contextReceivers.addAll(convertContextReceivers(property)) contextReceivers.addAll(convertContextReceivers(property))
@@ -10,11 +10,7 @@ import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget.* import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget.*
import org.jetbrains.kotlin.fakeElement import org.jetbrains.kotlin.fakeElement
import org.jetbrains.kotlin.fir.FirModuleData import org.jetbrains.kotlin.fir.FirModuleData
import org.jetbrains.kotlin.fir.builder.Context import org.jetbrains.kotlin.fir.builder.*
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.copy import org.jetbrains.kotlin.fir.copy
import org.jetbrains.kotlin.fir.copyWithNewSourceKind import org.jetbrains.kotlin.fir.copyWithNewSourceKind
import org.jetbrains.kotlin.fir.correspondingProperty import org.jetbrains.kotlin.fir.correspondingProperty
@@ -166,9 +162,7 @@ class ValueParameter(
status = status.copy(isLateInit = false), status = status.copy(isLateInit = false),
) )
annotations += remappedAnnotations.filter { annotations += remappedAnnotations.filterConstructorPropertyRelevantAnnotations(this.isVar)
it.useSiteTarget == null || it.useSiteTarget == PROPERTY
}
getter = FirDefaultPropertyGetter( getter = FirDefaultPropertyGetter(
defaultAccessorSource, defaultAccessorSource,
@@ -782,9 +782,7 @@ open class PsiRawFirBuilder(
setter.initContainingClassAttr() setter.initContainingClassAttr()
setter.replaceAnnotations(parameterAnnotations.filterUseSiteTarget(PROPERTY_SETTER)) setter.replaceAnnotations(parameterAnnotations.filterUseSiteTarget(PROPERTY_SETTER))
} else null } else null
annotations += parameterAnnotations.filter { annotations += parameterAnnotations.filterConstructorPropertyRelevantAnnotations(isMutable)
it.useSiteTarget == null || it.useSiteTarget == PROPERTY
}
dispatchReceiverType = currentDispatchReceiverType() dispatchReceiverType = currentDispatchReceiverType()
}.apply { }.apply {
@@ -2197,9 +2195,9 @@ open class PsiRawFirBuilder(
} }
} }
} }
annotations += if (isLocal) propertyAnnotations else propertyAnnotations.filter { annotations += when {
it.useSiteTarget != FIELD && it.useSiteTarget != PROPERTY_DELEGATE_FIELD && it.useSiteTarget != PROPERTY_GETTER && isLocal -> propertyAnnotations
(!isVar || it.useSiteTarget != SETTER_PARAMETER && it.useSiteTarget != PROPERTY_SETTER) else -> propertyAnnotations.filterStandalonePropertyRelevantAnnotations(isVar)
} }
contextReceivers.addAll(convertContextReceivers(this@toFirProperty.contextReceivers)) contextReceivers.addAll(convertContextReceivers(this@toFirProperty.contextReceivers))
@@ -14,6 +14,7 @@ import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.EffectiveVisibility import org.jetbrains.kotlin.descriptors.EffectiveVisibility
import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.builder.* import org.jetbrains.kotlin.fir.declarations.builder.*
@@ -1203,3 +1204,18 @@ fun <TBase, TSource : TBase, TParameter : TBase> FirRegularClassBuilder.createDa
// Refer to FIR backend ClassMemberGenerator for body generation. // 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<FirAnnotationCall>.filterConstructorPropertyRelevantAnnotations(isVar: Boolean) = filter {
it.useSiteTarget == null || it.useSiteTarget == AnnotationUseSiteTarget.PROPERTY
|| !isVar && (it.useSiteTarget == AnnotationUseSiteTarget.SETTER_PARAMETER || it.useSiteTarget == AnnotationUseSiteTarget.PROPERTY_SETTER)
}
fun List<FirAnnotationCall>.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)
}
@@ -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
<!INAPPLICABLE_TARGET_PROPERTY_IMMUTABLE!>@set:Anno<!>
<!INAPPLICABLE_TARGET_PROPERTY_IMMUTABLE!>@setparam:Anno<!>
val memberVariableWithAnnotations: Long = 0L
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// ISSUE: KT-64609 // ISSUE: KT-64609
package second package second