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:
committed by
Mikhail Glukhikh
parent
2a170652c5
commit
8e9dfc23b6
+13
-4
@@ -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)),
|
||||
|
||||
+2
-2
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user