[FIR] KT-52157: Fix missing type parameter annotations
diff --git a/compiler/fir/analysis-tests/legacy-fir-tests/tests-gen/org/jetbrains/kotlin/fir/FirLoadCompiledKotlinGenerated.java b/compiler/fir/analysis-tests/legacy-fir-tests/tests-gen/org/jetbrains/kotlin/fir/FirLoadCompiledKotlinGenerated.java
index f0f65e6..ecef512 100644
--- a/compiler/fir/analysis-tests/legacy-fir-tests/tests-gen/org/jetbrains/kotlin/fir/FirLoadCompiledKotlinGenerated.java
+++ b/compiler/fir/analysis-tests/legacy-fir-tests/tests-gen/org/jetbrains/kotlin/fir/FirLoadCompiledKotlinGenerated.java
@@ -56,6 +56,11 @@
             runTest("compiler/testData/loadJava/compiledKotlin/annotations/AnnotationInArray.kt");
         }
 
+        @TestMetadata("AnnotationOnTypeParameter.kt")
+        public void testAnnotationOnTypeParameter() throws Exception {
+            runTest("compiler/testData/loadJava/compiledKotlin/annotations/AnnotationOnTypeParameter.kt");
+        }
+
         @TestMetadata("ClassLiteralArguments.kt")
         public void testClassLiteralArguments() throws Exception {
             runTest("compiler/testData/loadJava/compiledKotlin/annotations/ClassLiteralArguments.kt");
diff --git a/compiler/fir/analysis-tests/testData/loadCompiledKotlin/annotations/AnnotationOnTypeParameter.txt b/compiler/fir/analysis-tests/testData/loadCompiledKotlin/annotations/AnnotationOnTypeParameter.txt
new file mode 100644
index 0000000..565970c
--- /dev/null
+++ b/compiler/fir/analysis-tests/testData/loadCompiledKotlin/annotations/AnnotationOnTypeParameter.txt
@@ -0,0 +1,9 @@
+public final class Convert<@R|test/Schema|() T, C> : R|kotlin/Any| {
+    public constructor<@R|test/Schema|() T, C>(): R|test/Convert<T, C>|
+
+}
+
+@R|kotlin/annotation/Target|(allowedTargets = <implicitArrayOf>(R|kotlin/annotation/AnnotationTarget.TYPE_PARAMETER|())) public final annotation class Schema : R|kotlin/Annotation| {
+    public constructor(): R|test/Schema|
+
+}
diff --git a/compiler/fir/analysis-tests/testData/loadCompiledKotlin/annotations/types/TypeParameterAnnotation.txt b/compiler/fir/analysis-tests/testData/loadCompiledKotlin/annotations/types/TypeParameterAnnotation.txt
index 3c5986e..c3723f7 100644
--- a/compiler/fir/analysis-tests/testData/loadCompiledKotlin/annotations/types/TypeParameterAnnotation.txt
+++ b/compiler/fir/analysis-tests/testData/loadCompiledKotlin/annotations/types/TypeParameterAnnotation.txt
@@ -4,7 +4,7 @@
 }
 
 public final class SimpleTypeParameterAnnotation : R|kotlin/Any| {
-    public final fun <T> foo(x: R|T|): R|kotlin/Unit|
+    public final fun <@R|test/A|() T> foo(x: R|T|): R|kotlin/Unit|
 
     public constructor(): R|test/SimpleTypeParameterAnnotation|
 
diff --git a/compiler/fir/analysis-tests/testData/loadCompiledKotlin/annotations/types/TypeParameterAnnotationWithArguments.txt b/compiler/fir/analysis-tests/testData/loadCompiledKotlin/annotations/types/TypeParameterAnnotationWithArguments.txt
index 24ebeee..f6a7fb6 100644
--- a/compiler/fir/analysis-tests/testData/loadCompiledKotlin/annotations/types/TypeParameterAnnotationWithArguments.txt
+++ b/compiler/fir/analysis-tests/testData/loadCompiledKotlin/annotations/types/TypeParameterAnnotationWithArguments.txt
@@ -10,7 +10,7 @@
 }
 
 public final class SimpleTypeParameterAnnotation : R|kotlin/Any| {
-    public final fun <T> foo(x: R|T|): R|kotlin/Unit|
+    public final fun <@R|test/A|(x = String(a), y = Double(1.0)) T> foo(x: R|T|): R|kotlin/Unit|
 
     public constructor(): R|test/SimpleTypeParameterAnnotation|
 
diff --git a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/KlibBasedAnnotationDeserializer.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/KlibBasedAnnotationDeserializer.kt
index 70cda45..f5a6488 100644
--- a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/KlibBasedAnnotationDeserializer.kt
+++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/KlibBasedAnnotationDeserializer.kt
@@ -24,4 +24,9 @@
         val annotations = typeProto.getExtension(KlibMetadataProtoBuf.typeAnnotation).orEmpty()
         return annotations.map { deserializeAnnotation(it, nameResolver) }
     }
