diff --git a/compiler/fir/fir-serialization/src/org/jetbrains/kotlin/fir/serialization/FirElementSerializer.kt b/compiler/fir/fir-serialization/src/org/jetbrains/kotlin/fir/serialization/FirElementSerializer.kt index 010aed0fe88..5ca68eaa6c9 100644 --- a/compiler/fir/fir-serialization/src/org/jetbrains/kotlin/fir/serialization/FirElementSerializer.kt +++ b/compiler/fir/fir-serialization/src/org/jetbrains/kotlin/fir/serialization/FirElementSerializer.kt @@ -10,6 +10,7 @@ import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.descriptors.Visibility +import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget import org.jetbrains.kotlin.fir.FirAnnotationContainer import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.* @@ -196,6 +197,12 @@ class FirElementSerializer private constructor( return builder } + private fun FirPropertyAccessor.nonSourceAnnotations(session: FirSession, property: FirProperty): List = + (this as FirAnnotationContainer).nonSourceAnnotations(session) + property.nonSourceAnnotations(session).filter { + it.useSiteTarget == AnnotationUseSiteTarget.PROPERTY_GETTER && isGetter || + it.useSiteTarget == AnnotationUseSiteTarget.PROPERTY_SETTER && isSetter + } + fun propertyProto(property: FirProperty): ProtoBuf.Property.Builder? { if (!extension.shouldSerializeProperty(property)) return null @@ -235,7 +242,7 @@ class FirElementSerializer private constructor( } if (setter !is FirDefaultPropertyAccessor || - setter.nonSourceAnnotations(session).isNotEmpty() || + setter.nonSourceAnnotations(session, property).isNotEmpty() || setter.visibility != property.visibility ) { val setterLocal = local.createChildSerializer(setter) @@ -713,10 +720,12 @@ class FirElementSerializer private constructor( private fun getAccessorFlags(accessor: FirPropertyAccessor, property: FirProperty): Int { // [FirDefaultPropertyAccessor]---a property accessor without body---can still hold other information, such as annotations, // user-contributed visibility, and modifiers, such as `external` or `inline`. - val nonSourceAnnotations = accessor.nonSourceAnnotations(session) + val nonSourceAnnotations = accessor.nonSourceAnnotations(session, property) val isDefault = accessor is FirDefaultPropertyAccessor && - nonSourceAnnotations.isEmpty() && accessor.visibility == property.visibility && - !accessor.isExternal && !accessor.isInline + nonSourceAnnotations.isEmpty() && + accessor.visibility == property.visibility && + !accessor.isExternal && + !accessor.isInline return Flags.getAccessorFlags( nonSourceAnnotations.isNotEmpty(), ProtoEnumFlags.visibility(normalizeVisibility(accessor)), diff --git a/compiler/testData/codegen/box/annotations/annotationsOnLateinitAccessors.kt b/compiler/testData/codegen/box/annotations/annotationsOnLateinitAccessors.kt index b47fc4ff259..638d0480c76 100644 --- a/compiler/testData/codegen/box/annotations/annotationsOnLateinitAccessors.kt +++ b/compiler/testData/codegen/box/annotations/annotationsOnLateinitAccessors.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR // WITH_REFLECT // TARGET_BACKEND: JVM @@ -28,4 +27,5 @@ class LateinitProperties { fun box(): String { LateinitProperties().test() return "OK" -} \ No newline at end of file +} +