Deserialize property and field annotations
This commit is contained in:
+2
@@ -19,6 +19,8 @@ package org.jetbrains.kotlin.serialization.deserialization;
|
||||
public enum AnnotatedCallableKind {
|
||||
FUNCTION,
|
||||
PROPERTY,
|
||||
PROPERTY_SYNTHETIC_FUNCTION,
|
||||
PROPERTY_FIELD,
|
||||
PROPERTY_GETTER,
|
||||
PROPERTY_SETTER
|
||||
}
|
||||
|
||||
+28
-12
@@ -17,6 +17,7 @@
|
||||
package org.jetbrains.kotlin.serialization.deserialization
|
||||
|
||||
import org.jetbrains.kotlin.descriptors.*
|
||||
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
|
||||
import org.jetbrains.kotlin.descriptors.annotations.AnnotationWithTarget
|
||||
import org.jetbrains.kotlin.descriptors.annotations.Annotations
|
||||
@@ -31,7 +32,6 @@ import org.jetbrains.kotlin.serialization.ProtoBuf.Callable.CallableKind.VAL
|
||||
import org.jetbrains.kotlin.serialization.ProtoBuf.Callable.CallableKind.VAR
|
||||
import org.jetbrains.kotlin.serialization.deserialization.descriptors.*
|
||||
import org.jetbrains.kotlin.utils.toReadOnlyList
|
||||
import org.jetbrains.kotlin.utils.sure
|
||||
|
||||
public class MemberDeserializer(private val c: DeserializationContext) {
|
||||
public fun loadCallable(proto: Callable): CallableMemberDescriptor {
|
||||
@@ -48,7 +48,7 @@ public class MemberDeserializer(private val c: DeserializationContext) {
|
||||
|
||||
val property = DeserializedPropertyDescriptor(
|
||||
c.containingDeclaration, null,
|
||||
getAnnotations(proto, flags, AnnotatedCallableKind.PROPERTY),
|
||||
getPropertyAnnotations(proto),
|
||||
modality(Flags.MODALITY.get(flags)),
|
||||
visibility(Flags.VISIBILITY.get(flags)),
|
||||
Flags.CALLABLE_KIND.get(flags) == Callable.CallableKind.VAR,
|
||||
@@ -185,22 +185,36 @@ public class MemberDeserializer(private val c: DeserializationContext) {
|
||||
}
|
||||
}
|
||||
|
||||
private fun getPropertyAnnotations(proto: Callable): Annotations {
|
||||
return DeserializedAnnotationsWithPossibleTargets(c.storageManager) {
|
||||
val annotations = arrayListOf<AnnotationWithTarget>()
|
||||
val container = c.containingDeclaration.asProtoContainer()
|
||||
|
||||
fun loadAnnotations(kind: AnnotatedCallableKind, mapper: (AnnotationDescriptor) -> AnnotationWithTarget) {
|
||||
annotations += c.components.annotationAndConstantLoader.loadCallableAnnotations(
|
||||
container, proto, c.nameResolver, kind
|
||||
).map(mapper)
|
||||
}
|
||||
|
||||
loadAnnotations(AnnotatedCallableKind.PROPERTY_SYNTHETIC_FUNCTION) { AnnotationWithTarget(it, null) }
|
||||
loadAnnotations(AnnotatedCallableKind.PROPERTY_FIELD) { AnnotationWithTarget(it, AnnotationUseSiteTarget.FIELD) }
|
||||
|
||||
annotations
|
||||
}
|
||||
}
|
||||
|
||||
private fun getReceiverParameterAnnotations(
|
||||
proto: Callable,
|
||||
kind: AnnotatedCallableKind,
|
||||
receiverTargetedKind: AnnotatedCallableKind = kind
|
||||
): Annotations {
|
||||
return DeserializedAnnotationsWithPossibleTargets(c.storageManager) {
|
||||
val annotations = arrayListOf<AnnotationWithTarget>()
|
||||
val container = c.containingDeclaration.asProtoContainer()
|
||||
|
||||
if (proto.hasReceiverType()) {
|
||||
annotations += c.components.annotationAndConstantLoader
|
||||
val container = c.containingDeclaration.asProtoContainer()
|
||||
c.components.annotationAndConstantLoader
|
||||
.loadExtensionReceiverParameterAnnotations(container, proto, c.nameResolver, receiverTargetedKind)
|
||||
.map { AnnotationWithTarget(it, AnnotationUseSiteTarget.RECEIVER) }
|
||||
}
|
||||
|
||||
annotations
|
||||
} else emptyList()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -227,9 +241,6 @@ public class MemberDeserializer(private val c: DeserializationContext) {
|
||||
kind: AnnotatedCallableKind,
|
||||
valueParameter: Callable.ValueParameter
|
||||
): Annotations {
|
||||
if (!Flags.HAS_ANNOTATIONS.get(valueParameter.getFlags())) {
|
||||
return Annotations.EMPTY
|
||||
}
|
||||
return DeserializedAnnotations(c.storageManager) {
|
||||
c.components.annotationAndConstantLoader.loadValueParameterAnnotations(container, callable, c.nameResolver, kind, valueParameter)
|
||||
}
|
||||
@@ -240,4 +251,9 @@ public class MemberDeserializer(private val c: DeserializationContext) {
|
||||
is DeserializedClassDescriptor -> ProtoContainer(classProto, null)
|
||||
else -> error("Only members in classes or package fragments should be serialized: $this")
|
||||
}
|
||||
|
||||
private companion object {
|
||||
val CONSTRUCTOR_PARAMETER_ANNOTATION_MAPPER =
|
||||
{ a: AnnotationDescriptor -> AnnotationWithTarget(a, AnnotationUseSiteTarget.CONSTRUCTOR_PARAMETER) }
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user