+
+    override fun loadTypeParameterAnnotations(typeParameterProto: ProtoBuf.TypeParameter, nameResolver: NameResolver): List<FirAnnotation> {
+        val annotations = typeParameterProto.getExtension(KlibMetadataProtoBuf.typeParameterAnnotation).orEmpty()
+        return annotations.map { deserializeAnnotation(it, nameResolver) }
+    }
 }
\ No newline at end of file
diff --git a/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/AbstractAnnotationDeserializer.kt b/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/AbstractAnnotationDeserializer.kt
index 6122485..6cbd4d5 100644
--- a/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/AbstractAnnotationDeserializer.kt
+++ b/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/AbstractAnnotationDeserializer.kt
@@ -172,6 +172,9 @@
 
     abstract fun loadTypeAnnotations(typeProto: ProtoBuf.Type, nameResolver: NameResolver): List<FirAnnotation>
 
+    open fun loadTypeParameterAnnotations(typeParameterProto: ProtoBuf.TypeParameter, nameResolver: NameResolver) =
+        emptyList<FirAnnotation>()
+
     fun deserializeAnnotation(
         proto: ProtoBuf.Annotation,
         nameResolver: NameResolver,
diff --git a/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/FirTypeDeserializer.kt b/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/FirTypeDeserializer.kt
index f6db3bf..474ef2e 100644
--- a/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/FirTypeDeserializer.kt
+++ b/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/FirTypeDeserializer.kt
@@ -76,6 +76,7 @@
                     this.containingDeclarationSymbol = containingSymbol ?: error("Top-level type parameter ???")
                     variance = proto.variance.convertVariance()
                     isReified = proto.reified
+                    annotations += annotationDeserializer.loadTypeParameterAnnotations(proto, nameResolver)
                 }
                 result[proto.id] = symbol
             }
diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/JvmBinaryAnnotationDeserializer.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/JvmBinaryAnnotationDeserializer.kt
index 7014ff1..835b67b 100644
--- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/JvmBinaryAnnotationDeserializer.kt
+++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/JvmBinaryAnnotationDeserializer.kt
@@ -52,6 +52,11 @@
         return annotations.map { deserializeAnnotation(it, nameResolver) }
     }
 
+    override fun loadTypeParameterAnnotations(typeParameterProto: ProtoBuf.TypeParameter, nameResolver: NameResolver): List<FirAnnotation> {
+        val annotations = typeParameterProto.getExtension(JvmProtoBuf.typeParameterAnnotation).orEmpty()
+        return annotations.map { deserializeAnnotation(it, nameResolver) }
+    }
+
     override fun loadConstructorAnnotations(
         containerSource: DeserializedContainerSource?,
         constructorProto: ProtoBuf.Constructor,
diff --git a/compiler/testData/loadJava/compiledKotlin/annotations/AnnotationOnTypeParameter.kt b/compiler/testData/loadJava/compiledKotlin/annotations/AnnotationOnTypeParameter.kt
new file mode 100644
index 0000000..0c6de8e
--- /dev/null
+++ b/compiler/testData/loadJava/compiledKotlin/annotations/AnnotationOnTypeParameter.kt
@@ -0,0 +1,8 @@
+package test
+
+// See: KT-52157
+
+@Target(AnnotationTarget.TYPE_PARAMETER)
+public annotation class Schema
+
+class Convert<@Schema T, C>()
diff --git a/compiler/testData/loadJava/compiledKotlin/annotations/AnnotationOnTypeParameter.txt b/compiler/testData/loadJava/compiledKotlin/annotations/AnnotationOnTypeParameter.txt
new file mode 100644
index 0000000..de0296e
--- /dev/null
+++ b/compiler/testData/loadJava/compiledKotlin/annotations/AnnotationOnTypeParameter.txt
@@ -0,0 +1,9 @@
+package test
+
+public final class Convert</*0*/ @test.Schema T, /*1*/ C> {
+    /*primary*/ public constructor Convert</*0*/ @test.Schema T, /*1*/ C>()
+}
+
+@kotlin.annotation.Target(allowedTargets = {AnnotationTarget.TYPE_PARAMETER}) public final annotation class Schema : kotlin.Annotation {
+    /*primary*/ public constructor Schema()
+}
diff --git a/compiler/tests-gen/org/jetbrains/kotlin/jvm/compiler/LoadJavaTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/jvm/compiler/LoadJavaTestGenerated.java
index b462582..11258bd 100644
--- a/compiler/tests-gen/org/jetbrains/kotlin/jvm/compiler/LoadJavaTestGenerated.java
+++ b/compiler/tests-gen/org/jetbrains/kotlin/jvm/compiler/LoadJavaTestGenerated.java
@@ -1739,6 +1739,11 @@
                 runTest("compiler/testData/loadJava/compiledKotlin/annotations/AnnotationInArray.kt");
             }
 
