FIR: Take targeted annotations into account for metadata

Getter/setter targeted annotations were not correctly reflected
in the kotlin metadata which made them not work with
kotlin-reflect.
This commit is contained in:
Mads Ager
2021-03-01 16:42:54 +01:00
committed by Mikhail Glukhikh
parent 2a170652c5
commit 8e9dfc23b6
2 changed files with 15 additions and 6 deletions
@@ -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<FirAnnotationCall> =
(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)),
@@ -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"
}
}