diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/serialization/JvmSerializerExtension.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/serialization/JvmSerializerExtension.java index 2d5fba77163..dadc3f4396b 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/serialization/JvmSerializerExtension.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/serialization/JvmSerializerExtension.java @@ -90,6 +90,15 @@ public class JvmSerializerExtension extends SerializerExtension { } } + @Override + public void serializeTypeParameter( + @NotNull TypeParameterDescriptor typeParameter, @NotNull ProtoBuf.TypeParameter.Builder proto + ) { + for (AnnotationDescriptor annotation : typeParameter.getAnnotations()) { + proto.addExtension(JvmProtoBuf.typeParameterAnnotation, annotationSerializer.serializeAnnotation(annotation)); + } + } + @Override public void serializeConstructor(@NotNull ConstructorDescriptor descriptor, @NotNull ProtoBuf.Constructor.Builder proto) { Method method = bindings.get(METHOD_FOR_FUNCTION, descriptor); diff --git a/compiler/serialization/src/org/jetbrains/kotlin/serialization/DescriptorSerializer.java b/compiler/serialization/src/org/jetbrains/kotlin/serialization/DescriptorSerializer.java index 1d426efb288..f193735b914 100644 --- a/compiler/serialization/src/org/jetbrains/kotlin/serialization/DescriptorSerializer.java +++ b/compiler/serialization/src/org/jetbrains/kotlin/serialization/DescriptorSerializer.java @@ -407,6 +407,7 @@ public class DescriptorSerializer { if (variance != builder.getVariance()) { builder.setVariance(variance); } + extension.serializeTypeParameter(typeParameter, builder); Set upperBounds = typeParameter.getUpperBounds(); if (upperBounds.size() == 1 && KotlinBuiltIns.isDefaultBound(CollectionsKt.single(upperBounds))) return builder; diff --git a/compiler/serialization/src/org/jetbrains/kotlin/serialization/SerializerExtension.java b/compiler/serialization/src/org/jetbrains/kotlin/serialization/SerializerExtension.java index b87be7769c2..3a5f57b7957 100644 --- a/compiler/serialization/src/org/jetbrains/kotlin/serialization/SerializerExtension.java +++ b/compiler/serialization/src/org/jetbrains/kotlin/serialization/SerializerExtension.java @@ -50,4 +50,7 @@ public abstract class SerializerExtension { public void serializeType(@NotNull JetType type, @NotNull ProtoBuf.Type.Builder proto) { } + + public void serializeTypeParameter(@NotNull TypeParameterDescriptor typeParameter, @NotNull ProtoBuf.TypeParameter.Builder proto) { + } } diff --git a/compiler/testData/loadJava/compiledKotlin/annotations/types/TypeParameterAnnotation.kt b/compiler/testData/loadJava/compiledKotlin/annotations/types/TypeParameterAnnotation.kt new file mode 100644 index 00000000000..f1d0326640b --- /dev/null +++ b/compiler/testData/loadJava/compiledKotlin/annotations/types/TypeParameterAnnotation.kt @@ -0,0 +1,10 @@ +// ALLOW_AST_ACCESS + +package test + +@Target(AnnotationTarget.TYPE_PARAMETER) +annotation class A + +class SimpleTypeParameterAnnotation { + fun <@A T> foo(x: T) {} +} diff --git a/compiler/testData/loadJava/compiledKotlin/annotations/types/TypeParameterAnnotation.txt b/compiler/testData/loadJava/compiledKotlin/annotations/types/TypeParameterAnnotation.txt new file mode 100644 index 00000000000..87bdd862f69 --- /dev/null +++ b/compiler/testData/loadJava/compiledKotlin/annotations/types/TypeParameterAnnotation.txt @@ -0,0 +1,10 @@ +package test + +@kotlin.annotation.Target(allowedTargets = {AnnotationTarget.TYPE_PARAMETER}) @kotlin.annotation.annotation() public final class A : kotlin.Annotation { + /*primary*/ public constructor A() +} + +public final class SimpleTypeParameterAnnotation { + /*primary*/ public constructor SimpleTypeParameterAnnotation() + public final fun foo(/*0*/ x: T): kotlin.Unit +} diff --git a/compiler/testData/loadJava/compiledKotlin/annotations/types/TypeParameterAnnotationWithArguments.kt b/compiler/testData/loadJava/compiledKotlin/annotations/types/TypeParameterAnnotationWithArguments.kt new file mode 100644 index 00000000000..bac3b2fe88a --- /dev/null +++ b/compiler/testData/loadJava/compiledKotlin/annotations/types/TypeParameterAnnotationWithArguments.kt @@ -0,0 +1,10 @@ +// ALLOW_AST_ACCESS + +package test + +@Target(AnnotationTarget.TYPE_PARAMETER) +annotation class A(val x: String, val y: Double) + +class SimpleTypeParameterAnnotation { + fun <@A("a", 1.0) T> foo(x: T) {} +} diff --git a/compiler/testData/loadJava/compiledKotlin/annotations/types/TypeParameterAnnotationWithArguments.txt b/compiler/testData/loadJava/compiledKotlin/annotations/types/TypeParameterAnnotationWithArguments.txt new file mode 100644 index 00000000000..d18a79a6808 --- /dev/null +++ b/compiler/testData/loadJava/compiledKotlin/annotations/types/TypeParameterAnnotationWithArguments.txt @@ -0,0 +1,14 @@ +package test + +@kotlin.annotation.Target(allowedTargets = {AnnotationTarget.TYPE_PARAMETER}) @kotlin.annotation.annotation() public final class A : kotlin.Annotation { + /*primary*/ public constructor A(/*0*/ x: kotlin.String, /*1*/ y: kotlin.Double) + public final val x: kotlin.String + public final fun (): kotlin.String + public final val y: kotlin.Double + public final fun (): kotlin.Double +} + +public final class SimpleTypeParameterAnnotation { + /*primary*/ public constructor SimpleTypeParameterAnnotation() + public final fun foo(/*0*/ x: T): kotlin.Unit +} diff --git a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/LoadJavaTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/LoadJavaTestGenerated.java index f8b924b98ee..47be4880763 100644 --- a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/LoadJavaTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/LoadJavaTestGenerated.java @@ -2378,6 +2378,18 @@ public class LoadJavaTestGenerated extends AbstractLoadJavaTest { String fileName = JetTestUtils.navigationMetadata("compiler/testData/loadJava/compiledKotlin/annotations/types/TypeAnnotationWithArguments.kt"); doTestCompiledKotlin(fileName); } + + @TestMetadata("TypeParameterAnnotation.kt") + public void testTypeParameterAnnotation() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/loadJava/compiledKotlin/annotations/types/TypeParameterAnnotation.kt"); + doTestCompiledKotlin(fileName); + } + + @TestMetadata("TypeParameterAnnotationWithArguments.kt") + public void testTypeParameterAnnotationWithArguments() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/loadJava/compiledKotlin/annotations/types/TypeParameterAnnotationWithArguments.kt"); + doTestCompiledKotlin(fileName); + } } @TestMetadata("compiler/testData/loadJava/compiledKotlin/annotations/withUseSiteTarget") diff --git a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/LoadKotlinWithTypeTableTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/LoadKotlinWithTypeTableTestGenerated.java index 44e26fa9876..298c97a2ccd 100644 --- a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/LoadKotlinWithTypeTableTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/LoadKotlinWithTypeTableTestGenerated.java @@ -467,6 +467,18 @@ public class LoadKotlinWithTypeTableTestGenerated extends AbstractLoadKotlinWith String fileName = JetTestUtils.navigationMetadata("compiler/testData/loadJava/compiledKotlin/annotations/types/TypeAnnotationWithArguments.kt"); doTest(fileName); } + + @TestMetadata("TypeParameterAnnotation.kt") + public void testTypeParameterAnnotation() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/loadJava/compiledKotlin/annotations/types/TypeParameterAnnotation.kt"); + doTest(fileName); + } + + @TestMetadata("TypeParameterAnnotationWithArguments.kt") + public void testTypeParameterAnnotationWithArguments() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/loadJava/compiledKotlin/annotations/types/TypeParameterAnnotationWithArguments.kt"); + doTest(fileName); + } } @TestMetadata("compiler/testData/loadJava/compiledKotlin/annotations/withUseSiteTarget") diff --git a/compiler/tests/org/jetbrains/kotlin/jvm/runtime/JvmRuntimeDescriptorLoaderTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/jvm/runtime/JvmRuntimeDescriptorLoaderTestGenerated.java index 101e2625dbb..17c469d2a74 100644 --- a/compiler/tests/org/jetbrains/kotlin/jvm/runtime/JvmRuntimeDescriptorLoaderTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/jvm/runtime/JvmRuntimeDescriptorLoaderTestGenerated.java @@ -469,6 +469,18 @@ public class JvmRuntimeDescriptorLoaderTestGenerated extends AbstractJvmRuntimeD String fileName = JetTestUtils.navigationMetadata("compiler/testData/loadJava/compiledKotlin/annotations/types/TypeAnnotationWithArguments.kt"); doTest(fileName); } + + @TestMetadata("TypeParameterAnnotation.kt") + public void testTypeParameterAnnotation() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/loadJava/compiledKotlin/annotations/types/TypeParameterAnnotation.kt"); + doTest(fileName); + } + + @TestMetadata("TypeParameterAnnotationWithArguments.kt") + public void testTypeParameterAnnotationWithArguments() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/loadJava/compiledKotlin/annotations/types/TypeParameterAnnotationWithArguments.kt"); + doTest(fileName); + } } @TestMetadata("compiler/testData/loadJava/compiledKotlin/annotations/withUseSiteTarget") diff --git a/compiler/tests/org/jetbrains/kotlin/serialization/DebugProtoBuf.java b/compiler/tests/org/jetbrains/kotlin/serialization/DebugProtoBuf.java index 5462b9f9707..5546cd421af 100644 --- a/compiler/tests/org/jetbrains/kotlin/serialization/DebugProtoBuf.java +++ b/compiler/tests/org/jetbrains/kotlin/serialization/DebugProtoBuf.java @@ -7699,8 +7699,9 @@ public final class DebugProtoBuf { // @@protoc_insertion_point(class_scope:org.jetbrains.kotlin.serialization.Type) } - public interface TypeParameterOrBuilder - extends com.google.protobuf.MessageOrBuilder { + public interface TypeParameterOrBuilder extends + com.google.protobuf.GeneratedMessage. + ExtendableMessageOrBuilder { // required int32 id = 1; /** @@ -7785,10 +7786,10 @@ public final class DebugProtoBuf { * Protobuf type {@code org.jetbrains.kotlin.serialization.TypeParameter} */ public static final class TypeParameter extends - com.google.protobuf.GeneratedMessage - implements TypeParameterOrBuilder { + com.google.protobuf.GeneratedMessage.ExtendableMessage< + TypeParameter> implements TypeParameterOrBuilder { // Use TypeParameter.newBuilder() to construct. - private TypeParameter(com.google.protobuf.GeneratedMessage.Builder builder) { + private TypeParameter(com.google.protobuf.GeneratedMessage.ExtendableBuilder builder) { super(builder); this.unknownFields = builder.getUnknownFields(); } @@ -8174,6 +8175,10 @@ public final class DebugProtoBuf { return false; } } + if (!extensionsAreInitialized()) { + memoizedIsInitialized = 0; + return false; + } memoizedIsInitialized = 1; return true; } @@ -8181,6 +8186,9 @@ public final class DebugProtoBuf { public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException { getSerializedSize(); + com.google.protobuf.GeneratedMessage + .ExtendableMessage.ExtensionWriter extensionWriter = + newExtensionWriter(); if (((bitField0_ & 0x00000001) == 0x00000001)) { output.writeInt32(1, id_); } @@ -8199,6 +8207,7 @@ public final class DebugProtoBuf { for (int i = 0; i < upperBoundId_.size(); i++) { output.writeInt32(6, upperBoundId_.get(i)); } + extensionWriter.writeUntil(1000, output); getUnknownFields().writeTo(output); } @@ -8237,6 +8246,7 @@ public final class DebugProtoBuf { size += dataSize; size += 1 * getUpperBoundIdList().size(); } + size += extensionsSerializedSize(); size += getUnknownFields().getSerializedSize(); memoizedSerializedSize = size; return size; @@ -8319,8 +8329,8 @@ public final class DebugProtoBuf { * Protobuf type {@code org.jetbrains.kotlin.serialization.TypeParameter} */ public static final class Builder extends - com.google.protobuf.GeneratedMessage.Builder - implements org.jetbrains.kotlin.serialization.DebugProtoBuf.TypeParameterOrBuilder { + com.google.protobuf.GeneratedMessage.ExtendableBuilder< + org.jetbrains.kotlin.serialization.DebugProtoBuf.TypeParameter, Builder> implements org.jetbrains.kotlin.serialization.DebugProtoBuf.TypeParameterOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return org.jetbrains.kotlin.serialization.DebugProtoBuf.internal_static_org_jetbrains_kotlin_serialization_TypeParameter_descriptor; @@ -8492,6 +8502,7 @@ public final class DebugProtoBuf { } onChanged(); } + this.mergeExtensionFields(other); this.mergeUnknownFields(other.getUnknownFields()); return this; } @@ -8511,6 +8522,10 @@ public final class DebugProtoBuf { return false; } } + if (!extensionsAreInitialized()) { + + return false; + } return true; } @@ -20621,78 +20636,78 @@ public final class DebugProtoBuf { "gument.Projection:\003INV\0226\n\004type\030\002 \001(\0132(.o" + "rg.jetbrains.kotlin.serialization.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\"\227\002\n\rTyp" + + "\003OUT\020\001\022\007\n\003INV\020\002\022\010\n\004STAR\020\003*\005\010d\020\310\001\"\236\002\n\rTyp" + "eParameter\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\022Q\n\010variance\030\004" + " \001(\0162:.org.jetbrains.kotlin.serializatio" + "n.TypeParameter.Variance:\003INV\022=\n\013upper_b", "ound\030\005 \003(\0132(.org.jetbrains.kotlin.serial" + "ization.Type\022\026\n\016upper_bound_id\030\006 \003(\005\"$\n\010" + - "Variance\022\006\n\002IN\020\000\022\007\n\003OUT\020\001\022\007\n\003INV\020\002\"\300\005\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\022I\n\016type_parameter\030\005 \003(\01321.org.jetbrai" + - "ns.kotlin.serialization.TypeParameter\022;\n" + - "\tsupertype\030\006 \003(\0132(.org.jetbrains.kotlin." + - "serialization.Type\022\030\n\014supertype_id\030\002 \003(\005" + - "B\002\020\001\022!\n\021nested_class_name\030\007 \003(\005B\006\020\001\210\265\030\001\022", - "D\n\013constructor\030\010 \003(\0132/.org.jetbrains.kot" + - "lin.serialization.Constructor\022>\n\010functio" + - "n\030\t \003(\0132,.org.jetbrains.kotlin.serializa" + - "tion.Function\022>\n\010property\030\n \003(\0132,.org.je" + - "tbrains.kotlin.serialization.Property\022\032\n" + - "\nenum_entry\030\014 \003(\005B\006\020\001\210\265\030\001\022A\n\ntype_table\030" + - "\036 \001(\0132-.org.jetbrains.kotlin.serializati" + - "on.TypeTable\"x\n\004Kind\022\t\n\005CLASS\020\000\022\r\n\tINTER" + - "FACE\020\001\022\016\n\nENUM_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\020COMP", - "ANION_OBJECT\020\006*\005\010d\020\310\001\"\323\001\n\007Package\022>\n\010fun" + - "ction\030\003 \003(\0132,.org.jetbrains.kotlin.seria" + - "lization.Function\022>\n\010property\030\004 \003(\0132,.or" + - "g.jetbrains.kotlin.serialization.Propert" + - "y\022A\n\ntype_table\030\036 \001(\0132-.org.jetbrains.ko" + - "tlin.serialization.TypeTable*\005\010d\020\310\001\"_\n\tT" + - "ypeTable\0226\n\004type\030\001 \003(\0132(.org.jetbrains.k" + - "otlin.serialization.Type\022\032\n\016first_nullab" + - "le\030\002 \001(\005:\002-1\"s\n\013Constructor\022\020\n\005flags\030\001 \001" + - "(\005:\0016\022K\n\017value_parameter\030\002 \003(\01322.org.jet", - "brains.kotlin.serialization.ValueParamet" + - "er*\005\010d\020\310\001\"\304\003\n\010Function\022\020\n\005flags\030\001 \001(\005:\0016" + - "\022\022\n\004name\030\002 \002(\005B\004\210\265\030\001\022=\n\013return_type\030\003 \001(" + - "\0132(.org.jetbrains.kotlin.serialization.T" + - "ype\022\026\n\016return_type_id\030\007 \001(\005\022I\n\016type_para" + - "meter\030\004 \003(\01321.org.jetbrains.kotlin.seria" + - "lization.TypeParameter\022?\n\rreceiver_type\030" + - "\005 \001(\0132(.org.jetbrains.kotlin.serializati" + - "on.Type\022\030\n\020receiver_type_id\030\010 \001(\005\022K\n\017val" + - "ue_parameter\030\006 \003(\01322.org.jetbrains.kotli", - "n.serialization.ValueParameter\022A\n\ntype_t" + - "able\030\036 \001(\0132-.org.jetbrains.kotlin.serial" + - "ization.TypeTable*\005\010d\020\310\001\"\266\003\n\010Property\022\022\n" + - "\005flags\030\001 \001(\005:\003262\022\022\n\004name\030\002 \002(\005B\004\210\265\030\001\022=\n" + - "\013return_type\030\003 \001(\0132(.org.jetbrains.kotli" + - "n.serialization.Type\022\026\n\016return_type_id\030\t" + - " \001(\005\022I\n\016type_parameter\030\004 \003(\01321.org.jetbr" + - "ains.kotlin.serialization.TypeParameter\022" + - "?\n\rreceiver_type\030\005 \001(\0132(.org.jetbrains.k" + - "otlin.serialization.Type\022\030\n\020receiver_typ", - "e_id\030\n \001(\005\022R\n\026setter_value_parameter\030\006 \001" + - "(\01322.org.jetbrains.kotlin.serialization." + - "ValueParameter\022\024\n\014getter_flags\030\007 \001(\005\022\024\n\014" + - "setter_flags\030\010 \001(\005*\005\010d\020\310\001\"\355\001\n\016ValueParam" + - "eter\022\020\n\005flags\030\001 \001(\005:\0010\022\022\n\004name\030\002 \002(\005B\004\210\265" + - "\030\001\0226\n\004type\030\003 \001(\0132(.org.jetbrains.kotlin." + - "serialization.Type\022\017\n\007type_id\030\005 \001(\005\022E\n\023v" + - "ararg_element_type\030\004 \001(\0132(.org.jetbrains" + - ".kotlin.serialization.Type\022\036\n\026vararg_ele" + - "ment_type_id\030\006 \001(\005*\005\010d\020\310\001*9\n\010Modality\022\t\n", - "\005FINAL\020\000\022\010\n\004OPEN\020\001\022\014\n\010ABSTRACT\020\002\022\n\n\006SEAL" + - "ED\020\003*b\n\nVisibility\022\014\n\010INTERNAL\020\000\022\013\n\007PRIV" + - "ATE\020\001\022\r\n\tPROTECTED\020\002\022\n\n\006PUBLIC\020\003\022\023\n\017PRIV" + - "ATE_TO_THIS\020\004\022\t\n\005LOCAL\020\005*Q\n\nMemberKind\022\017" + - "\n\013DECLARATION\020\000\022\021\n\rFAKE_OVERRIDE\020\001\022\016\n\nDE" + - "LEGATION\020\002\022\017\n\013SYNTHESIZED\020\003B\022B\rDebugProt" + - "oBuf\210\001\000" + "Variance\022\006\n\002IN\020\000\022\007\n\003OUT\020\001\022\007\n\003INV\020\002*\005\010d\020\350" + + "\007\"\300\005\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\022I\n\016type_parameter\030\005 \003(\01321.org." + + "jetbrains.kotlin.serialization.TypeParam" + + "eter\022;\n\tsupertype\030\006 \003(\0132(.org.jetbrains." + + "kotlin.serialization.Type\022\030\n\014supertype_i" + + "d\030\002 \003(\005B\002\020\001\022!\n\021nested_class_name\030\007 \003(\005B\006", + "\020\001\210\265\030\001\022D\n\013constructor\030\010 \003(\0132/.org.jetbra" + + "ins.kotlin.serialization.Constructor\022>\n\010" + + "function\030\t \003(\0132,.org.jetbrains.kotlin.se" + + "rialization.Function\022>\n\010property\030\n \003(\0132," + + ".org.jetbrains.kotlin.serialization.Prop" + + "erty\022\032\n\nenum_entry\030\014 \003(\005B\006\020\001\210\265\030\001\022A\n\ntype" + + "_table\030\036 \001(\0132-.org.jetbrains.kotlin.seri" + + "alization.TypeTable\"x\n\004Kind\022\t\n\005CLASS\020\000\022\r" + + "\n\tINTERFACE\020\001\022\016\n\nENUM_CLASS\020\002\022\016\n\nENUM_EN" + + "TRY\020\003\022\024\n\020ANNOTATION_CLASS\020\004\022\n\n\006OBJECT\020\005\022", + "\024\n\020COMPANION_OBJECT\020\006*\005\010d\020\310\001\"\323\001\n\007Package" + + "\022>\n\010function\030\003 \003(\0132,.org.jetbrains.kotli" + + "n.serialization.Function\022>\n\010property\030\004 \003" + + "(\0132,.org.jetbrains.kotlin.serialization." + + "Property\022A\n\ntype_table\030\036 \001(\0132-.org.jetbr" + + "ains.kotlin.serialization.TypeTable*\005\010d\020" + + "\310\001\"_\n\tTypeTable\0226\n\004type\030\001 \003(\0132(.org.jetb" + + "rains.kotlin.serialization.Type\022\032\n\016first" + + "_nullable\030\002 \001(\005:\002-1\"s\n\013Constructor\022\020\n\005fl" + + "ags\030\001 \001(\005:\0016\022K\n\017value_parameter\030\002 \003(\01322.", + "org.jetbrains.kotlin.serialization.Value" + + "Parameter*\005\010d\020\310\001\"\304\003\n\010Function\022\020\n\005flags\030\001" + + " \001(\005:\0016\022\022\n\004name\030\002 \002(\005B\004\210\265\030\001\022=\n\013return_ty" + + "pe\030\003 \001(\0132(.org.jetbrains.kotlin.serializ" + + "ation.Type\022\026\n\016return_type_id\030\007 \001(\005\022I\n\016ty" + + "pe_parameter\030\004 \003(\01321.org.jetbrains.kotli" + + "n.serialization.TypeParameter\022?\n\rreceive" + + "r_type\030\005 \001(\0132(.org.jetbrains.kotlin.seri" + + "alization.Type\022\030\n\020receiver_type_id\030\010 \001(\005" + + "\022K\n\017value_parameter\030\006 \003(\01322.org.jetbrain", + "s.kotlin.serialization.ValueParameter\022A\n" + + "\ntype_table\030\036 \001(\0132-.org.jetbrains.kotlin" + + ".serialization.TypeTable*\005\010d\020\310\001\"\266\003\n\010Prop" + + "erty\022\022\n\005flags\030\001 \001(\005:\003262\022\022\n\004name\030\002 \002(\005B\004" + + "\210\265\030\001\022=\n\013return_type\030\003 \001(\0132(.org.jetbrain" + + "s.kotlin.serialization.Type\022\026\n\016return_ty" + + "pe_id\030\t \001(\005\022I\n\016type_parameter\030\004 \003(\01321.or" + + "g.jetbrains.kotlin.serialization.TypePar" + + "ameter\022?\n\rreceiver_type\030\005 \001(\0132(.org.jetb" + + "rains.kotlin.serialization.Type\022\030\n\020recei", + "ver_type_id\030\n \001(\005\022R\n\026setter_value_parame" + + "ter\030\006 \001(\01322.org.jetbrains.kotlin.seriali" + + "zation.ValueParameter\022\024\n\014getter_flags\030\007 " + + "\001(\005\022\024\n\014setter_flags\030\010 \001(\005*\005\010d\020\310\001\"\355\001\n\016Val" + + "ueParameter\022\020\n\005flags\030\001 \001(\005:\0010\022\022\n\004name\030\002 " + + "\002(\005B\004\210\265\030\001\0226\n\004type\030\003 \001(\0132(.org.jetbrains." + + "kotlin.serialization.Type\022\017\n\007type_id\030\005 \001" + + "(\005\022E\n\023vararg_element_type\030\004 \001(\0132(.org.je" + + "tbrains.kotlin.serialization.Type\022\036\n\026var" + + "arg_element_type_id\030\006 \001(\005*\005\010d\020\310\001*9\n\010Moda", + "lity\022\t\n\005FINAL\020\000\022\010\n\004OPEN\020\001\022\014\n\010ABSTRACT\020\002\022" + + "\n\n\006SEALED\020\003*b\n\nVisibility\022\014\n\010INTERNAL\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\nMembe" + + "rKind\022\017\n\013DECLARATION\020\000\022\021\n\rFAKE_OVERRIDE\020" + + "\001\022\016\n\nDELEGATION\020\002\022\017\n\013SYNTHESIZED\020\003B\022B\rDe" + + "bugProtoBuf\210\001\000" }; com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() { diff --git a/compiler/tests/org/jetbrains/kotlin/serialization/builtins/DebugBuiltInsProtoBuf.java b/compiler/tests/org/jetbrains/kotlin/serialization/builtins/DebugBuiltInsProtoBuf.java index 4634d80048c..ba0a46c343e 100644 --- a/compiler/tests/org/jetbrains/kotlin/serialization/builtins/DebugBuiltInsProtoBuf.java +++ b/compiler/tests/org/jetbrains/kotlin/serialization/builtins/DebugBuiltInsProtoBuf.java @@ -15,6 +15,7 @@ public final class DebugBuiltInsProtoBuf { registry.add(org.jetbrains.kotlin.serialization.builtins.DebugBuiltInsProtoBuf.compileTimeValue); registry.add(org.jetbrains.kotlin.serialization.builtins.DebugBuiltInsProtoBuf.parameterAnnotation); registry.add(org.jetbrains.kotlin.serialization.builtins.DebugBuiltInsProtoBuf.typeAnnotation); + registry.add(org.jetbrains.kotlin.serialization.builtins.DebugBuiltInsProtoBuf.typeParameterAnnotation); } public static final int CLASS_NAME_FIELD_NUMBER = 150; /** @@ -104,6 +105,17 @@ public final class DebugBuiltInsProtoBuf { .newFileScopedGeneratedExtension( org.jetbrains.kotlin.serialization.DebugProtoBuf.Annotation.class, org.jetbrains.kotlin.serialization.DebugProtoBuf.Annotation.getDefaultInstance()); + public static final int TYPE_PARAMETER_ANNOTATION_FIELD_NUMBER = 150; + /** + * extend .org.jetbrains.kotlin.serialization.TypeParameter { ... } + */ + public static final + com.google.protobuf.GeneratedMessage.GeneratedExtension< + org.jetbrains.kotlin.serialization.DebugProtoBuf.TypeParameter, + java.util.List> typeParameterAnnotation = com.google.protobuf.GeneratedMessage + .newFileScopedGeneratedExtension( + org.jetbrains.kotlin.serialization.DebugProtoBuf.Annotation.class, + org.jetbrains.kotlin.serialization.DebugProtoBuf.Annotation.getDefaultInstance()); public static com.google.protobuf.Descriptors.FileDescriptor getDescriptor() { @@ -140,8 +152,11 @@ public final class DebugBuiltInsProtoBuf { "alization.Annotation:r\n\017type_annotation\022" + "(.org.jetbrains.kotlin.serialization.Typ" + "e\030\226\001 \003(\0132..org.jetbrains.kotlin.serializ" + - "ation.AnnotationB\027B\025DebugBuiltInsProtoBu" + - "f" + "ation.Annotation:\205\001\n\031type_parameter_anno" + + "tation\0221.org.jetbrains.kotlin.serializat" + + "ion.TypeParameter\030\226\001 \003(\0132..org.jetbrains", + ".kotlin.serialization.AnnotationB\027B\025Debu" + + "gBuiltInsProtoBuf" }; com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() { @@ -156,6 +171,7 @@ public final class DebugBuiltInsProtoBuf { compileTimeValue.internalInit(descriptor.getExtensions().get(5)); parameterAnnotation.internalInit(descriptor.getExtensions().get(6)); typeAnnotation.internalInit(descriptor.getExtensions().get(7)); + typeParameterAnnotation.internalInit(descriptor.getExtensions().get(8)); return null; } }; diff --git a/compiler/tests/org/jetbrains/kotlin/serialization/js/DebugJsProtoBuf.java b/compiler/tests/org/jetbrains/kotlin/serialization/js/DebugJsProtoBuf.java index 6b278b96505..d34c6540438 100644 --- a/compiler/tests/org/jetbrains/kotlin/serialization/js/DebugJsProtoBuf.java +++ b/compiler/tests/org/jetbrains/kotlin/serialization/js/DebugJsProtoBuf.java @@ -14,6 +14,7 @@ public final class DebugJsProtoBuf { registry.add(org.jetbrains.kotlin.serialization.js.DebugJsProtoBuf.compileTimeValue); registry.add(org.jetbrains.kotlin.serialization.js.DebugJsProtoBuf.parameterAnnotation); registry.add(org.jetbrains.kotlin.serialization.js.DebugJsProtoBuf.typeAnnotation); + registry.add(org.jetbrains.kotlin.serialization.js.DebugJsProtoBuf.typeParameterAnnotation); } public interface ClassesOrBuilder extends com.google.protobuf.MessageOrBuilder { @@ -1880,6 +1881,17 @@ public final class DebugJsProtoBuf { .newFileScopedGeneratedExtension( org.jetbrains.kotlin.serialization.DebugProtoBuf.Annotation.class, org.jetbrains.kotlin.serialization.DebugProtoBuf.Annotation.getDefaultInstance()); + public static final int TYPE_PARAMETER_ANNOTATION_FIELD_NUMBER = 130; + /** + * extend .org.jetbrains.kotlin.serialization.TypeParameter { ... } + */ + public static final + com.google.protobuf.GeneratedMessage.GeneratedExtension< + org.jetbrains.kotlin.serialization.DebugProtoBuf.TypeParameter, + java.util.List> typeParameterAnnotation = com.google.protobuf.GeneratedMessage + .newFileScopedGeneratedExtension( + org.jetbrains.kotlin.serialization.DebugProtoBuf.Annotation.class, + org.jetbrains.kotlin.serialization.DebugProtoBuf.Annotation.getDefaultInstance()); private static com.google.protobuf.Descriptors.Descriptor internal_static_org_jetbrains_kotlin_serialization_js_Classes_descriptor; private static @@ -1933,7 +1945,11 @@ public final class DebugJsProtoBuf { "zation.Annotation:r\n\017type_annotation\022(.o" + "rg.jetbrains.kotlin.serialization.Type\030\202" + "\001 \003(\0132..org.jetbrains.kotlin.serializati" + - "on.AnnotationB\021B\017DebugJsProtoBuf" + "on.Annotation:\205\001\n\031type_parameter_annotat", + "ion\0221.org.jetbrains.kotlin.serialization" + + ".TypeParameter\030\202\001 \003(\0132..org.jetbrains.ko" + + "tlin.serialization.AnnotationB\021B\017DebugJs" + + "ProtoBuf" }; com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() { @@ -1965,6 +1981,7 @@ public final class DebugJsProtoBuf { compileTimeValue.internalInit(descriptor.getExtensions().get(4)); parameterAnnotation.internalInit(descriptor.getExtensions().get(5)); typeAnnotation.internalInit(descriptor.getExtensions().get(6)); + typeParameterAnnotation.internalInit(descriptor.getExtensions().get(7)); return null; } }; diff --git a/compiler/tests/org/jetbrains/kotlin/serialization/jvm/DebugJvmProtoBuf.java b/compiler/tests/org/jetbrains/kotlin/serialization/jvm/DebugJvmProtoBuf.java index 57ae5f484b9..e03c41939fa 100644 --- a/compiler/tests/org/jetbrains/kotlin/serialization/jvm/DebugJvmProtoBuf.java +++ b/compiler/tests/org/jetbrains/kotlin/serialization/jvm/DebugJvmProtoBuf.java @@ -14,6 +14,7 @@ public final class DebugJvmProtoBuf { registry.add(org.jetbrains.kotlin.serialization.jvm.DebugJvmProtoBuf.propertyImplClassName); registry.add(org.jetbrains.kotlin.serialization.jvm.DebugJvmProtoBuf.typeAnnotation); registry.add(org.jetbrains.kotlin.serialization.jvm.DebugJvmProtoBuf.isRaw); + registry.add(org.jetbrains.kotlin.serialization.jvm.DebugJvmProtoBuf.typeParameterAnnotation); registry.add(org.jetbrains.kotlin.serialization.jvm.DebugJvmProtoBuf.index); registry.add(org.jetbrains.kotlin.serialization.jvm.DebugJvmProtoBuf.classAnnotation); } @@ -4724,6 +4725,17 @@ public final class DebugJvmProtoBuf { .newFileScopedGeneratedExtension( java.lang.Boolean.class, null); + public static final int TYPE_PARAMETER_ANNOTATION_FIELD_NUMBER = 100; + /** + * extend .org.jetbrains.kotlin.serialization.TypeParameter { ... } + */ + public static final + com.google.protobuf.GeneratedMessage.GeneratedExtension< + org.jetbrains.kotlin.serialization.DebugProtoBuf.TypeParameter, + java.util.List> typeParameterAnnotation = com.google.protobuf.GeneratedMessage + .newFileScopedGeneratedExtension( + org.jetbrains.kotlin.serialization.DebugProtoBuf.Annotation.class, + org.jetbrains.kotlin.serialization.DebugProtoBuf.Annotation.getDefaultInstance()); public static final int INDEX_FIELD_NUMBER = 100; /** * extend .org.jetbrains.kotlin.serialization.ValueParameter { ... } @@ -4826,12 +4838,16 @@ public final class DebugJvmProtoBuf { "(.org.jetbrains.kotlin.serialization.Typ" + "e\030d \003(\0132..org.jetbrains.kotlin.serializa" + "tion.Annotation:8\n\006is_raw\022(.org.jetbrain" + - "s.kotlin.serialization.Type\030e \001(\010:A\n\005ind" + - "ex\0222.org.jetbrains.kotlin.serialization." + - "ValueParameter\030d \001(\005:s\n\020class_annotation" + - "\022).org.jetbrains.kotlin.serialization.Cl", - "ass\030d \003(\0132..org.jetbrains.kotlin.seriali" + - "zation.AnnotationB\022B\020DebugJvmProtoBuf" + "s.kotlin.serialization.Type\030e \001(\010:\204\001\n\031ty" + + "pe_parameter_annotation\0221.org.jetbrains." + + "kotlin.serialization.TypeParameter\030d \003(\013" + + "2..org.jetbrains.kotlin.serialization.An", + "notation:A\n\005index\0222.org.jetbrains.kotlin" + + ".serialization.ValueParameter\030d \001(\005:s\n\020c" + + "lass_annotation\022).org.jetbrains.kotlin.s" + + "erialization.Class\030d \003(\0132..org.jetbrains" + + ".kotlin.serialization.AnnotationB\022B\020Debu" + + "gJvmProtoBuf" }; com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() { @@ -4875,8 +4891,9 @@ public final class DebugJvmProtoBuf { propertyImplClassName.internalInit(descriptor.getExtensions().get(4)); typeAnnotation.internalInit(descriptor.getExtensions().get(5)); isRaw.internalInit(descriptor.getExtensions().get(6)); - index.internalInit(descriptor.getExtensions().get(7)); - classAnnotation.internalInit(descriptor.getExtensions().get(8)); + typeParameterAnnotation.internalInit(descriptor.getExtensions().get(7)); + index.internalInit(descriptor.getExtensions().get(8)); + classAnnotation.internalInit(descriptor.getExtensions().get(9)); com.google.protobuf.ExtensionRegistry registry = com.google.protobuf.ExtensionRegistry.newInstance(); registry.add(org.jetbrains.kotlin.serialization.DebugExtOptionsProtoBuf.stringIdInTable); diff --git a/core/descriptor.loader.java/src/jvm_descriptors.proto b/core/descriptor.loader.java/src/jvm_descriptors.proto index d42a34eea7b..e19ac8f4ffa 100644 --- a/core/descriptor.loader.java/src/jvm_descriptors.proto +++ b/core/descriptor.loader.java/src/jvm_descriptors.proto @@ -119,6 +119,10 @@ extend Type { optional bool is_raw = 101; } +extend TypeParameter { + repeated Annotation type_parameter_annotation = 100; +} + extend ValueParameter { // Index of the corresponding parameter of this method in JVM (counting receiver parameters, enum constructor synthetic parameters, etc.) optional int32 index = 100; diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/AbstractBinaryClassAnnotationAndConstantLoader.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/AbstractBinaryClassAnnotationAndConstantLoader.kt index ca8986cdbe1..f7695f199f5 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/AbstractBinaryClassAnnotationAndConstantLoader.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/AbstractBinaryClassAnnotationAndConstantLoader.kt @@ -166,6 +166,10 @@ public abstract class AbstractBinaryClassAnnotationAndConstantLoader { + return typeParameter.getExtension(JvmProtoBuf.typeParameterAnnotation).map { loadTypeAnnotation(it, nameResolver) } + } + override fun loadPropertyConstant(container: ProtoContainer, proto: ProtoBuf.Property, expectedType: JetType): C? { val nameResolver = container.nameResolver val signature = getCallableSignature(proto, nameResolver, container.typeTable, AnnotatedCallableKind.PROPERTY) ?: return null diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/serialization/jvm/JvmProtoBuf.java b/core/descriptor.loader.java/src/org/jetbrains/kotlin/serialization/jvm/JvmProtoBuf.java index 51bf8907425..19ff54b545b 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/serialization/jvm/JvmProtoBuf.java +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/serialization/jvm/JvmProtoBuf.java @@ -14,6 +14,7 @@ public final class JvmProtoBuf { registry.add(org.jetbrains.kotlin.serialization.jvm.JvmProtoBuf.propertyImplClassName); registry.add(org.jetbrains.kotlin.serialization.jvm.JvmProtoBuf.typeAnnotation); registry.add(org.jetbrains.kotlin.serialization.jvm.JvmProtoBuf.isRaw); + registry.add(org.jetbrains.kotlin.serialization.jvm.JvmProtoBuf.typeParameterAnnotation); registry.add(org.jetbrains.kotlin.serialization.jvm.JvmProtoBuf.index); registry.add(org.jetbrains.kotlin.serialization.jvm.JvmProtoBuf.classAnnotation); } @@ -3939,6 +3940,21 @@ public final class JvmProtoBuf { null, 101, com.google.protobuf.WireFormat.FieldType.BOOL); + public static final int TYPE_PARAMETER_ANNOTATION_FIELD_NUMBER = 100; + /** + * extend .org.jetbrains.kotlin.serialization.TypeParameter { ... } + */ + public static final + com.google.protobuf.GeneratedMessageLite.GeneratedExtension< + org.jetbrains.kotlin.serialization.ProtoBuf.TypeParameter, + java.util.List> typeParameterAnnotation = com.google.protobuf.GeneratedMessageLite + .newRepeatedGeneratedExtension( + org.jetbrains.kotlin.serialization.ProtoBuf.TypeParameter.getDefaultInstance(), + org.jetbrains.kotlin.serialization.ProtoBuf.Annotation.getDefaultInstance(), + null, + 100, + com.google.protobuf.WireFormat.FieldType.MESSAGE, + false); public static final int INDEX_FIELD_NUMBER = 100; /** * extend .org.jetbrains.kotlin.serialization.ValueParameter { ... } diff --git a/core/descriptors/src/org/jetbrains/kotlin/builtins/BuiltInsAnnotationAndConstantLoader.kt b/core/descriptors/src/org/jetbrains/kotlin/builtins/BuiltInsAnnotationAndConstantLoader.kt index aae537f13fa..2df05fe371f 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/builtins/BuiltInsAnnotationAndConstantLoader.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/builtins/BuiltInsAnnotationAndConstantLoader.kt @@ -74,6 +74,10 @@ class BuiltInsAnnotationAndConstantLoader( return proto.getExtension(BuiltInsProtoBuf.typeAnnotation).orEmpty().map { deserializer.deserializeAnnotation(it, nameResolver) } } + override fun loadTypeParameterAnnotations(proto: ProtoBuf.TypeParameter, nameResolver: NameResolver): List { + return proto.getExtension(BuiltInsProtoBuf.typeParameterAnnotation).orEmpty().map { deserializer.deserializeAnnotation(it, nameResolver) } + } + override fun loadPropertyConstant( container: ProtoContainer, proto: ProtoBuf.Property, diff --git a/core/deserialization/src/builtins.proto b/core/deserialization/src/builtins.proto index cb996cc043a..a1c9374c69b 100644 --- a/core/deserialization/src/builtins.proto +++ b/core/deserialization/src/builtins.proto @@ -50,3 +50,7 @@ extend ValueParameter { extend Type { repeated Annotation type_annotation = 150; } + +extend TypeParameter { + repeated Annotation type_parameter_annotation = 150; +} diff --git a/core/deserialization/src/descriptors.proto b/core/deserialization/src/descriptors.proto index f8be78a0aac..cd0666f32e7 100644 --- a/core/deserialization/src/descriptors.proto +++ b/core/deserialization/src/descriptors.proto @@ -148,6 +148,8 @@ message TypeParameter { repeated Type upper_bound = 5; repeated int32 upper_bound_id = 6; + + extensions 100 to 999; } message Class { diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/ProtoBuf.java b/core/deserialization/src/org/jetbrains/kotlin/serialization/ProtoBuf.java index 21d5c670d78..2b70abb4c12 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/ProtoBuf.java +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/ProtoBuf.java @@ -6112,8 +6112,9 @@ public final class ProtoBuf { // @@protoc_insertion_point(class_scope:org.jetbrains.kotlin.serialization.Type) } - public interface TypeParameterOrBuilder - extends com.google.protobuf.MessageLiteOrBuilder { + public interface TypeParameterOrBuilder extends + com.google.protobuf.GeneratedMessageLite. + ExtendableMessageOrBuilder { // required int32 id = 1; /** @@ -6188,10 +6189,10 @@ public final class ProtoBuf { * Protobuf type {@code org.jetbrains.kotlin.serialization.TypeParameter} */ public static final class TypeParameter extends - com.google.protobuf.GeneratedMessageLite - implements TypeParameterOrBuilder { + com.google.protobuf.GeneratedMessageLite.ExtendableMessage< + TypeParameter> implements TypeParameterOrBuilder { // Use TypeParameter.newBuilder() to construct. - private TypeParameter(com.google.protobuf.GeneratedMessageLite.Builder builder) { + private TypeParameter(com.google.protobuf.GeneratedMessageLite.ExtendableBuilder builder) { super(builder); } @@ -6528,6 +6529,10 @@ public final class ProtoBuf { return false; } } + if (!extensionsAreInitialized()) { + memoizedIsInitialized = 0; + return false; + } memoizedIsInitialized = 1; return true; } @@ -6535,6 +6540,9 @@ public final class ProtoBuf { public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException { getSerializedSize(); + com.google.protobuf.GeneratedMessageLite + .ExtendableMessage.ExtensionWriter extensionWriter = + newExtensionWriter(); if (((bitField0_ & 0x00000001) == 0x00000001)) { output.writeInt32(1, id_); } @@ -6553,6 +6561,7 @@ public final class ProtoBuf { for (int i = 0; i < upperBoundId_.size(); i++) { output.writeInt32(6, upperBoundId_.get(i)); } + extensionWriter.writeUntil(1000, output); } private int memoizedSerializedSize = -1; @@ -6590,6 +6599,7 @@ public final class ProtoBuf { size += dataSize; size += 1 * getUpperBoundIdList().size(); } + size += extensionsSerializedSize(); memoizedSerializedSize = size; return size; } @@ -6665,9 +6675,8 @@ public final class ProtoBuf { * Protobuf type {@code org.jetbrains.kotlin.serialization.TypeParameter} */ public static final class Builder extends - com.google.protobuf.GeneratedMessageLite.Builder< - org.jetbrains.kotlin.serialization.ProtoBuf.TypeParameter, Builder> - implements org.jetbrains.kotlin.serialization.ProtoBuf.TypeParameterOrBuilder { + com.google.protobuf.GeneratedMessageLite.ExtendableBuilder< + org.jetbrains.kotlin.serialization.ProtoBuf.TypeParameter, Builder> implements org.jetbrains.kotlin.serialization.ProtoBuf.TypeParameterOrBuilder { // Construct using org.jetbrains.kotlin.serialization.ProtoBuf.TypeParameter.newBuilder() private Builder() { maybeForceBuilderInitialization(); @@ -6780,6 +6789,7 @@ public final class ProtoBuf { } } + this.mergeExtensionFields(other); return this; } @@ -6798,6 +6808,10 @@ public final class ProtoBuf { return false; } } + if (!extensionsAreInitialized()) { + + return false; + } return true; } diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/builtins/BuiltInsProtoBuf.java b/core/deserialization/src/org/jetbrains/kotlin/serialization/builtins/BuiltInsProtoBuf.java index 996de331a37..e1990e30fca 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/builtins/BuiltInsProtoBuf.java +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/builtins/BuiltInsProtoBuf.java @@ -15,6 +15,7 @@ public final class BuiltInsProtoBuf { registry.add(org.jetbrains.kotlin.serialization.builtins.BuiltInsProtoBuf.compileTimeValue); registry.add(org.jetbrains.kotlin.serialization.builtins.BuiltInsProtoBuf.parameterAnnotation); registry.add(org.jetbrains.kotlin.serialization.builtins.BuiltInsProtoBuf.typeAnnotation); + registry.add(org.jetbrains.kotlin.serialization.builtins.BuiltInsProtoBuf.typeParameterAnnotation); } public static final int CLASS_NAME_FIELD_NUMBER = 150; /** @@ -136,6 +137,21 @@ public final class BuiltInsProtoBuf { 150, com.google.protobuf.WireFormat.FieldType.MESSAGE, false); + public static final int TYPE_PARAMETER_ANNOTATION_FIELD_NUMBER = 150; + /** + * extend .org.jetbrains.kotlin.serialization.TypeParameter { ... } + */ + public static final + com.google.protobuf.GeneratedMessageLite.GeneratedExtension< + org.jetbrains.kotlin.serialization.ProtoBuf.TypeParameter, + java.util.List> typeParameterAnnotation = com.google.protobuf.GeneratedMessageLite + .newRepeatedGeneratedExtension( + org.jetbrains.kotlin.serialization.ProtoBuf.TypeParameter.getDefaultInstance(), + org.jetbrains.kotlin.serialization.ProtoBuf.Annotation.getDefaultInstance(), + null, + 150, + com.google.protobuf.WireFormat.FieldType.MESSAGE, + false); static { } diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/AnnotationAndConstantLoader.java b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/AnnotationAndConstantLoader.java index a7c4d8a2d8c..ee28c8fb5e6 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/AnnotationAndConstantLoader.java +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/AnnotationAndConstantLoader.java @@ -62,6 +62,12 @@ public interface AnnotationAndConstantLoader { @NotNull NameResolver nameResolver ); + @NotNull + List loadTypeParameterAnnotations( + @NotNull ProtoBuf.TypeParameter typeParameter, + @NotNull NameResolver nameResolver + ); + @Nullable C loadPropertyConstant( @NotNull ProtoContainer container, diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedTypeParameterDescriptor.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedTypeParameterDescriptor.kt index aaa5f1b0f98..008bc33440a 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedTypeParameterDescriptor.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedTypeParameterDescriptor.kt @@ -14,52 +14,40 @@ * limitations under the License. */ -package org.jetbrains.kotlin.serialization.deserialization.descriptors; +package org.jetbrains.kotlin.serialization.deserialization.descriptors -import org.jetbrains.annotations.NotNull; -import org.jetbrains.kotlin.descriptors.SourceElement; -import org.jetbrains.kotlin.descriptors.annotations.Annotations; -import org.jetbrains.kotlin.descriptors.impl.AbstractLazyTypeParameterDescriptor; -import org.jetbrains.kotlin.serialization.ProtoBuf; -import org.jetbrains.kotlin.serialization.deserialization.*; -import org.jetbrains.kotlin.types.JetType; +import org.jetbrains.kotlin.descriptors.SourceElement +import org.jetbrains.kotlin.descriptors.annotations.AnnotationWithTarget +import org.jetbrains.kotlin.descriptors.annotations.Annotations +import org.jetbrains.kotlin.descriptors.impl.AbstractLazyTypeParameterDescriptor +import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns +import org.jetbrains.kotlin.serialization.ProtoBuf +import org.jetbrains.kotlin.serialization.deserialization.* +import org.jetbrains.kotlin.types.JetType +import java.util.* -import java.util.Collections; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Set; +class DeserializedTypeParameterDescriptor( + c: DeserializationContext, private val proto: ProtoBuf.TypeParameter, index: Int) : AbstractLazyTypeParameterDescriptor(c.storageManager, c.containingDeclaration, c.nameResolver.getName(proto.name), Deserialization.variance(proto.variance), proto.reified, index, SourceElement.NO_SOURCE) { + private val typeDeserializer: TypeDeserializer = c.typeDeserializer + private val typeTable: TypeTable = c.typeTable -import static org.jetbrains.kotlin.resolve.descriptorUtil.DescriptorUtilsKt.getBuiltIns; - -public class DeserializedTypeParameterDescriptor extends AbstractLazyTypeParameterDescriptor { - private final ProtoBuf.TypeParameter proto; - private final TypeDeserializer typeDeserializer; - private final TypeTable typeTable; - - public DeserializedTypeParameterDescriptor(@NotNull DeserializationContext c, @NotNull ProtoBuf.TypeParameter proto, int index) { - super(c.getStorageManager(), - c.getContainingDeclaration(), - c.getNameResolver().getName(proto.getName()), - Deserialization.variance(proto.getVariance()), - proto.getReified(), - index, - SourceElement.NO_SOURCE); - this.proto = proto; - this.typeDeserializer = c.getTypeDeserializer(); - this.typeTable = c.getTypeTable(); + private val annotations = DeserializedAnnotationsWithPossibleTargets(c.storageManager) { + c.components.annotationAndConstantLoader + .loadTypeParameterAnnotations(proto, c.nameResolver) + .map { AnnotationWithTarget(it, null) } } - @NotNull - @Override - protected Set resolveUpperBounds() { - List upperBounds = ProtoTypeTableUtilKt.upperBounds(proto, typeTable); + override fun getAnnotations(): Annotations = annotations + + override fun resolveUpperBounds(): Set { + val upperBounds = proto.upperBounds(typeTable) if (upperBounds.isEmpty()) { - return Collections.singleton(getBuiltIns(this).getDefaultBound()); + return setOf(this.builtIns.getDefaultBound()) } - Set result = new LinkedHashSet(upperBounds.size()); - for (ProtoBuf.Type upperBound : upperBounds) { - result.add(typeDeserializer.type(upperBound, Annotations.Companion.getEMPTY())); + val result = LinkedHashSet(upperBounds.size()) + for (upperBound in upperBounds) { + result.add(typeDeserializer.type(upperBound, Annotations.EMPTY)) } - return result; + return result } } diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/AnnotationLoaderForKotlinJavaScriptStubBuilder.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/AnnotationLoaderForKotlinJavaScriptStubBuilder.kt index 46356da139e..d2db5a88ee2 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/AnnotationLoaderForKotlinJavaScriptStubBuilder.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/AnnotationLoaderForKotlinJavaScriptStubBuilder.kt @@ -73,6 +73,9 @@ public class AnnotationLoaderForKotlinJavaScriptStubBuilder() : AnnotationAndCon ): List = proto.getExtension(JsProtoBuf.typeAnnotation).orEmpty().map { nameResolver.getClassId(it.id) } + override fun loadTypeParameterAnnotations(proto: ProtoBuf.TypeParameter, nameResolver: NameResolver): List = + proto.getExtension(JsProtoBuf.typeParameterAnnotation).orEmpty().map { nameResolver.getClassId(it.id) } + override fun loadPropertyConstant( container: ProtoContainer, proto: ProtoBuf.Property, diff --git a/idea/tests/org/jetbrains/kotlin/idea/stubs/ResolveByStubTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/stubs/ResolveByStubTestGenerated.java index ec4d0d7dc0d..45fd0ad0e7b 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/stubs/ResolveByStubTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/stubs/ResolveByStubTestGenerated.java @@ -467,6 +467,18 @@ public class ResolveByStubTestGenerated extends AbstractResolveByStubTest { String fileName = JetTestUtils.navigationMetadata("compiler/testData/loadJava/compiledKotlin/annotations/types/TypeAnnotationWithArguments.kt"); doTest(fileName); } + + @TestMetadata("TypeParameterAnnotation.kt") + public void testTypeParameterAnnotation() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/loadJava/compiledKotlin/annotations/types/TypeParameterAnnotation.kt"); + doTest(fileName); + } + + @TestMetadata("TypeParameterAnnotationWithArguments.kt") + public void testTypeParameterAnnotationWithArguments() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/loadJava/compiledKotlin/annotations/types/TypeParameterAnnotationWithArguments.kt"); + doTest(fileName); + } } @TestMetadata("compiler/testData/loadJava/compiledKotlin/annotations/withUseSiteTarget") diff --git a/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/ProtoCompareGenerated.kt b/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/ProtoCompareGenerated.kt index 12338aa078e..74e6cbc514e 100644 --- a/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/ProtoCompareGenerated.kt +++ b/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/ProtoCompareGenerated.kt @@ -308,6 +308,12 @@ open class ProtoCompareGenerated(public val oldNameResolver: NameResolver, publi if (!checkEqualsTypeParameterUpperBoundId(old, new)) return false + if (old.getExtensionCount(JvmProtoBuf.typeParameterAnnotation) != new.getExtensionCount(JvmProtoBuf.typeParameterAnnotation)) return false + + for(i in 0..old.getExtensionCount(JvmProtoBuf.typeParameterAnnotation) - 1) { + if (!checkEquals(old.getExtension(JvmProtoBuf.typeParameterAnnotation, i), new.getExtension(JvmProtoBuf.typeParameterAnnotation, i))) return false + } + return true } @@ -995,6 +1001,10 @@ public fun ProtoBuf.TypeParameter.hashCode(stringIndexes: (Int) -> Int, fqNameIn hashCode = 31 * hashCode + getUpperBoundId(i) } + for(i in 0..getExtensionCount(JvmProtoBuf.typeParameterAnnotation) - 1) { + hashCode = 31 * hashCode + getExtension(JvmProtoBuf.typeParameterAnnotation, i).hashCode(stringIndexes, fqNameIndexes) + } + return hashCode } diff --git a/js/js.serializer/src/js.proto b/js/js.serializer/src/js.proto index 3584e88b66e..43074d5ce5f 100644 --- a/js/js.serializer/src/js.proto +++ b/js/js.serializer/src/js.proto @@ -46,6 +46,10 @@ extend Type { repeated Annotation type_annotation = 130; } +extend TypeParameter { + repeated Annotation type_parameter_annotation = 130; +} + message Classes { // id in StringTable repeated int32 class_name = 1 [packed = true]; diff --git a/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/JsProtoBuf.java b/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/JsProtoBuf.java index 1d3031bb3c2..c19a199697c 100644 --- a/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/JsProtoBuf.java +++ b/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/JsProtoBuf.java @@ -14,6 +14,7 @@ public final class JsProtoBuf { registry.add(org.jetbrains.kotlin.serialization.js.JsProtoBuf.compileTimeValue); registry.add(org.jetbrains.kotlin.serialization.js.JsProtoBuf.parameterAnnotation); registry.add(org.jetbrains.kotlin.serialization.js.JsProtoBuf.typeAnnotation); + registry.add(org.jetbrains.kotlin.serialization.js.JsProtoBuf.typeParameterAnnotation); } public interface ClassesOrBuilder extends com.google.protobuf.MessageLiteOrBuilder { @@ -1569,6 +1570,21 @@ public final class JsProtoBuf { 130, com.google.protobuf.WireFormat.FieldType.MESSAGE, false); + public static final int TYPE_PARAMETER_ANNOTATION_FIELD_NUMBER = 130; + /** + * extend .org.jetbrains.kotlin.serialization.TypeParameter { ... } + */ + public static final + com.google.protobuf.GeneratedMessageLite.GeneratedExtension< + org.jetbrains.kotlin.serialization.ProtoBuf.TypeParameter, + java.util.List> typeParameterAnnotation = com.google.protobuf.GeneratedMessageLite + .newRepeatedGeneratedExtension( + org.jetbrains.kotlin.serialization.ProtoBuf.TypeParameter.getDefaultInstance(), + org.jetbrains.kotlin.serialization.ProtoBuf.Annotation.getDefaultInstance(), + null, + 130, + com.google.protobuf.WireFormat.FieldType.MESSAGE, + false); static { } diff --git a/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptAnnotationAndConstantLoader.kt b/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptAnnotationAndConstantLoader.kt index 7c98269d939..27a08d08778 100644 --- a/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptAnnotationAndConstantLoader.kt +++ b/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptAnnotationAndConstantLoader.kt @@ -74,6 +74,11 @@ class KotlinJavascriptAnnotationAndConstantLoader( return annotations.map { proto -> deserializer.deserializeAnnotation(proto, nameResolver) } } + override fun loadTypeParameterAnnotations(proto: ProtoBuf.TypeParameter, nameResolver: NameResolver): List { + val annotations = proto.getExtension(JsProtoBuf.typeParameterAnnotation).orEmpty() + return annotations.map { proto -> deserializer.deserializeAnnotation(proto, nameResolver) } + } + override fun loadPropertyConstant( container: ProtoContainer, proto: ProtoBuf.Property,