+            @TestMetadata("AnnotationOnTypeParameter.kt")
+            public void testAnnotationOnTypeParameter() throws Exception {
+                runTest("compiler/testData/loadJava/compiledKotlin/annotations/AnnotationOnTypeParameter.kt");
+            }
+
             @TestMetadata("ClassLiteralArguments.kt")
             public void testClassLiteralArguments() throws Exception {
                 runTest("compiler/testData/loadJava/compiledKotlin/annotations/ClassLiteralArguments.kt");
diff --git a/compiler/tests-gen/org/jetbrains/kotlin/jvm/compiler/LoadKotlinWithTypeTableTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/jvm/compiler/LoadKotlinWithTypeTableTestGenerated.java
index cb3dd0b..87ef34a 100644
--- a/compiler/tests-gen/org/jetbrains/kotlin/jvm/compiler/LoadKotlinWithTypeTableTestGenerated.java
+++ b/compiler/tests-gen/org/jetbrains/kotlin/jvm/compiler/LoadKotlinWithTypeTableTestGenerated.java
@@ -56,6 +56,11 @@
             runTest("compiler/testData/loadJava/compiledKotlin/annotations/AnnotationInArray.kt");
         }
 
+        @TestMetadata("AnnotationOnTypeParameter.kt")
+        public void testAnnotationOnTypeParameter() throws Exception {
+            runTest("compiler/testData/loadJava/compiledKotlin/annotations/AnnotationOnTypeParameter.kt");
+        }
+
         @TestMetadata("ClassLiteralArguments.kt")
         public void testClassLiteralArguments() throws Exception {
             runTest("compiler/testData/loadJava/compiledKotlin/annotations/ClassLiteralArguments.kt");
diff --git a/compiler/tests-gen/org/jetbrains/kotlin/jvm/compiler/ir/IrLoadJavaTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/jvm/compiler/ir/IrLoadJavaTestGenerated.java
index a047722..e539c68 100644
--- a/compiler/tests-gen/org/jetbrains/kotlin/jvm/compiler/ir/IrLoadJavaTestGenerated.java
+++ b/compiler/tests-gen/org/jetbrains/kotlin/jvm/compiler/ir/IrLoadJavaTestGenerated.java
@@ -1740,6 +1740,11 @@
                 runTest("compiler/testData/loadJava/compiledKotlin/annotations/AnnotationInArray.kt");
             }
 
+            @TestMetadata("AnnotationOnTypeParameter.kt")
+            public void testAnnotationOnTypeParameter() throws Exception {
+                runTest("compiler/testData/loadJava/compiledKotlin/annotations/AnnotationOnTypeParameter.kt");
+            }
+
             @TestMetadata("ClassLiteralArguments.kt")
             public void testClassLiteralArguments() throws Exception {
                 runTest("compiler/testData/loadJava/compiledKotlin/annotations/ClassLiteralArguments.kt");
diff --git a/compiler/tests-gen/org/jetbrains/kotlin/jvm/compiler/javac/LoadJavaUsingJavacTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/jvm/compiler/javac/LoadJavaUsingJavacTestGenerated.java
index 2300d88..2c8daa4 100644
--- a/compiler/tests-gen/org/jetbrains/kotlin/jvm/compiler/javac/LoadJavaUsingJavacTestGenerated.java
+++ b/compiler/tests-gen/org/jetbrains/kotlin/jvm/compiler/javac/LoadJavaUsingJavacTestGenerated.java
@@ -1739,6 +1739,11 @@
                 runTest("compiler/testData/loadJava/compiledKotlin/annotations/AnnotationInArray.kt");
             }
 
+            @TestMetadata("AnnotationOnTypeParameter.kt")
+            public void testAnnotationOnTypeParameter() throws Exception {
+                runTest("compiler/testData/loadJava/compiledKotlin/annotations/AnnotationOnTypeParameter.kt");
+            }
+
             @TestMetadata("ClassLiteralArguments.kt")
             public void testClassLiteralArguments() throws Exception {
                 runTest("compiler/testData/loadJava/compiledKotlin/annotations/ClassLiteralArguments.kt");
diff --git a/core/descriptors.runtime/tests/org/jetbrains/kotlin/jvm/runtime/JvmRuntimeDescriptorLoaderTestGenerated.java b/core/descriptors.runtime/tests/org/jetbrains/kotlin/jvm/runtime/JvmRuntimeDescriptorLoaderTestGenerated.java
index 49f41d5..5b9f034 100644
--- a/core/descriptors.runtime/tests/org/jetbrains/kotlin/jvm/runtime/JvmRuntimeDescriptorLoaderTestGenerated.java
+++ b/core/descriptors.runtime/tests/org/jetbrains/kotlin/jvm/runtime/JvmRuntimeDescriptorLoaderTestGenerated.java
@@ -58,6 +58,11 @@
                 runTest("compiler/testData/loadJava/compiledKotlin/annotations/AnnotationInArray.kt");
             }
 
+            @TestMetadata("AnnotationOnTypeParameter.kt")
+            public void testAnnotationOnTypeParameter() throws Exception {
+                runTest("compiler/testData/loadJava/compiledKotlin/annotations/AnnotationOnTypeParameter.kt");
+            }
+
             @TestMetadata("ClassLiteralArguments.kt")
             public void testClassLiteralArguments() throws Exception {
                 runTest("compiler/testData/loadJava/compiledKotlin/annotations/ClassLiteralArguments.kt");