[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 {
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))
@@ -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,
@@ -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))
@@ -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 <TBase, TSource : TBase, TParameter : TBase> 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<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
package second