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 f0f65e6dfc8..ecef512ef9b 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 @@ public class FirLoadCompiledKotlinGenerated extends AbstractFirLoadCompiledKotli 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 00000000000..565970cc39f --- /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| + +} + +@R|kotlin/annotation/Target|(allowedTargets = (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 3c5986e1624..c3723f7a9f2 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 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 24ebeee4428..f6a7fb66492 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 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 70cda454bce..f5a648866c5 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 @@ class KlibBasedAnnotationDeserializer( val annotations = typeProto.getExtension(KlibMetadataProtoBuf.typeAnnotation).orEmpty() return annotations.map { deserializeAnnotation(it, nameResolver) } } + + override fun loadTypeParameterAnnotations(typeParameterProto: ProtoBuf.TypeParameter, nameResolver: NameResolver): List { + 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 6122485b6c4..6cbd4d55289 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 class AbstractAnnotationDeserializer( abstract fun loadTypeAnnotations(typeProto: ProtoBuf.Type, nameResolver: NameResolver): List + open fun loadTypeParameterAnnotations(typeParameterProto: ProtoBuf.TypeParameter, nameResolver: NameResolver) = + emptyList() + 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 2b16b93595c..8d6325ea678 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 @@ class FirTypeDeserializer( 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 7014ff15692..835b67bb91a 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 @@ class JvmBinaryAnnotationDeserializer( return annotations.map { deserializeAnnotation(it, nameResolver) } } + override fun loadTypeParameterAnnotations(typeParameterProto: ProtoBuf.TypeParameter, nameResolver: NameResolver): List { + 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 00000000000..0c6de8ed90e --- /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 00000000000..de0296e6a4f --- /dev/null +++ b/compiler/testData/loadJava/compiledKotlin/annotations/AnnotationOnTypeParameter.txt @@ -0,0 +1,9 @@ +package test + +public final class Convert { + /*primary*/ public constructor Convert() +} + +@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 b46258218db..11258bd219d 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 @@ public class LoadJavaTestGenerated extends AbstractLoadJavaTest { 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 cb3dd0b24dc..87ef34a2cfe 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 @@ public class LoadKotlinWithTypeTableTestGenerated extends AbstractLoadKotlinWith 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 a047722d944..e539c68679d 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 @@ public class IrLoadJavaTestGenerated extends AbstractIrLoadJavaTest { 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 2300d88eeb0..2c8daa497aa 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 @@ public class LoadJavaUsingJavacTestGenerated extends AbstractLoadJavaUsingJavacT 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 49f41d548e4..5b9f0340760 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 @@ public class JvmRuntimeDescriptorLoaderTestGenerated extends AbstractJvmRuntimeD 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");