diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java index 9cd7e85a774..3130b533575 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java @@ -519,6 +519,12 @@ public class DiagnosisCompilerTestFE10TestdataTestGenerated extends AbstractDiag runTest("compiler/testData/diagnostics/tests/kt56723.kt"); } + @Test + @TestMetadata("kt56769.kt") + public void testKt56769() throws Exception { + runTest("compiler/testData/diagnostics/tests/kt56769.kt"); + } + @Test @TestMetadata("LValueAssignment.kt") public void testLValueAssignment() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java index cc63ff556f5..86d1df89af2 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java @@ -519,6 +519,12 @@ public class FirLightTreeOldFrontendDiagnosticsTestGenerated extends AbstractFir runTest("compiler/testData/diagnostics/tests/kt56723.kt"); } + @Test + @TestMetadata("kt56769.kt") + public void testKt56769() throws Exception { + runTest("compiler/testData/diagnostics/tests/kt56769.kt"); + } + @Test @TestMetadata("LValueAssignment.kt") public void testLValueAssignment() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java index 3fd8be24e08..1ab62e80326 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java @@ -519,6 +519,12 @@ public class FirPsiOldFrontendDiagnosticsTestGenerated extends AbstractFirPsiDia runTest("compiler/testData/diagnostics/tests/kt56723.kt"); } + @Test + @TestMetadata("kt56769.kt") + public void testKt56769() throws Exception { + runTest("compiler/testData/diagnostics/tests/kt56769.kt"); + } + @Test @TestMetadata("LValueAssignment.kt") public void testLValueAssignment() throws Exception { diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/type/FirTypeAnnotationChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/type/FirTypeAnnotationChecker.kt index 21195a1df0f..88c68643261 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/type/FirTypeAnnotationChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/type/FirTypeAnnotationChecker.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.fir.analysis.checkers.type import org.jetbrains.kotlin.config.LanguageFeature +import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget import org.jetbrains.kotlin.descriptors.annotations.KotlinTarget import org.jetbrains.kotlin.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.diagnostics.reportOn @@ -24,10 +25,19 @@ object FirTypeAnnotationChecker : FirTypeRefChecker() { for (annotation in typeRef.annotations) { if (annotation.source == null) continue + val useSiteTarget = annotation.useSiteTarget + + // Annotations with `@receiver:` go + // into FirReceiverParameter, not FirTypeRef + if (useSiteTarget == AnnotationUseSiteTarget.RECEIVER) { + reporter.reportOn( + annotation.source, FirErrors.WRONG_ANNOTATION_TARGET_WITH_USE_SITE_TARGET, + "type usage", useSiteTarget.renderName, context + ) + } val annotationTargets = annotation.getAllowedAnnotationTargets(context.session) if (KotlinTarget.TYPE !in annotationTargets) { - val useSiteTarget = annotation.useSiteTarget if (useSiteTarget == null || KotlinTarget.USE_SITE_MAPPING[useSiteTarget] !in annotationTargets) { reporter.reportOn(annotation.source, FirErrors.WRONG_ANNOTATION_TARGET, "type usage", context) } diff --git a/compiler/testData/diagnostics/tests/annotations/withUseSiteTarget/receiverUseSiteTargetOnExtensionFunction_after.fir.kt b/compiler/testData/diagnostics/tests/annotations/withUseSiteTarget/receiverUseSiteTargetOnExtensionFunction_after.fir.kt deleted file mode 100644 index 6fc63f57ceb..00000000000 --- a/compiler/testData/diagnostics/tests/annotations/withUseSiteTarget/receiverUseSiteTargetOnExtensionFunction_after.fir.kt +++ /dev/null @@ -1,10 +0,0 @@ -// !LANGUAGE: +RestrictionOfWrongAnnotationsWithUseSiteTargetsOnTypes - -@Target(AnnotationTarget.VALUE_PARAMETER) -annotation class Fancy - -fun @receiver:Fancy String.myExtension() { } -val @receiver:Fancy Int.asVal get() = 0 - -fun ((@receiver:Fancy Int) -> Unit).complexReceiver1() {} -fun ((Int) -> @receiver:Fancy Unit).complexReceiver2() {} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/annotations/withUseSiteTarget/receiverUseSiteTargetOnExtensionFunction_after.kt b/compiler/testData/diagnostics/tests/annotations/withUseSiteTarget/receiverUseSiteTargetOnExtensionFunction_after.kt index 659613289bf..513c2d1feb4 100644 --- a/compiler/testData/diagnostics/tests/annotations/withUseSiteTarget/receiverUseSiteTargetOnExtensionFunction_after.kt +++ b/compiler/testData/diagnostics/tests/annotations/withUseSiteTarget/receiverUseSiteTargetOnExtensionFunction_after.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // !LANGUAGE: +RestrictionOfWrongAnnotationsWithUseSiteTargetsOnTypes @Target(AnnotationTarget.VALUE_PARAMETER) diff --git a/compiler/testData/diagnostics/tests/annotations/withUseSiteTarget/receiverUseSiteTargetOnExtensionFunction_before.fir.kt b/compiler/testData/diagnostics/tests/annotations/withUseSiteTarget/receiverUseSiteTargetOnExtensionFunction_before.fir.kt index e2ce398bcdc..86c7474198c 100644 --- a/compiler/testData/diagnostics/tests/annotations/withUseSiteTarget/receiverUseSiteTargetOnExtensionFunction_before.fir.kt +++ b/compiler/testData/diagnostics/tests/annotations/withUseSiteTarget/receiverUseSiteTargetOnExtensionFunction_before.fir.kt @@ -6,5 +6,5 @@ annotation class Fancy fun @receiver:Fancy String.myExtension() { } val @receiver:Fancy Int.asVal get() = 0 -fun ((@receiver:Fancy Int) -> Unit).complexReceiver1() {} -fun ((Int) -> @receiver:Fancy Unit).complexReceiver2() {} \ No newline at end of file +fun ((@receiver:Fancy Int) -> Unit).complexReceiver1() {} +fun ((Int) -> @receiver:Fancy Unit).complexReceiver2() {} diff --git a/compiler/testData/diagnostics/tests/annotations/withUseSiteTarget/wrongParamAnnotationsOnTypesError.fir.kt b/compiler/testData/diagnostics/tests/annotations/withUseSiteTarget/wrongParamAnnotationsOnTypesError.fir.kt index ab1df1b5508..c15d326ad13 100644 --- a/compiler/testData/diagnostics/tests/annotations/withUseSiteTarget/wrongParamAnnotationsOnTypesError.fir.kt +++ b/compiler/testData/diagnostics/tests/annotations/withUseSiteTarget/wrongParamAnnotationsOnTypesError.fir.kt @@ -3,7 +3,7 @@ fun test1(i: @setparam:Suppress Int) {} fun test2(i: @param:Suppress Int) {} -fun test3(i: @receiver:Suppress Int) {} +fun test3(i: @receiver:Suppress Int) {} fun test4(): @setparam:Suppress Int = TODO() fun test5(i: (@setparam:Suppress Int) -> Unit) {} diff --git a/compiler/testData/diagnostics/tests/annotations/withUseSiteTarget/wrongParamAnnotationsOnTypes_after.fir.kt b/compiler/testData/diagnostics/tests/annotations/withUseSiteTarget/wrongParamAnnotationsOnTypes_after.fir.kt index ab1df1b5508..c15d326ad13 100644 --- a/compiler/testData/diagnostics/tests/annotations/withUseSiteTarget/wrongParamAnnotationsOnTypes_after.fir.kt +++ b/compiler/testData/diagnostics/tests/annotations/withUseSiteTarget/wrongParamAnnotationsOnTypes_after.fir.kt @@ -3,7 +3,7 @@ fun test1(i: @setparam:Suppress Int) {} fun test2(i: @param:Suppress Int) {} -fun test3(i: @receiver:Suppress Int) {} +fun test3(i: @receiver:Suppress Int) {} fun test4(): @setparam:Suppress Int = TODO() fun test5(i: (@setparam:Suppress Int) -> Unit) {} diff --git a/compiler/testData/diagnostics/tests/annotations/withUseSiteTarget/wrongParamAnnotationsOnTypes_before.fir.kt b/compiler/testData/diagnostics/tests/annotations/withUseSiteTarget/wrongParamAnnotationsOnTypes_before.fir.kt index 3b9eed6b1b3..012ca2b84da 100644 --- a/compiler/testData/diagnostics/tests/annotations/withUseSiteTarget/wrongParamAnnotationsOnTypes_before.fir.kt +++ b/compiler/testData/diagnostics/tests/annotations/withUseSiteTarget/wrongParamAnnotationsOnTypes_before.fir.kt @@ -3,7 +3,7 @@ fun test1(i: @setparam:Suppress Int) {} fun test2(i: @param:Suppress Int) {} -fun test3(i: @receiver:Suppress Int) {} +fun test3(i: @receiver:Suppress Int) {} fun test4(): @setparam:Suppress Int = TODO() fun test5(i: (@setparam:Suppress Int) -> Unit) {} diff --git a/compiler/testData/diagnostics/tests/kt56769.fir.kt b/compiler/testData/diagnostics/tests/kt56769.fir.kt new file mode 100644 index 00000000000..3b6fc425ad7 --- /dev/null +++ b/compiler/testData/diagnostics/tests/kt56769.fir.kt @@ -0,0 +1,19 @@ +fun main(args: Array<@receiver:Anno String>) {} + +annotation class Anno + +fun Int.train(args: Array<@receiver:Anno String>) {} + +fun Int.plane(@receiver:Anno args: Array) {} + +fun vein(args: Array<@file:Anno String>) {} + +fun rain(args: Array<@Anno String>) {} + +fun @Anno Int.strain() {} + +fun @receiver:Anno Int.drain() {} + +fun @file:Anno Int.brain() {} + +fun (@Anno Int).crane() {} diff --git a/compiler/testData/diagnostics/tests/kt56769.kt b/compiler/testData/diagnostics/tests/kt56769.kt new file mode 100644 index 00000000000..da07e1a3a97 --- /dev/null +++ b/compiler/testData/diagnostics/tests/kt56769.kt @@ -0,0 +1,19 @@ +fun main(args: Array<@receiver:Anno String>) {} + +annotation class Anno + +fun Int.train(args: Array<@receiver:Anno String>) {} + +fun Int.plane(@receiver:Anno args: Array) {} + +fun vein(args: Array<@file:Anno String>) {} + +fun rain(args: Array<@Anno String>) {} + +fun @Anno Int.strain() {} + +fun @receiver:Anno Int.drain() {} + +fun @file:Anno Int.brain() {} + +fun (@Anno Int).crane() {} diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java index 47da3befb7e..5c8c06c92f0 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java @@ -519,6 +519,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/kt56723.kt"); } + @Test + @TestMetadata("kt56769.kt") + public void testKt56769() throws Exception { + runTest("compiler/testData/diagnostics/tests/kt56769.kt"); + } + @Test @TestMetadata("LValueAssignment.kt") public void testLValueAssignment() throws Exception {