From f90303315d04f7dae983fad37c5aef0b4ead6fa6 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Tue, 4 Sep 2018 18:24:01 +0300 Subject: [PATCH] Support array class literals in annotation serializer/deserializer Note that this change brings an incompatibility: `Array::class` will be seen as `Foo::class` by the old deserializer. We consider this OK because the compiler never had any logic that relied on reading class literal arguments correctly (otherwise it wouldn't have worked because it could only see `Array<*>::class` before this commit), and the support of annotations on types in JVM reflection is only available in the upcoming 1.3 release (KT-16795) #KT-22069 Fixed --- .../incremental/ProtoCompareGenerated.kt | 9 + .../kotlin/metadata/DebugProtoBuf.java | 501 ++++++++++++------ .../serialization/AnnotationSerializer.kt | 17 +- .../annotations/types/ClassLiteralArgument.kt | 7 + .../types/ClassLiteralArgument.txt | 1 + .../utils/KotlinJavascriptMetadataUtils.kt | 2 +- .../deserialization/AnnotationDeserializer.kt | 14 +- .../jvm/deserialization/JvmMetadataVersion.kt | 2 +- core/metadata/src/metadata.proto | 9 + .../jetbrains/kotlin/metadata/ProtoBuf.java | 174 +++++- .../builtins/BuiltInsBinaryVersion.kt | 2 +- 11 files changed, 549 insertions(+), 189 deletions(-) diff --git a/build-common/src/org/jetbrains/kotlin/incremental/ProtoCompareGenerated.kt b/build-common/src/org/jetbrains/kotlin/incremental/ProtoCompareGenerated.kt index 16b60180688..377ebf451b8 100644 --- a/build-common/src/org/jetbrains/kotlin/incremental/ProtoCompareGenerated.kt +++ b/build-common/src/org/jetbrains/kotlin/incremental/ProtoCompareGenerated.kt @@ -977,6 +977,11 @@ open class ProtoCompareGenerated(val oldNameResolver: NameResolver, val newNameR if (!checkEqualsAnnotationArgumentValueArrayElement(old, new)) return false + if (old.hasArrayDimensionCount() != new.hasArrayDimensionCount()) return false + if (old.hasArrayDimensionCount()) { + if (old.arrayDimensionCount != new.arrayDimensionCount) return false + } + if (old.hasFlags() != new.hasFlags()) return false if (old.hasFlags()) { if (old.flags != new.flags) return false @@ -2166,6 +2171,10 @@ fun ProtoBuf.Annotation.Argument.Value.hashCode(stringIndexes: (Int) -> Int, fqN hashCode = 31 * hashCode + getArrayElement(i).hashCode(stringIndexes, fqNameIndexes) } + if (hasArrayDimensionCount()) { + hashCode = 31 * hashCode + arrayDimensionCount + } + if (hasFlags()) { hashCode = 31 * hashCode + flags } diff --git a/build-common/test/org/jetbrains/kotlin/metadata/DebugProtoBuf.java b/build-common/test/org/jetbrains/kotlin/metadata/DebugProtoBuf.java index 587a59cea7e..84ca0888be0 100644 --- a/build-common/test/org/jetbrains/kotlin/metadata/DebugProtoBuf.java +++ b/build-common/test/org/jetbrains/kotlin/metadata/DebugProtoBuf.java @@ -2633,6 +2633,35 @@ public final class DebugProtoBuf { org.jetbrains.kotlin.metadata.DebugProtoBuf.Annotation.Argument.ValueOrBuilder getArrayElementOrBuilder( int index); + /** + * optional int32 array_dimension_count = 11 [default = 0]; + * + *
+         * If type = CLASS, the number of dimensions of the array of the class specified in class_id.
+         * E.g. if class_id = kotlin/String, this annotation argument value denotes:
+         * - String::class, if array_dimension_count = 0
+         * - Array<String>::class, if array_dimension_count = 1
+         * - Array<Array<String>>::class, if array_dimension_count = 2
+         * - etc.
+         * Other forms of array class literals are not supported by this format, see KT-26568
+         * 
+ */ + boolean hasArrayDimensionCount(); + /** + * optional int32 array_dimension_count = 11 [default = 0]; + * + *
+         * If type = CLASS, the number of dimensions of the array of the class specified in class_id.
+         * E.g. if class_id = kotlin/String, this annotation argument value denotes:
+         * - String::class, if array_dimension_count = 0
+         * - Array<String>::class, if array_dimension_count = 1
+         * - Array<Array<String>>::class, if array_dimension_count = 2
+         * - etc.
+         * Other forms of array class literals are not supported by this format, see KT-26568
+         * 
+ */ + int getArrayDimensionCount(); + /** * optional int32 flags = 10 [default = 0]; * @@ -2765,10 +2794,15 @@ public final class DebugProtoBuf { break; } case 80: { - bitField0_ |= 0x00000100; + bitField0_ |= 0x00000200; flags_ = input.readInt32(); break; } + case 88: { + bitField0_ |= 0x00000100; + arrayDimensionCount_ = input.readInt32(); + break; + } } } } catch (org.jetbrains.kotlin.protobuf.InvalidProtocolBufferException e) { @@ -3174,6 +3208,41 @@ public final class DebugProtoBuf { return arrayElement_.get(index); } + public static final int ARRAY_DIMENSION_COUNT_FIELD_NUMBER = 11; + private int arrayDimensionCount_; + /** + * optional int32 array_dimension_count = 11 [default = 0]; + * + *
+         * If type = CLASS, the number of dimensions of the array of the class specified in class_id.
+         * E.g. if class_id = kotlin/String, this annotation argument value denotes:
+         * - String::class, if array_dimension_count = 0
+         * - Array<String>::class, if array_dimension_count = 1
+         * - Array<Array<String>>::class, if array_dimension_count = 2
+         * - etc.
+         * Other forms of array class literals are not supported by this format, see KT-26568
+         * 
+ */ + public boolean hasArrayDimensionCount() { + return ((bitField0_ & 0x00000100) == 0x00000100); + } + /** + * optional int32 array_dimension_count = 11 [default = 0]; + * + *
+         * If type = CLASS, the number of dimensions of the array of the class specified in class_id.
+         * E.g. if class_id = kotlin/String, this annotation argument value denotes:
+         * - String::class, if array_dimension_count = 0
+         * - Array<String>::class, if array_dimension_count = 1
+         * - Array<Array<String>>::class, if array_dimension_count = 2
+         * - etc.
+         * Other forms of array class literals are not supported by this format, see KT-26568
+         * 
+ */ + public int getArrayDimensionCount() { + return arrayDimensionCount_; + } + public static final int FLAGS_FIELD_NUMBER = 10; private int flags_; /** @@ -3184,7 +3253,7 @@ public final class DebugProtoBuf { * */ public boolean hasFlags() { - return ((bitField0_ & 0x00000100) == 0x00000100); + return ((bitField0_ & 0x00000200) == 0x00000200); } /** * optional int32 flags = 10 [default = 0]; @@ -3207,6 +3276,7 @@ public final class DebugProtoBuf { enumValueId_ = 0; annotation_ = org.jetbrains.kotlin.metadata.DebugProtoBuf.Annotation.getDefaultInstance(); arrayElement_ = java.util.Collections.emptyList(); + arrayDimensionCount_ = 0; flags_ = 0; } private byte memoizedIsInitialized = -1; @@ -3261,9 +3331,12 @@ public final class DebugProtoBuf { for (int i = 0; i < arrayElement_.size(); i++) { output.writeMessage(9, arrayElement_.get(i)); } - if (((bitField0_ & 0x00000100) == 0x00000100)) { + if (((bitField0_ & 0x00000200) == 0x00000200)) { output.writeInt32(10, flags_); } + if (((bitField0_ & 0x00000100) == 0x00000100)) { + output.writeInt32(11, arrayDimensionCount_); + } getUnknownFields().writeTo(output); } @@ -3309,10 +3382,14 @@ public final class DebugProtoBuf { size += org.jetbrains.kotlin.protobuf.CodedOutputStream .computeMessageSize(9, arrayElement_.get(i)); } - if (((bitField0_ & 0x00000100) == 0x00000100)) { + if (((bitField0_ & 0x00000200) == 0x00000200)) { size += org.jetbrains.kotlin.protobuf.CodedOutputStream .computeInt32Size(10, flags_); } + if (((bitField0_ & 0x00000100) == 0x00000100)) { + size += org.jetbrains.kotlin.protobuf.CodedOutputStream + .computeInt32Size(11, arrayDimensionCount_); + } size += getUnknownFields().getSerializedSize(); memoizedSerializedSize = size; return size; @@ -3458,8 +3535,10 @@ public final class DebugProtoBuf { } else { arrayElementBuilder_.clear(); } - flags_ = 0; + arrayDimensionCount_ = 0; bitField0_ = (bitField0_ & ~0x00000200); + flags_ = 0; + bitField0_ = (bitField0_ & ~0x00000400); return this; } @@ -3536,6 +3615,10 @@ public final class DebugProtoBuf { if (((from_bitField0_ & 0x00000200) == 0x00000200)) { to_bitField0_ |= 0x00000100; } + result.arrayDimensionCount_ = arrayDimensionCount_; + if (((from_bitField0_ & 0x00000400) == 0x00000400)) { + to_bitField0_ |= 0x00000200; + } result.flags_ = flags_; result.bitField0_ = to_bitField0_; onBuilt(); @@ -3603,6 +3686,9 @@ public final class DebugProtoBuf { } } } + if (other.hasArrayDimensionCount()) { + setArrayDimensionCount(other.getArrayDimensionCount()); + } if (other.hasFlags()) { setFlags(other.getFlags()); } @@ -4268,6 +4354,78 @@ public final class DebugProtoBuf { return arrayElementBuilder_; } + private int arrayDimensionCount_ ; + /** + * optional int32 array_dimension_count = 11 [default = 0]; + * + *
+           * If type = CLASS, the number of dimensions of the array of the class specified in class_id.
+           * E.g. if class_id = kotlin/String, this annotation argument value denotes:
+           * - String::class, if array_dimension_count = 0
+           * - Array<String>::class, if array_dimension_count = 1
+           * - Array<Array<String>>::class, if array_dimension_count = 2
+           * - etc.
+           * Other forms of array class literals are not supported by this format, see KT-26568
+           * 
+ */ + public boolean hasArrayDimensionCount() { + return ((bitField0_ & 0x00000200) == 0x00000200); + } + /** + * optional int32 array_dimension_count = 11 [default = 0]; + * + *
+           * If type = CLASS, the number of dimensions of the array of the class specified in class_id.
+           * E.g. if class_id = kotlin/String, this annotation argument value denotes:
+           * - String::class, if array_dimension_count = 0
+           * - Array<String>::class, if array_dimension_count = 1
+           * - Array<Array<String>>::class, if array_dimension_count = 2
+           * - etc.
+           * Other forms of array class literals are not supported by this format, see KT-26568
+           * 
+ */ + public int getArrayDimensionCount() { + return arrayDimensionCount_; + } + /** + * optional int32 array_dimension_count = 11 [default = 0]; + * + *
+           * If type = CLASS, the number of dimensions of the array of the class specified in class_id.
+           * E.g. if class_id = kotlin/String, this annotation argument value denotes:
+           * - String::class, if array_dimension_count = 0
+           * - Array<String>::class, if array_dimension_count = 1
+           * - Array<Array<String>>::class, if array_dimension_count = 2
+           * - etc.
+           * Other forms of array class literals are not supported by this format, see KT-26568
+           * 
+ */ + public Builder setArrayDimensionCount(int value) { + bitField0_ |= 0x00000200; + arrayDimensionCount_ = value; + onChanged(); + return this; + } + /** + * optional int32 array_dimension_count = 11 [default = 0]; + * + *
+           * If type = CLASS, the number of dimensions of the array of the class specified in class_id.
+           * E.g. if class_id = kotlin/String, this annotation argument value denotes:
+           * - String::class, if array_dimension_count = 0
+           * - Array<String>::class, if array_dimension_count = 1
+           * - Array<Array<String>>::class, if array_dimension_count = 2
+           * - etc.
+           * Other forms of array class literals are not supported by this format, see KT-26568
+           * 
+ */ + public Builder clearArrayDimensionCount() { + bitField0_ = (bitField0_ & ~0x00000200); + arrayDimensionCount_ = 0; + onChanged(); + return this; + } + private int flags_ ; /** * optional int32 flags = 10 [default = 0]; @@ -4277,7 +4435,7 @@ public final class DebugProtoBuf { * */ public boolean hasFlags() { - return ((bitField0_ & 0x00000200) == 0x00000200); + return ((bitField0_ & 0x00000400) == 0x00000400); } /** * optional int32 flags = 10 [default = 0]; @@ -4297,7 +4455,7 @@ public final class DebugProtoBuf { * */ public Builder setFlags(int value) { - bitField0_ |= 0x00000200; + bitField0_ |= 0x00000400; flags_ = value; onChanged(); return this; @@ -4310,7 +4468,7 @@ public final class DebugProtoBuf { * */ public Builder clearFlags() { - bitField0_ = (bitField0_ & ~0x00000200); + bitField0_ = (bitField0_ & ~0x00000400); flags_ = 0; onChanged(); return this; @@ -34137,12 +34295,12 @@ public final class DebugProtoBuf { "name\030\002 \002(\005\022[\n\004kind\030\003 \001(\0162D.org.jetbrains" + ".kotlin.metadata.QualifiedNameTable.Qual", "ifiedName.Kind:\007PACKAGE\")\n\004Kind\022\t\n\005CLASS" + - "\020\000\022\013\n\007PACKAGE\020\001\022\t\n\005LOCAL\020\002\"\364\005\n\nAnnotatio" + + "\020\000\022\013\n\007PACKAGE\020\001\022\t\n\005LOCAL\020\002\"\226\006\n\nAnnotatio" + "n\022\020\n\002id\030\001 \002(\005B\004\220\265\030\001\022D\n\010argument\030\002 \003(\01322." + "org.jetbrains.kotlin.metadata.Annotation" + - ".Argument\032\215\005\n\010Argument\022\025\n\007name_id\030\001 \002(\005B" + + ".Argument\032\257\005\n\010Argument\022\025\n\007name_id\030\001 \002(\005B" + "\004\210\265\030\001\022G\n\005value\030\002 \002(\01328.org.jetbrains.kot" + - "lin.metadata.Annotation.Argument.Value\032\240" + + "lin.metadata.Annotation.Argument.Value\032\302" + "\004\n\005Value\022K\n\004type\030\001 \001(\0162=.org.jetbrains.k" + "otlin.metadata.Annotation.Argument.Value" + ".Type\022\021\n\tint_value\030\002 \001(\022\022\023\n\013float_value\030", @@ -34152,167 +34310,168 @@ public final class DebugProtoBuf { "on\030\010 \001(\0132).org.jetbrains.kotlin.metadata" + ".Annotation\022O\n\rarray_element\030\t \003(\01328.org" + ".jetbrains.kotlin.metadata.Annotation.Ar" + - "gument.Value\022\020\n\005flags\030\n \001(\005:\0010\"\230\001\n\004Type\022" + - "\010\n\004BYTE\020\000\022\010\n\004CHAR\020\001\022\t\n\005SHORT\020\002\022\007\n\003INT\020\003\022" + - "\010\n\004LONG\020\004\022\t\n\005FLOAT\020\005\022\n\n\006DOUBLE\020\006\022\013\n\007BOOL" + - "EAN\020\007\022\n\n\006STRING\020\010\022\t\n\005CLASS\020\t\022\010\n\004ENUM\020\n\022\016", - "\n\nANNOTATION\020\013\022\t\n\005ARRAY\020\014\"\373\005\n\004Type\022>\n\010ar" + - "gument\030\002 \003(\0132,.org.jetbrains.kotlin.meta" + - "data.Type.Argument\022\027\n\010nullable\030\003 \001(\010:\005fa" + - "lse\022+\n\035flexible_type_capabilities_id\030\004 \001" + - "(\005B\004\230\265\030\001\022A\n\024flexible_upper_bound\030\005 \001(\0132#" + - ".org.jetbrains.kotlin.metadata.Type\022\037\n\027f" + - "lexible_upper_bound_id\030\010 \001(\005\022\030\n\nclass_na" + - "me\030\006 \001(\005B\004\220\265\030\001\022\026\n\016type_parameter\030\007 \001(\005\022!" + - "\n\023type_parameter_name\030\t \001(\005B\004\210\265\030\001\022\035\n\017typ" + - "e_alias_name\030\014 \001(\005B\004\220\265\030\001\0227\n\nouter_type\030\n", + "gument.Value\022 \n\025array_dimension_count\030\013 " + + "\001(\005:\0010\022\020\n\005flags\030\n \001(\005:\0010\"\230\001\n\004Type\022\010\n\004BYT" + + "E\020\000\022\010\n\004CHAR\020\001\022\t\n\005SHORT\020\002\022\007\n\003INT\020\003\022\010\n\004LON" + + "G\020\004\022\t\n\005FLOAT\020\005\022\n\n\006DOUBLE\020\006\022\013\n\007BOOLEAN\020\007\022", + "\n\n\006STRING\020\010\022\t\n\005CLASS\020\t\022\010\n\004ENUM\020\n\022\016\n\nANNO" + + "TATION\020\013\022\t\n\005ARRAY\020\014\"\373\005\n\004Type\022>\n\010argument" + + "\030\002 \003(\0132,.org.jetbrains.kotlin.metadata.T" + + "ype.Argument\022\027\n\010nullable\030\003 \001(\010:\005false\022+\n" + + "\035flexible_type_capabilities_id\030\004 \001(\005B\004\230\265" + + "\030\001\022A\n\024flexible_upper_bound\030\005 \001(\0132#.org.j" + + "etbrains.kotlin.metadata.Type\022\037\n\027flexibl" + + "e_upper_bound_id\030\010 \001(\005\022\030\n\nclass_name\030\006 \001" + + "(\005B\004\220\265\030\001\022\026\n\016type_parameter\030\007 \001(\005\022!\n\023type" + + "_parameter_name\030\t \001(\005B\004\210\265\030\001\022\035\n\017type_alia", + "s_name\030\014 \001(\005B\004\220\265\030\001\0227\n\nouter_type\030\n \001(\0132#" + + ".org.jetbrains.kotlin.metadata.Type\022\025\n\ro" + + "uter_type_id\030\013 \001(\005\022=\n\020abbreviated_type\030\r" + " \001(\0132#.org.jetbrains.kotlin.metadata.Typ" + - "e\022\025\n\router_type_id\030\013 \001(\005\022=\n\020abbreviated_" + - "type\030\r \001(\0132#.org.jetbrains.kotlin.metada" + - "ta.Type\022\033\n\023abbreviated_type_id\030\016 \001(\005\022\r\n\005" + - "flags\030\001 \001(\005\032\322\001\n\010Argument\022P\n\nprojection\030\001" + - " \001(\01627.org.jetbrains.kotlin.metadata.Typ" + - "e.Argument.Projection:\003INV\0221\n\004type\030\002 \001(\013" + - "2#.org.jetbrains.kotlin.metadata.Type\022\017\n" + - "\007type_id\030\003 \001(\005\"0\n\nProjection\022\006\n\002IN\020\000\022\007\n\003" + - "OUT\020\001\022\007\n\003INV\020\002\022\010\n\004STAR\020\003*\005\010d\020\310\001\"\230\002\n\rType", - "Parameter\022\n\n\002id\030\001 \002(\005\022\022\n\004name\030\002 \002(\005B\004\210\265\030" + - "\001\022\026\n\007reified\030\003 \001(\010:\005false\022L\n\010variance\030\004 " + - "\001(\01625.org.jetbrains.kotlin.metadata.Type" + - "Parameter.Variance:\003INV\0228\n\013upper_bound\030\005" + - " \003(\0132#.org.jetbrains.kotlin.metadata.Typ" + - "e\022\032\n\016upper_bound_id\030\006 \003(\005B\002\020\001\"$\n\010Varianc" + - "e\022\006\n\002IN\020\000\022\007\n\003OUT\020\001\022\007\n\003INV\020\002*\005\010d\020\350\007\"\244\007\n\005C" + - "lass\022\020\n\005flags\030\001 \001(\005:\0016\022\025\n\007fq_name\030\003 \002(\005B" + - "\004\220\265\030\001\022#\n\025companion_object_name\030\004 \001(\005B\004\210\265" + - "\030\001\022D\n\016type_parameter\030\005 \003(\0132,.org.jetbrai", - "ns.kotlin.metadata.TypeParameter\0226\n\tsupe" + - "rtype\030\006 \003(\0132#.org.jetbrains.kotlin.metad" + - "ata.Type\022\030\n\014supertype_id\030\002 \003(\005B\002\020\001\022!\n\021ne" + - "sted_class_name\030\007 \003(\005B\006\020\001\210\265\030\001\022?\n\013constru" + - "ctor\030\010 \003(\0132*.org.jetbrains.kotlin.metada" + - "ta.Constructor\0229\n\010function\030\t \003(\0132\'.org.j" + - "etbrains.kotlin.metadata.Function\0229\n\010pro" + - "perty\030\n \003(\0132\'.org.jetbrains.kotlin.metad" + - "ata.Property\022<\n\ntype_alias\030\013 \003(\0132(.org.j" + - "etbrains.kotlin.metadata.TypeAlias\022<\n\nen", - "um_entry\030\r \003(\0132(.org.jetbrains.kotlin.me" + - "tadata.EnumEntry\022\'\n\027sealed_subclass_fq_n" + - "ame\030\020 \003(\005B\006\020\001\220\265\030\001\022<\n\ntype_table\030\036 \001(\0132(." + - "org.jetbrains.kotlin.metadata.TypeTable\022" + - "\033\n\023version_requirement\030\037 \003(\005\022Y\n\031version_" + - "requirement_table\030 \001(\01326.org.jetbrains." + - "kotlin.metadata.VersionRequirementTable\"" + - "x\n\004Kind\022\t\n\005CLASS\020\000\022\r\n\tINTERFACE\020\001\022\016\n\nENU" + - "M_CLASS\020\002\022\016\n\nENUM_ENTRY\020\003\022\024\n\020ANNOTATION_" + - "CLASS\020\004\022\n\n\006OBJECT\020\005\022\024\n\020COMPANION_OBJECT\020", - "\006*\006\010d\020\270\224\001\"\335\002\n\007Package\0229\n\010function\030\003 \003(\0132" + - "\'.org.jetbrains.kotlin.metadata.Function" + - "\0229\n\010property\030\004 \003(\0132\'.org.jetbrains.kotli" + - "n.metadata.Property\022<\n\ntype_alias\030\005 \003(\0132" + - "(.org.jetbrains.kotlin.metadata.TypeAlia" + - "s\022<\n\ntype_table\030\036 \001(\0132(.org.jetbrains.ko" + - "tlin.metadata.TypeTable\022Y\n\031version_requi" + - "rement_table\030 \001(\01326.org.jetbrains.kotli" + - "n.metadata.VersionRequirementTable*\005\010d\020\310" + - "\001\"Z\n\tTypeTable\0221\n\004type\030\001 \003(\0132#.org.jetbr", - "ains.kotlin.metadata.Type\022\032\n\016first_nulla" + - "ble\030\002 \001(\005:\002-1\"\214\001\n\013Constructor\022\020\n\005flags\030\001" + - " \001(\005:\0016\022F\n\017value_parameter\030\002 \003(\0132-.org.j" + - "etbrains.kotlin.metadata.ValueParameter\022" + - "\033\n\023version_requirement\030\037 \003(\005*\006\010d\020\270\224\001\"\232\004\n" + - "\010Function\022\020\n\005flags\030\t \001(\005:\0016\022\024\n\told_flags" + - "\030\001 \001(\005:\0016\022\022\n\004name\030\002 \002(\005B\004\210\265\030\001\0228\n\013return_" + - "type\030\003 \001(\0132#.org.jetbrains.kotlin.metada" + - "ta.Type\022\026\n\016return_type_id\030\007 \001(\005\022D\n\016type_" + - "parameter\030\004 \003(\0132,.org.jetbrains.kotlin.m", - "etadata.TypeParameter\022:\n\rreceiver_type\030\005" + + "e\022\033\n\023abbreviated_type_id\030\016 \001(\005\022\r\n\005flags\030" + + "\001 \001(\005\032\322\001\n\010Argument\022P\n\nprojection\030\001 \001(\01627" + + ".org.jetbrains.kotlin.metadata.Type.Argu" + + "ment.Projection:\003INV\0221\n\004type\030\002 \001(\0132#.org" + + ".jetbrains.kotlin.metadata.Type\022\017\n\007type_" + + "id\030\003 \001(\005\"0\n\nProjection\022\006\n\002IN\020\000\022\007\n\003OUT\020\001\022", + "\007\n\003INV\020\002\022\010\n\004STAR\020\003*\005\010d\020\310\001\"\230\002\n\rTypeParame" + + "ter\022\n\n\002id\030\001 \002(\005\022\022\n\004name\030\002 \002(\005B\004\210\265\030\001\022\026\n\007r" + + "eified\030\003 \001(\010:\005false\022L\n\010variance\030\004 \001(\01625." + + "org.jetbrains.kotlin.metadata.TypeParame" + + "ter.Variance:\003INV\0228\n\013upper_bound\030\005 \003(\0132#" + + ".org.jetbrains.kotlin.metadata.Type\022\032\n\016u" + + "pper_bound_id\030\006 \003(\005B\002\020\001\"$\n\010Variance\022\006\n\002I" + + "N\020\000\022\007\n\003OUT\020\001\022\007\n\003INV\020\002*\005\010d\020\350\007\"\244\007\n\005Class\022\020" + + "\n\005flags\030\001 \001(\005:\0016\022\025\n\007fq_name\030\003 \002(\005B\004\220\265\030\001\022" + + "#\n\025companion_object_name\030\004 \001(\005B\004\210\265\030\001\022D\n\016", + "type_parameter\030\005 \003(\0132,.org.jetbrains.kot" + + "lin.metadata.TypeParameter\0226\n\tsupertype\030" + + "\006 \003(\0132#.org.jetbrains.kotlin.metadata.Ty" + + "pe\022\030\n\014supertype_id\030\002 \003(\005B\002\020\001\022!\n\021nested_c" + + "lass_name\030\007 \003(\005B\006\020\001\210\265\030\001\022?\n\013constructor\030\010" + + " \003(\0132*.org.jetbrains.kotlin.metadata.Con" + + "structor\0229\n\010function\030\t \003(\0132\'.org.jetbrai" + + "ns.kotlin.metadata.Function\0229\n\010property\030" + + "\n \003(\0132\'.org.jetbrains.kotlin.metadata.Pr" + + "operty\022<\n\ntype_alias\030\013 \003(\0132(.org.jetbrai", + "ns.kotlin.metadata.TypeAlias\022<\n\nenum_ent" + + "ry\030\r \003(\0132(.org.jetbrains.kotlin.metadata" + + ".EnumEntry\022\'\n\027sealed_subclass_fq_name\030\020 " + + "\003(\005B\006\020\001\220\265\030\001\022<\n\ntype_table\030\036 \001(\0132(.org.je" + + "tbrains.kotlin.metadata.TypeTable\022\033\n\023ver" + + "sion_requirement\030\037 \003(\005\022Y\n\031version_requir" + + "ement_table\030 \001(\01326.org.jetbrains.kotlin" + + ".metadata.VersionRequirementTable\"x\n\004Kin" + + "d\022\t\n\005CLASS\020\000\022\r\n\tINTERFACE\020\001\022\016\n\nENUM_CLAS" + + "S\020\002\022\016\n\nENUM_ENTRY\020\003\022\024\n\020ANNOTATION_CLASS\020", + "\004\022\n\n\006OBJECT\020\005\022\024\n\020COMPANION_OBJECT\020\006*\006\010d\020" + + "\270\224\001\"\335\002\n\007Package\0229\n\010function\030\003 \003(\0132\'.org." + + "jetbrains.kotlin.metadata.Function\0229\n\010pr" + + "operty\030\004 \003(\0132\'.org.jetbrains.kotlin.meta" + + "data.Property\022<\n\ntype_alias\030\005 \003(\0132(.org." + + "jetbrains.kotlin.metadata.TypeAlias\022<\n\nt" + + "ype_table\030\036 \001(\0132(.org.jetbrains.kotlin.m" + + "etadata.TypeTable\022Y\n\031version_requirement" + + "_table\030 \001(\01326.org.jetbrains.kotlin.meta" + + "data.VersionRequirementTable*\005\010d\020\310\001\"Z\n\tT", + "ypeTable\0221\n\004type\030\001 \003(\0132#.org.jetbrains.k" + + "otlin.metadata.Type\022\032\n\016first_nullable\030\002 " + + "\001(\005:\002-1\"\214\001\n\013Constructor\022\020\n\005flags\030\001 \001(\005:\001" + + "6\022F\n\017value_parameter\030\002 \003(\0132-.org.jetbrai" + + "ns.kotlin.metadata.ValueParameter\022\033\n\023ver" + + "sion_requirement\030\037 \003(\005*\006\010d\020\270\224\001\"\232\004\n\010Funct" + + "ion\022\020\n\005flags\030\t \001(\005:\0016\022\024\n\told_flags\030\001 \001(\005" + + ":\0016\022\022\n\004name\030\002 \002(\005B\004\210\265\030\001\0228\n\013return_type\030\003" + " \001(\0132#.org.jetbrains.kotlin.metadata.Typ" + - "e\022\030\n\020receiver_type_id\030\010 \001(\005\022F\n\017value_par" + - "ameter\030\006 \003(\0132-.org.jetbrains.kotlin.meta" + - "data.ValueParameter\022<\n\ntype_table\030\036 \001(\0132" + - "(.org.jetbrains.kotlin.metadata.TypeTabl" + - "e\022\033\n\023version_requirement\030\037 \003(\005\0229\n\010contra" + - "ct\030 \001(\0132\'.org.jetbrains.kotlin.metadata" + - ".Contract*\006\010d\020\270\224\001\"\331\003\n\010Property\022\022\n\005flags\030" + - "\013 \001(\005:\003518\022\027\n\told_flags\030\001 \001(\005:\0042054\022\022\n\004n", - "ame\030\002 \002(\005B\004\210\265\030\001\0228\n\013return_type\030\003 \001(\0132#.o" + - "rg.jetbrains.kotlin.metadata.Type\022\026\n\016ret" + - "urn_type_id\030\t \001(\005\022D\n\016type_parameter\030\004 \003(" + - "\0132,.org.jetbrains.kotlin.metadata.TypePa" + - "rameter\022:\n\rreceiver_type\030\005 \001(\0132#.org.jet" + - "brains.kotlin.metadata.Type\022\030\n\020receiver_" + - "type_id\030\n \001(\005\022M\n\026setter_value_parameter\030" + - "\006 \001(\0132-.org.jetbrains.kotlin.metadata.Va" + - "lueParameter\022\024\n\014getter_flags\030\007 \001(\005\022\024\n\014se" + - "tter_flags\030\010 \001(\005\022\033\n\023version_requirement\030", - "\037 \003(\005*\006\010d\020\270\224\001\"\343\001\n\016ValueParameter\022\020\n\005flag" + - "s\030\001 \001(\005:\0010\022\022\n\004name\030\002 \002(\005B\004\210\265\030\001\0221\n\004type\030\003" + - " \001(\0132#.org.jetbrains.kotlin.metadata.Typ" + - "e\022\017\n\007type_id\030\005 \001(\005\022@\n\023vararg_element_typ" + - "e\030\004 \001(\0132#.org.jetbrains.kotlin.metadata." + - "Type\022\036\n\026vararg_element_type_id\030\006 \001(\005*\005\010d" + - "\020\310\001\"\212\003\n\tTypeAlias\022\020\n\005flags\030\001 \001(\005:\0016\022\022\n\004n" + - "ame\030\002 \002(\005B\004\210\265\030\001\022D\n\016type_parameter\030\003 \003(\0132" + - ",.org.jetbrains.kotlin.metadata.TypePara" + - "meter\022<\n\017underlying_type\030\004 \001(\0132#.org.jet", - "brains.kotlin.metadata.Type\022\032\n\022underlyin" + - "g_type_id\030\005 \001(\005\022:\n\rexpanded_type\030\006 \001(\0132#" + - ".org.jetbrains.kotlin.metadata.Type\022\030\n\020e" + - "xpanded_type_id\030\007 \001(\005\022=\n\nannotation\030\010 \003(" + - "\0132).org.jetbrains.kotlin.metadata.Annota" + - "tion\022\033\n\023version_requirement\030\037 \003(\005*\005\010d\020\310\001" + - "\"&\n\tEnumEntry\022\022\n\004name\030\001 \001(\005B\004\210\265\030\001*\005\010d\020\310\001" + - "\"\225\003\n\022VersionRequirement\022\017\n\007version\030\001 \001(\005" + - "\022\024\n\014version_full\030\002 \001(\005\022M\n\005level\030\003 \001(\01627." + - "org.jetbrains.kotlin.metadata.VersionReq", - "uirement.Level:\005ERROR\022\022\n\nerror_code\030\004 \001(" + - "\005\022\025\n\007message\030\005 \001(\005B\004\230\265\030\001\022e\n\014version_kind" + - "\030\006 \001(\0162=.org.jetbrains.kotlin.metadata.V" + - "ersionRequirement.VersionKind:\020LANGUAGE_" + - "VERSION\"+\n\005Level\022\013\n\007WARNING\020\000\022\t\n\005ERROR\020\001" + - "\022\n\n\006HIDDEN\020\002\"J\n\013VersionKind\022\024\n\020LANGUAGE_" + - "VERSION\020\000\022\024\n\020COMPILER_VERSION\020\001\022\017\n\013API_V" + - "ERSION\020\002\"a\n\027VersionRequirementTable\022F\n\013r" + - "equirement\030\001 \003(\01321.org.jetbrains.kotlin." + - "metadata.VersionRequirement\"\217\002\n\017PackageF", - "ragment\022;\n\007strings\030\001 \001(\0132*.org.jetbrains" + - ".kotlin.metadata.StringTable\022J\n\017qualifie" + - "d_names\030\002 \001(\01321.org.jetbrains.kotlin.met" + - "adata.QualifiedNameTable\0227\n\007package\030\003 \001(" + - "\0132&.org.jetbrains.kotlin.metadata.Packag" + - "e\0223\n\005class\030\004 \003(\0132$.org.jetbrains.kotlin." + - "metadata.Class*\005\010d\020\310\001\"A\n\010Contract\0225\n\006eff" + - "ect\030\001 \003(\0132%.org.jetbrains.kotlin.metadat" + - "a.Effect\"\306\003\n\006Effect\022E\n\013effect_type\030\001 \001(\016" + - "20.org.jetbrains.kotlin.metadata.Effect.", - "EffectType\022N\n\033effect_constructor_argumen" + - "t\030\002 \003(\0132).org.jetbrains.kotlin.metadata." + - "Expression\022S\n conclusion_of_conditional_" + - "effect\030\003 \001(\0132).org.jetbrains.kotlin.meta" + - "data.Expression\022B\n\004kind\030\004 \001(\01624.org.jetb" + - "rains.kotlin.metadata.Effect.InvocationK" + - "ind\"C\n\nEffectType\022\024\n\020RETURNS_CONSTANT\020\000\022" + - "\t\n\005CALLS\020\001\022\024\n\020RETURNS_NOT_NULL\020\002\"G\n\016Invo" + - "cationKind\022\020\n\014AT_MOST_ONCE\020\000\022\020\n\014EXACTLY_" + - "ONCE\020\001\022\021\n\rAT_LEAST_ONCE\020\002\"\237\003\n\nExpression", - "\022\020\n\005flags\030\001 \001(\005:\0010\022!\n\031value_parameter_re" + - "ference\030\002 \001(\005\022O\n\016constant_value\030\003 \001(\01627." + - "org.jetbrains.kotlin.metadata.Expression" + - ".ConstantValue\022=\n\020is_instance_type\030\004 \001(\013" + - "2#.org.jetbrains.kotlin.metadata.Type\022\033\n" + - "\023is_instance_type_id\030\005 \001(\005\022?\n\014and_argume" + - "nt\030\006 \003(\0132).org.jetbrains.kotlin.metadata" + - ".Expression\022>\n\013or_argument\030\007 \003(\0132).org.j" + - "etbrains.kotlin.metadata.Expression\".\n\rC" + - "onstantValue\022\010\n\004TRUE\020\000\022\t\n\005FALSE\020\001\022\010\n\004NUL", - "L\020\002*9\n\010Modality\022\t\n\005FINAL\020\000\022\010\n\004OPEN\020\001\022\014\n\010" + - "ABSTRACT\020\002\022\n\n\006SEALED\020\003*b\n\nVisibility\022\014\n\010" + - "INTERNAL\020\000\022\013\n\007PRIVATE\020\001\022\r\n\tPROTECTED\020\002\022\n" + - "\n\006PUBLIC\020\003\022\023\n\017PRIVATE_TO_THIS\020\004\022\t\n\005LOCAL" + - "\020\005*Q\n\nMemberKind\022\017\n\013DECLARATION\020\000\022\021\n\rFAK" + - "E_OVERRIDE\020\001\022\016\n\nDELEGATION\020\002\022\017\n\013SYNTHESI" + - "ZED\020\003B\017B\rDebugProtoBuf" + "e\022\026\n\016return_type_id\030\007 \001(\005\022D\n\016type_parame", + "ter\030\004 \003(\0132,.org.jetbrains.kotlin.metadat" + + "a.TypeParameter\022:\n\rreceiver_type\030\005 \001(\0132#" + + ".org.jetbrains.kotlin.metadata.Type\022\030\n\020r" + + "eceiver_type_id\030\010 \001(\005\022F\n\017value_parameter" + + "\030\006 \003(\0132-.org.jetbrains.kotlin.metadata.V" + + "alueParameter\022<\n\ntype_table\030\036 \001(\0132(.org." + + "jetbrains.kotlin.metadata.TypeTable\022\033\n\023v" + + "ersion_requirement\030\037 \003(\005\0229\n\010contract\030 \001" + + "(\0132\'.org.jetbrains.kotlin.metadata.Contr" + + "act*\006\010d\020\270\224\001\"\331\003\n\010Property\022\022\n\005flags\030\013 \001(\005:", + "\003518\022\027\n\told_flags\030\001 \001(\005:\0042054\022\022\n\004name\030\002 " + + "\002(\005B\004\210\265\030\001\0228\n\013return_type\030\003 \001(\0132#.org.jet" + + "brains.kotlin.metadata.Type\022\026\n\016return_ty" + + "pe_id\030\t \001(\005\022D\n\016type_parameter\030\004 \003(\0132,.or" + + "g.jetbrains.kotlin.metadata.TypeParamete" + + "r\022:\n\rreceiver_type\030\005 \001(\0132#.org.jetbrains" + + ".kotlin.metadata.Type\022\030\n\020receiver_type_i" + + "d\030\n \001(\005\022M\n\026setter_value_parameter\030\006 \001(\0132" + + "-.org.jetbrains.kotlin.metadata.ValuePar" + + "ameter\022\024\n\014getter_flags\030\007 \001(\005\022\024\n\014setter_f", + "lags\030\010 \001(\005\022\033\n\023version_requirement\030\037 \003(\005*" + + "\006\010d\020\270\224\001\"\343\001\n\016ValueParameter\022\020\n\005flags\030\001 \001(" + + "\005:\0010\022\022\n\004name\030\002 \002(\005B\004\210\265\030\001\0221\n\004type\030\003 \001(\0132#" + + ".org.jetbrains.kotlin.metadata.Type\022\017\n\007t" + + "ype_id\030\005 \001(\005\022@\n\023vararg_element_type\030\004 \001(" + + "\0132#.org.jetbrains.kotlin.metadata.Type\022\036" + + "\n\026vararg_element_type_id\030\006 \001(\005*\005\010d\020\310\001\"\212\003" + + "\n\tTypeAlias\022\020\n\005flags\030\001 \001(\005:\0016\022\022\n\004name\030\002 " + + "\002(\005B\004\210\265\030\001\022D\n\016type_parameter\030\003 \003(\0132,.org." + + "jetbrains.kotlin.metadata.TypeParameter\022", + "<\n\017underlying_type\030\004 \001(\0132#.org.jetbrains" + + ".kotlin.metadata.Type\022\032\n\022underlying_type" + + "_id\030\005 \001(\005\022:\n\rexpanded_type\030\006 \001(\0132#.org.j" + + "etbrains.kotlin.metadata.Type\022\030\n\020expande" + + "d_type_id\030\007 \001(\005\022=\n\nannotation\030\010 \003(\0132).or" + + "g.jetbrains.kotlin.metadata.Annotation\022\033" + + "\n\023version_requirement\030\037 \003(\005*\005\010d\020\310\001\"&\n\tEn" + + "umEntry\022\022\n\004name\030\001 \001(\005B\004\210\265\030\001*\005\010d\020\310\001\"\225\003\n\022V" + + "ersionRequirement\022\017\n\007version\030\001 \001(\005\022\024\n\014ve" + + "rsion_full\030\002 \001(\005\022M\n\005level\030\003 \001(\01627.org.je", + "tbrains.kotlin.metadata.VersionRequireme" + + "nt.Level:\005ERROR\022\022\n\nerror_code\030\004 \001(\005\022\025\n\007m" + + "essage\030\005 \001(\005B\004\230\265\030\001\022e\n\014version_kind\030\006 \001(\016" + + "2=.org.jetbrains.kotlin.metadata.Version" + + "Requirement.VersionKind:\020LANGUAGE_VERSIO" + + "N\"+\n\005Level\022\013\n\007WARNING\020\000\022\t\n\005ERROR\020\001\022\n\n\006HI" + + "DDEN\020\002\"J\n\013VersionKind\022\024\n\020LANGUAGE_VERSIO" + + "N\020\000\022\024\n\020COMPILER_VERSION\020\001\022\017\n\013API_VERSION" + + "\020\002\"a\n\027VersionRequirementTable\022F\n\013require" + + "ment\030\001 \003(\01321.org.jetbrains.kotlin.metada", + "ta.VersionRequirement\"\217\002\n\017PackageFragmen" + + "t\022;\n\007strings\030\001 \001(\0132*.org.jetbrains.kotli" + + "n.metadata.StringTable\022J\n\017qualified_name" + + "s\030\002 \001(\01321.org.jetbrains.kotlin.metadata." + + "QualifiedNameTable\0227\n\007package\030\003 \001(\0132&.or" + + "g.jetbrains.kotlin.metadata.Package\0223\n\005c" + + "lass\030\004 \003(\0132$.org.jetbrains.kotlin.metada" + + "ta.Class*\005\010d\020\310\001\"A\n\010Contract\0225\n\006effect\030\001 " + + "\003(\0132%.org.jetbrains.kotlin.metadata.Effe" + + "ct\"\306\003\n\006Effect\022E\n\013effect_type\030\001 \001(\01620.org", + ".jetbrains.kotlin.metadata.Effect.Effect" + + "Type\022N\n\033effect_constructor_argument\030\002 \003(" + + "\0132).org.jetbrains.kotlin.metadata.Expres" + + "sion\022S\n conclusion_of_conditional_effect" + + "\030\003 \001(\0132).org.jetbrains.kotlin.metadata.E" + + "xpression\022B\n\004kind\030\004 \001(\01624.org.jetbrains." + + "kotlin.metadata.Effect.InvocationKind\"C\n" + + "\nEffectType\022\024\n\020RETURNS_CONSTANT\020\000\022\t\n\005CAL" + + "LS\020\001\022\024\n\020RETURNS_NOT_NULL\020\002\"G\n\016Invocation" + + "Kind\022\020\n\014AT_MOST_ONCE\020\000\022\020\n\014EXACTLY_ONCE\020\001", + "\022\021\n\rAT_LEAST_ONCE\020\002\"\237\003\n\nExpression\022\020\n\005fl" + + "ags\030\001 \001(\005:\0010\022!\n\031value_parameter_referenc" + + "e\030\002 \001(\005\022O\n\016constant_value\030\003 \001(\01627.org.je" + + "tbrains.kotlin.metadata.Expression.Const" + + "antValue\022=\n\020is_instance_type\030\004 \001(\0132#.org" + + ".jetbrains.kotlin.metadata.Type\022\033\n\023is_in" + + "stance_type_id\030\005 \001(\005\022?\n\014and_argument\030\006 \003" + + "(\0132).org.jetbrains.kotlin.metadata.Expre" + + "ssion\022>\n\013or_argument\030\007 \003(\0132).org.jetbrai" + + "ns.kotlin.metadata.Expression\".\n\rConstan", + "tValue\022\010\n\004TRUE\020\000\022\t\n\005FALSE\020\001\022\010\n\004NULL\020\002*9\n" + + "\010Modality\022\t\n\005FINAL\020\000\022\010\n\004OPEN\020\001\022\014\n\010ABSTRA" + + "CT\020\002\022\n\n\006SEALED\020\003*b\n\nVisibility\022\014\n\010INTERN" + + "AL\020\000\022\013\n\007PRIVATE\020\001\022\r\n\tPROTECTED\020\002\022\n\n\006PUBL" + + "IC\020\003\022\023\n\017PRIVATE_TO_THIS\020\004\022\t\n\005LOCAL\020\005*Q\n\n" + + "MemberKind\022\017\n\013DECLARATION\020\000\022\021\n\rFAKE_OVER" + + "RIDE\020\001\022\016\n\nDELEGATION\020\002\022\017\n\013SYNTHESIZED\020\003B" + + "\017B\rDebugProtoBuf" }; org.jetbrains.kotlin.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = new org.jetbrains.kotlin.protobuf.Descriptors.FileDescriptor. InternalDescriptorAssigner() { @@ -34362,7 +34521,7 @@ public final class DebugProtoBuf { internal_static_org_jetbrains_kotlin_metadata_Annotation_Argument_Value_fieldAccessorTable = new org.jetbrains.kotlin.protobuf.GeneratedMessage.FieldAccessorTable( internal_static_org_jetbrains_kotlin_metadata_Annotation_Argument_Value_descriptor, - new java.lang.String[] { "Type", "IntValue", "FloatValue", "DoubleValue", "StringValue", "ClassId", "EnumValueId", "Annotation", "ArrayElement", "Flags", }); + new java.lang.String[] { "Type", "IntValue", "FloatValue", "DoubleValue", "StringValue", "ClassId", "EnumValueId", "Annotation", "ArrayElement", "ArrayDimensionCount", "Flags", }); internal_static_org_jetbrains_kotlin_metadata_Type_descriptor = getDescriptor().getMessageTypes().get(3); internal_static_org_jetbrains_kotlin_metadata_Type_fieldAccessorTable = new diff --git a/compiler/serialization/src/org/jetbrains/kotlin/serialization/AnnotationSerializer.kt b/compiler/serialization/src/org/jetbrains/kotlin/serialization/AnnotationSerializer.kt index 17b9b875c3e..fadf2b1bd7e 100644 --- a/compiler/serialization/src/org/jetbrains/kotlin/serialization/AnnotationSerializer.kt +++ b/compiler/serialization/src/org/jetbrains/kotlin/serialization/AnnotationSerializer.kt @@ -16,6 +16,7 @@ package org.jetbrains.kotlin.serialization +import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.annotations.AnnotationArgumentVisitor import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor @@ -99,11 +100,23 @@ class AnnotationSerializer(private val stringTable: DescriptorAwareStringTable) } override fun visitKClassValue(value: KClassValue, data: Unit) { - val descriptor = value.value.constructor.declarationDescriptor as? ClassDescriptor - ?: throw UnsupportedOperationException("Class literal annotation argument should be a class: $value") + var kotlinType = value.value + var arrayDimensions = 0 + while (KotlinBuiltIns.isArray(kotlinType)) { + // We only support invariant projections and non-null array element types, see KT-26568 + kotlinType = kotlinType.arguments.single().type + arrayDimensions++ + } + + val descriptor = kotlinType.constructor.declarationDescriptor as? ClassDescriptor + ?: throw UnsupportedOperationException("Class literal annotation argument should be a class: $value") type = Type.CLASS classId = stringTable.getFqNameIndex(descriptor) + + if (arrayDimensions > 0) { + arrayDimensionCount = arrayDimensions + } } override fun visitLongValue(value: LongValue, data: Unit) { diff --git a/compiler/testData/loadJava/compiledKotlin/annotations/types/ClassLiteralArgument.kt b/compiler/testData/loadJava/compiledKotlin/annotations/types/ClassLiteralArgument.kt index 0bc7e5e5d6a..2f9f8704b04 100644 --- a/compiler/testData/loadJava/compiledKotlin/annotations/types/ClassLiteralArgument.kt +++ b/compiler/testData/loadJava/compiledKotlin/annotations/types/ClassLiteralArgument.kt @@ -11,6 +11,13 @@ class A { fun simple(s: @Ann(Simple::class) String) {} fun generic(s: @Ann(Generic::class) String) {} fun innerGeneric(s: @Ann(InnerGeneric.Inner::class) String) {} + + fun arrays( + s: @Ann(Array::class) Array, + t: @Ann(Array::class) Array, + u: @Ann(Array>::class) Array>, + v: @Ann(Array>>::class) Array>> + ) {} } class Simple diff --git a/compiler/testData/loadJava/compiledKotlin/annotations/types/ClassLiteralArgument.txt b/compiler/testData/loadJava/compiledKotlin/annotations/types/ClassLiteralArgument.txt index 09eb060647d..77a9e5d2341 100644 --- a/compiler/testData/loadJava/compiledKotlin/annotations/types/ClassLiteralArgument.txt +++ b/compiler/testData/loadJava/compiledKotlin/annotations/types/ClassLiteralArgument.txt @@ -2,6 +2,7 @@ package test public final class A { /*primary*/ public constructor A() + public final fun arrays(/*0*/ s: @test.Ann(klass = kotlin.Array::class) kotlin.Array, /*1*/ t: @test.Ann(klass = kotlin.Array::class) kotlin.Array, /*2*/ u: @test.Ann(klass = kotlin.Array>::class) kotlin.Array>, /*3*/ v: @test.Ann(klass = kotlin.Array>>::class) kotlin.Array>>): kotlin.Unit public final fun generic(/*0*/ s: @test.Ann(klass = test.Generic<*>::class) kotlin.String): kotlin.Unit public final fun innerGeneric(/*0*/ s: @test.Ann(klass = test.InnerGeneric<*, *>.Inner<*, *>::class) kotlin.String): kotlin.Unit public final fun simple(/*0*/ s: @test.Ann(klass = test.Simple::class) kotlin.String): kotlin.Unit diff --git a/compiler/util/src/org/jetbrains/kotlin/utils/KotlinJavascriptMetadataUtils.kt b/compiler/util/src/org/jetbrains/kotlin/utils/KotlinJavascriptMetadataUtils.kt index 4bf35a160c9..9ed399973cd 100644 --- a/compiler/util/src/org/jetbrains/kotlin/utils/KotlinJavascriptMetadataUtils.kt +++ b/compiler/util/src/org/jetbrains/kotlin/utils/KotlinJavascriptMetadataUtils.kt @@ -33,7 +33,7 @@ class JsMetadataVersion(vararg numbers: Int) : BinaryVersion(*numbers) { companion object { @JvmField - val INSTANCE = JsMetadataVersion(1, 2, 4) + val INSTANCE = JsMetadataVersion(1, 2, 5) @JvmField val INVALID_VERSION = JsMetadataVersion() 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 21c0f574a10..ffd4738a0c5 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/AnnotationDeserializer.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/AnnotationDeserializer.kt @@ -79,7 +79,7 @@ class AnnotationDeserializer(private val module: ModuleDescriptor, private val n StringValue(nameResolver.getString(value.stringValue)) } Type.CLASS -> { - resolveClassLiteralValue(nameResolver.getClassId(value.classId)) + resolveClassLiteralValue(nameResolver.getClassId(value.classId), value.arrayDimensionCount) } Type.ENUM -> { EnumValue(nameResolver.getClassId(value.classId), nameResolver.getName(value.enumValueId)) @@ -128,13 +128,17 @@ class AnnotationDeserializer(private val module: ModuleDescriptor, private val n private inline fun T.letIf(predicate: Boolean, f: (T) -> R, g: (T) -> R): R = if (predicate) f(this) else g(this) - private fun resolveClassLiteralValue(classId: ClassId): ConstantValue<*> { + private fun resolveClassLiteralValue(classId: ClassId, arrayDimensions: Int): ConstantValue<*> { // If value refers to a class named test.Foo.Bar where both Foo and Bar have generic type parameters, // we're constructing a type `KClass.Bar<*>>` below - val starProjectedType = resolveClass(classId).defaultType.replaceArgumentsWithStarProjections() + var type = resolveClass(classId).defaultType.replaceArgumentsWithStarProjections() + repeat(arrayDimensions) { + // We only support invariant projections and non-null array element types, see KT-26568 + type = builtIns.getArrayType(Variance.INVARIANT, type) + } + val kClass = resolveClass(ClassId.topLevel(KotlinBuiltIns.FQ_NAMES.kClass.toSafe())) - val type = KotlinTypeFactory.simpleNotNullType(Annotations.EMPTY, kClass, listOf(TypeProjectionImpl(starProjectedType))) - return KClassValue(type) + return KClassValue(KotlinTypeFactory.simpleNotNullType(Annotations.EMPTY, kClass, listOf(TypeProjectionImpl(type)))) } private fun resolveArrayElementType(value: Value, nameResolver: NameResolver): SimpleType = diff --git a/core/metadata.jvm/src/org/jetbrains/kotlin/metadata/jvm/deserialization/JvmMetadataVersion.kt b/core/metadata.jvm/src/org/jetbrains/kotlin/metadata/jvm/deserialization/JvmMetadataVersion.kt index 5ed58e5d6b3..f80ff9f7a4e 100644 --- a/core/metadata.jvm/src/org/jetbrains/kotlin/metadata/jvm/deserialization/JvmMetadataVersion.kt +++ b/core/metadata.jvm/src/org/jetbrains/kotlin/metadata/jvm/deserialization/JvmMetadataVersion.kt @@ -20,7 +20,7 @@ class JvmMetadataVersion(vararg numbers: Int) : BinaryVersion(*numbers) { companion object { @JvmField - val INSTANCE = JvmMetadataVersion(1, 1, 12) + val INSTANCE = JvmMetadataVersion(1, 1, 13) @JvmField val INVALID_VERSION = JvmMetadataVersion() diff --git a/core/metadata/src/metadata.proto b/core/metadata/src/metadata.proto index 9df4eee01c6..51efe11bf33 100644 --- a/core/metadata/src/metadata.proto +++ b/core/metadata/src/metadata.proto @@ -84,6 +84,15 @@ message Annotation { repeated Value array_element = 9; + // If type = CLASS, the number of dimensions of the array of the class specified in class_id. + // E.g. if class_id = kotlin/String, this annotation argument value denotes: + // - String::class, if array_dimension_count = 0 + // - Array::class, if array_dimension_count = 1 + // - Array>::class, if array_dimension_count = 2 + // - etc. + // Other forms of array class literals are not supported by this format, see KT-26568 + optional int32 array_dimension_count = 11 [default = 0]; + /* isUnsigned */ diff --git a/core/metadata/src/org/jetbrains/kotlin/metadata/ProtoBuf.java b/core/metadata/src/org/jetbrains/kotlin/metadata/ProtoBuf.java index 2abfce251e2..efbeda72046 100644 --- a/core/metadata/src/org/jetbrains/kotlin/metadata/ProtoBuf.java +++ b/core/metadata/src/org/jetbrains/kotlin/metadata/ProtoBuf.java @@ -2201,6 +2201,35 @@ public final class ProtoBuf { */ int getArrayElementCount(); + /** + * optional int32 array_dimension_count = 11 [default = 0]; + * + *
+         * If type = CLASS, the number of dimensions of the array of the class specified in class_id.
+         * E.g. if class_id = kotlin/String, this annotation argument value denotes:
+         * - String::class, if array_dimension_count = 0
+         * - Array<String>::class, if array_dimension_count = 1
+         * - Array<Array<String>>::class, if array_dimension_count = 2
+         * - etc.
+         * Other forms of array class literals are not supported by this format, see KT-26568
+         * 
+ */ + boolean hasArrayDimensionCount(); + /** + * optional int32 array_dimension_count = 11 [default = 0]; + * + *
+         * If type = CLASS, the number of dimensions of the array of the class specified in class_id.
+         * E.g. if class_id = kotlin/String, this annotation argument value denotes:
+         * - String::class, if array_dimension_count = 0
+         * - Array<String>::class, if array_dimension_count = 1
+         * - Array<Array<String>>::class, if array_dimension_count = 2
+         * - etc.
+         * Other forms of array class literals are not supported by this format, see KT-26568
+         * 
+ */ + int getArrayDimensionCount(); + /** * optional int32 flags = 10 [default = 0]; * @@ -2332,10 +2361,15 @@ public final class ProtoBuf { break; } case 80: { - bitField0_ |= 0x00000100; + bitField0_ |= 0x00000200; flags_ = input.readInt32(); break; } + case 88: { + bitField0_ |= 0x00000100; + arrayDimensionCount_ = input.readInt32(); + break; + } } } } catch (org.jetbrains.kotlin.protobuf.InvalidProtocolBufferException e) { @@ -2703,6 +2737,41 @@ public final class ProtoBuf { return arrayElement_.get(index); } + public static final int ARRAY_DIMENSION_COUNT_FIELD_NUMBER = 11; + private int arrayDimensionCount_; + /** + * optional int32 array_dimension_count = 11 [default = 0]; + * + *
+         * If type = CLASS, the number of dimensions of the array of the class specified in class_id.
+         * E.g. if class_id = kotlin/String, this annotation argument value denotes:
+         * - String::class, if array_dimension_count = 0
+         * - Array<String>::class, if array_dimension_count = 1
+         * - Array<Array<String>>::class, if array_dimension_count = 2
+         * - etc.
+         * Other forms of array class literals are not supported by this format, see KT-26568
+         * 
+ */ + public boolean hasArrayDimensionCount() { + return ((bitField0_ & 0x00000100) == 0x00000100); + } + /** + * optional int32 array_dimension_count = 11 [default = 0]; + * + *
+         * If type = CLASS, the number of dimensions of the array of the class specified in class_id.
+         * E.g. if class_id = kotlin/String, this annotation argument value denotes:
+         * - String::class, if array_dimension_count = 0
+         * - Array<String>::class, if array_dimension_count = 1
+         * - Array<Array<String>>::class, if array_dimension_count = 2
+         * - etc.
+         * Other forms of array class literals are not supported by this format, see KT-26568
+         * 
+ */ + public int getArrayDimensionCount() { + return arrayDimensionCount_; + } + public static final int FLAGS_FIELD_NUMBER = 10; private int flags_; /** @@ -2713,7 +2782,7 @@ public final class ProtoBuf { * */ public boolean hasFlags() { - return ((bitField0_ & 0x00000100) == 0x00000100); + return ((bitField0_ & 0x00000200) == 0x00000200); } /** * optional int32 flags = 10 [default = 0]; @@ -2736,6 +2805,7 @@ public final class ProtoBuf { enumValueId_ = 0; annotation_ = org.jetbrains.kotlin.metadata.ProtoBuf.Annotation.getDefaultInstance(); arrayElement_ = java.util.Collections.emptyList(); + arrayDimensionCount_ = 0; flags_ = 0; } private byte memoizedIsInitialized = -1; @@ -2790,9 +2860,12 @@ public final class ProtoBuf { for (int i = 0; i < arrayElement_.size(); i++) { output.writeMessage(9, arrayElement_.get(i)); } - if (((bitField0_ & 0x00000100) == 0x00000100)) { + if (((bitField0_ & 0x00000200) == 0x00000200)) { output.writeInt32(10, flags_); } + if (((bitField0_ & 0x00000100) == 0x00000100)) { + output.writeInt32(11, arrayDimensionCount_); + } output.writeRawBytes(unknownFields); } @@ -2838,10 +2911,14 @@ public final class ProtoBuf { size += org.jetbrains.kotlin.protobuf.CodedOutputStream .computeMessageSize(9, arrayElement_.get(i)); } - if (((bitField0_ & 0x00000100) == 0x00000100)) { + if (((bitField0_ & 0x00000200) == 0x00000200)) { size += org.jetbrains.kotlin.protobuf.CodedOutputStream .computeInt32Size(10, flags_); } + if (((bitField0_ & 0x00000100) == 0x00000100)) { + size += org.jetbrains.kotlin.protobuf.CodedOutputStream + .computeInt32Size(11, arrayDimensionCount_); + } size += unknownFields.size(); memoizedSerializedSize = size; return size; @@ -2954,8 +3031,10 @@ public final class ProtoBuf { bitField0_ = (bitField0_ & ~0x00000080); arrayElement_ = java.util.Collections.emptyList(); bitField0_ = (bitField0_ & ~0x00000100); - flags_ = 0; + arrayDimensionCount_ = 0; bitField0_ = (bitField0_ & ~0x00000200); + flags_ = 0; + bitField0_ = (bitField0_ & ~0x00000400); return this; } @@ -3019,6 +3098,10 @@ public final class ProtoBuf { if (((from_bitField0_ & 0x00000200) == 0x00000200)) { to_bitField0_ |= 0x00000100; } + result.arrayDimensionCount_ = arrayDimensionCount_; + if (((from_bitField0_ & 0x00000400) == 0x00000400)) { + to_bitField0_ |= 0x00000200; + } result.flags_ = flags_; result.bitField0_ = to_bitField0_; return result; @@ -3060,6 +3143,9 @@ public final class ProtoBuf { } } + if (other.hasArrayDimensionCount()) { + setArrayDimensionCount(other.getArrayDimensionCount()); + } if (other.hasFlags()) { setFlags(other.getFlags()); } @@ -3555,6 +3641,78 @@ public final class ProtoBuf { return this; } + private int arrayDimensionCount_ ; + /** + * optional int32 array_dimension_count = 11 [default = 0]; + * + *
+           * If type = CLASS, the number of dimensions of the array of the class specified in class_id.
+           * E.g. if class_id = kotlin/String, this annotation argument value denotes:
+           * - String::class, if array_dimension_count = 0
+           * - Array<String>::class, if array_dimension_count = 1
+           * - Array<Array<String>>::class, if array_dimension_count = 2
+           * - etc.
+           * Other forms of array class literals are not supported by this format, see KT-26568
+           * 
+ */ + public boolean hasArrayDimensionCount() { + return ((bitField0_ & 0x00000200) == 0x00000200); + } + /** + * optional int32 array_dimension_count = 11 [default = 0]; + * + *
+           * If type = CLASS, the number of dimensions of the array of the class specified in class_id.
+           * E.g. if class_id = kotlin/String, this annotation argument value denotes:
+           * - String::class, if array_dimension_count = 0
+           * - Array<String>::class, if array_dimension_count = 1
+           * - Array<Array<String>>::class, if array_dimension_count = 2
+           * - etc.
+           * Other forms of array class literals are not supported by this format, see KT-26568
+           * 
+ */ + public int getArrayDimensionCount() { + return arrayDimensionCount_; + } + /** + * optional int32 array_dimension_count = 11 [default = 0]; + * + *
+           * If type = CLASS, the number of dimensions of the array of the class specified in class_id.
+           * E.g. if class_id = kotlin/String, this annotation argument value denotes:
+           * - String::class, if array_dimension_count = 0
+           * - Array<String>::class, if array_dimension_count = 1
+           * - Array<Array<String>>::class, if array_dimension_count = 2
+           * - etc.
+           * Other forms of array class literals are not supported by this format, see KT-26568
+           * 
+ */ + public Builder setArrayDimensionCount(int value) { + bitField0_ |= 0x00000200; + arrayDimensionCount_ = value; + + return this; + } + /** + * optional int32 array_dimension_count = 11 [default = 0]; + * + *
+           * If type = CLASS, the number of dimensions of the array of the class specified in class_id.
+           * E.g. if class_id = kotlin/String, this annotation argument value denotes:
+           * - String::class, if array_dimension_count = 0
+           * - Array<String>::class, if array_dimension_count = 1
+           * - Array<Array<String>>::class, if array_dimension_count = 2
+           * - etc.
+           * Other forms of array class literals are not supported by this format, see KT-26568
+           * 
+ */ + public Builder clearArrayDimensionCount() { + bitField0_ = (bitField0_ & ~0x00000200); + arrayDimensionCount_ = 0; + + return this; + } + private int flags_ ; /** * optional int32 flags = 10 [default = 0]; @@ -3564,7 +3722,7 @@ public final class ProtoBuf { * */ public boolean hasFlags() { - return ((bitField0_ & 0x00000200) == 0x00000200); + return ((bitField0_ & 0x00000400) == 0x00000400); } /** * optional int32 flags = 10 [default = 0]; @@ -3584,7 +3742,7 @@ public final class ProtoBuf { * */ public Builder setFlags(int value) { - bitField0_ |= 0x00000200; + bitField0_ |= 0x00000400; flags_ = value; return this; @@ -3597,7 +3755,7 @@ public final class ProtoBuf { * */ public Builder clearFlags() { - bitField0_ = (bitField0_ & ~0x00000200); + bitField0_ = (bitField0_ & ~0x00000400); flags_ = 0; return this; diff --git a/core/metadata/src/org/jetbrains/kotlin/metadata/builtins/BuiltInsBinaryVersion.kt b/core/metadata/src/org/jetbrains/kotlin/metadata/builtins/BuiltInsBinaryVersion.kt index 09f99f43e6d..a2d2ef95906 100644 --- a/core/metadata/src/org/jetbrains/kotlin/metadata/builtins/BuiltInsBinaryVersion.kt +++ b/core/metadata/src/org/jetbrains/kotlin/metadata/builtins/BuiltInsBinaryVersion.kt @@ -19,7 +19,7 @@ class BuiltInsBinaryVersion(vararg numbers: Int) : BinaryVersion(*numbers) { companion object { @JvmField - val INSTANCE = BuiltInsBinaryVersion(1, 0, 5) + val INSTANCE = BuiltInsBinaryVersion(1, 0, 6) @JvmField val INVALID_VERSION = BuiltInsBinaryVersion()