From c666b60ca3f31b2d760248e574472fdd0bb72634 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Tue, 28 May 2019 13:48:05 +0200 Subject: [PATCH] Support arrays of class literals in AnnotationDeserializer #KT-28927 Fixed --- .../annotations/onTypes/differentArgumentTypes.kt | 7 ++++--- .../deserialization/AnnotationDeserializer.kt | 10 +++++----- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/compiler/testData/codegen/box/reflection/annotations/onTypes/differentArgumentTypes.kt b/compiler/testData/codegen/box/reflection/annotations/onTypes/differentArgumentTypes.kt index 4e1b22b6061..f7943f5b223 100644 --- a/compiler/testData/codegen/box/reflection/annotations/onTypes/differentArgumentTypes.kt +++ b/compiler/testData/codegen/box/reflection/annotations/onTypes/differentArgumentTypes.kt @@ -30,7 +30,7 @@ annotation class Anno( val e: AnnotationTarget, val a: Nested, val stra: Array, - // val ka: Array>, // Arrays of class literals are not supported yet in AnnotationDeserializer + val ka: Array>, val ea: Array, val aa: Array ) @@ -58,7 +58,7 @@ fun f(): @Anno( AnnotationTarget.EXPRESSION, Nested("1"), ["lmao"], - // [Double::class, Unit::class, LongArray::class], + [Double::class, Unit::class, LongArray::class], [AnnotationTarget.TYPEALIAS, AnnotationTarget.FIELD], [Nested("2"), Nested("3")] ) Unit {} @@ -68,7 +68,8 @@ fun box(): String { "[@Anno(b=1, c=x, d=3.14, f=-2.72, i=42424242, j=239239239239239, s=42, z=true, " + "ba=[-1], ca=[y], da=[-3.14159], fa=[2.7218], ia=[424242], ja=[239239239239], sa=[-43], za=[false, true], " + "str=lol, k=class java.lang.Number, k2=class [I, e=EXPRESSION, a=@Nested(value=1), " + - "stra=[lmao], ea=[TYPEALIAS, FIELD], aa=[@Nested(value=2), @Nested(value=3)])]", + "stra=[lmao], ka=[class java.lang.Double, class kotlin.Unit, class [J], ea=[TYPEALIAS, FIELD], " + + "aa=[@Nested(value=2), @Nested(value=3)])]", ::f.returnType.annotations.toString() ) diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/AnnotationDeserializer.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/AnnotationDeserializer.kt index 7e09f58da6d..69afa7ef77e 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/AnnotationDeserializer.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/AnnotationDeserializer.kt @@ -20,6 +20,7 @@ import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptorImpl +import org.jetbrains.kotlin.descriptors.annotations.Annotations import org.jetbrains.kotlin.metadata.ProtoBuf.Annotation import org.jetbrains.kotlin.metadata.ProtoBuf.Annotation.Argument import org.jetbrains.kotlin.metadata.ProtoBuf.Annotation.Argument.Value @@ -30,10 +31,7 @@ import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.constants.* -import org.jetbrains.kotlin.types.ErrorUtils -import org.jetbrains.kotlin.types.KotlinType -import org.jetbrains.kotlin.types.SimpleType -import org.jetbrains.kotlin.types.Variance +import org.jetbrains.kotlin.types.* import org.jetbrains.kotlin.types.typeUtil.isSubtypeOf class AnnotationDeserializer(private val module: ModuleDescriptor, private val notFoundClasses: NotFoundClasses) { @@ -141,7 +139,9 @@ class AnnotationDeserializer(private val module: ModuleDescriptor, private val n Type.DOUBLE -> doubleType Type.BOOLEAN -> booleanType Type.STRING -> stringType - Type.CLASS -> error("Arrays of class literals are not supported yet") // TODO: support arrays of class literals + Type.CLASS -> KotlinTypeFactory.simpleNotNullType( + Annotations.EMPTY, kClass, listOf(StarProjectionImpl(kClass.declaredTypeParameters.single())) + ) Type.ENUM -> resolveClass(nameResolver.getClassId(value.classId)).defaultType Type.ANNOTATION -> resolveClass(nameResolver.getClassId(value.annotation.id)).defaultType Type.ARRAY -> error("Array of arrays is impossible")