From 847c58d574a90f0c806b46f12dd48e0ef9ac6a14 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Fri, 30 Jul 2021 02:13:57 +0200 Subject: [PATCH] Report error on class named Container inside repeatable annotation #KT-12794 #KT-47971 --- ...irOldFrontendDiagnosticsTestGenerated.java | 12 ++++ ...DiagnosticsWithLightTreeTestGenerated.java | 12 ++++ .../checkers/RepeatableAnnotationChecker.kt | 51 +++++++++++++--- .../diagnostics/DefaultErrorMessagesJvm.java | 2 + .../resolve/jvm/diagnostics/ErrorsJvm.java | 2 + .../nestedClassContainer_1_5.fir.kt | 21 +++++++ .../repeatable/nestedClassContainer_1_5.kt | 21 +++++++ .../repeatable/nestedClassContainer_1_5.txt | 59 +++++++++++++++++++ .../nestedClassContainer_1_6.fir.kt | 21 +++++++ .../repeatable/nestedClassContainer_1_6.kt | 21 +++++++ .../repeatable/nestedClassContainer_1_6.txt | 59 +++++++++++++++++++ .../test/runners/DiagnosticTestGenerated.java | 12 ++++ ...CompilerTestFE10TestdataTestGenerated.java | 12 ++++ 13 files changed, 297 insertions(+), 8 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/annotations/repeatable/nestedClassContainer_1_5.fir.kt create mode 100644 compiler/testData/diagnostics/tests/annotations/repeatable/nestedClassContainer_1_5.kt create mode 100644 compiler/testData/diagnostics/tests/annotations/repeatable/nestedClassContainer_1_5.txt create mode 100644 compiler/testData/diagnostics/tests/annotations/repeatable/nestedClassContainer_1_6.fir.kt create mode 100644 compiler/testData/diagnostics/tests/annotations/repeatable/nestedClassContainer_1_6.kt create mode 100644 compiler/testData/diagnostics/tests/annotations/repeatable/nestedClassContainer_1_6.txt diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java index b09e6db1beb..f8efa52d23b 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java @@ -2177,6 +2177,18 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti public void testKotlinRepeatable_1_6() throws Exception { runTest("compiler/testData/diagnostics/tests/annotations/repeatable/kotlinRepeatable_1_6.kt"); } + + @Test + @TestMetadata("nestedClassContainer_1_5.kt") + public void testNestedClassContainer_1_5() throws Exception { + runTest("compiler/testData/diagnostics/tests/annotations/repeatable/nestedClassContainer_1_5.kt"); + } + + @Test + @TestMetadata("nestedClassContainer_1_6.kt") + public void testNestedClassContainer_1_6() throws Exception { + runTest("compiler/testData/diagnostics/tests/annotations/repeatable/nestedClassContainer_1_6.kt"); + } } @Nested diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java index 13a59f03986..32e2526a358 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java @@ -2177,6 +2177,18 @@ public class FirOldFrontendDiagnosticsWithLightTreeTestGenerated extends Abstrac public void testKotlinRepeatable_1_6() throws Exception { runTest("compiler/testData/diagnostics/tests/annotations/repeatable/kotlinRepeatable_1_6.kt"); } + + @Test + @TestMetadata("nestedClassContainer_1_5.kt") + public void testNestedClassContainer_1_5() throws Exception { + runTest("compiler/testData/diagnostics/tests/annotations/repeatable/nestedClassContainer_1_5.kt"); + } + + @Test + @TestMetadata("nestedClassContainer_1_6.kt") + public void testNestedClassContainer_1_6() throws Exception { + runTest("compiler/testData/diagnostics/tests/annotations/repeatable/nestedClassContainer_1_6.kt"); + } } @Nested diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/RepeatableAnnotationChecker.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/RepeatableAnnotationChecker.kt index 65b1ec05497..ffe845d5ed9 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/RepeatableAnnotationChecker.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/RepeatableAnnotationChecker.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.resolve.jvm.checkers import org.jetbrains.kotlin.builtins.KotlinBuiltIns +import org.jetbrains.kotlin.builtins.StandardNames import org.jetbrains.kotlin.config.JvmTarget import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.config.LanguageVersionSettings @@ -16,7 +17,9 @@ import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget import org.jetbrains.kotlin.descriptors.annotations.KotlinRetention import org.jetbrains.kotlin.descriptors.annotations.KotlinTarget import org.jetbrains.kotlin.diagnostics.Diagnostic +import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.lexer.KtTokens +import org.jetbrains.kotlin.load.java.JvmAbi import org.jetbrains.kotlin.load.java.JvmAnnotationNames import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name @@ -63,19 +66,51 @@ class RepeatableAnnotationChecker( if (annotated is KtClassOrObject && annotated.hasModifier(KtTokens.ANNOTATION_KEYWORD)) { val annotationClass = trace.get(BindingContext.CLASS, annotated) - val repeatable = annotations.find { it.descriptor.fqName == JvmAnnotationNames.REPEATABLE_ANNOTATION } - if (annotationClass != null && repeatable != null) { - val containerKClassValue = repeatable.descriptor.allValueArguments[Name.identifier("value")] - if (containerKClassValue is KClassValue) { - val containerClass = TypeUtils.getClassDescriptor(containerKClassValue.getArgumentType(module)) - if (containerClass != null) { - checkRepeatableAnnotationContainer(annotationClass, containerClass, trace, repeatable.entry) - } + if (annotationClass != null) { + val javaRepeatable = annotations.find { it.descriptor.fqName == JvmAnnotationNames.REPEATABLE_ANNOTATION } + val kotlinRepeatable = annotations.find { it.descriptor.fqName == StandardNames.FqNames.repeatable } + when { + javaRepeatable != null -> checkJavaRepeatableAnnotationDeclaration(javaRepeatable, annotationClass, trace) + kotlinRepeatable != null -> checkKotlinRepeatableAnnotationDeclaration(kotlinRepeatable, annotationClass, trace) } } } } + private fun checkJavaRepeatableAnnotationDeclaration( + javaRepeatable: ResolvedAnnotation, + annotationClass: ClassDescriptor, + trace: BindingTrace, + ) { + val containerKClassValue = javaRepeatable.descriptor.allValueArguments[Name.identifier("value")] + if (containerKClassValue is KClassValue) { + val containerClass = TypeUtils.getClassDescriptor(containerKClassValue.getArgumentType(module)) + if (containerClass != null) { + checkRepeatableAnnotationContainer(annotationClass, containerClass, trace, javaRepeatable.entry) + } + } + } + + private fun checkKotlinRepeatableAnnotationDeclaration( + kotlinRepeatable: ResolvedAnnotation, + annotationClass: ClassDescriptor, + trace: BindingTrace, + ) { + val nestedClassNamedContainer = + annotationClass.unsubstitutedInnerClassesScope.getContributedClassifier( + Name.identifier(JvmAbi.REPEATABLE_ANNOTATION_CONTAINER_NAME), + NoLookupLocation.FOR_ALREADY_TRACKED + ) + if (nestedClassNamedContainer != null) { + trace.report( + select( + ErrorsJvm.REPEATABLE_ANNOTATION_HAS_NESTED_CLASS_NAMED_CONTAINER, + ErrorsJvm.REPEATABLE_ANNOTATION_HAS_NESTED_CLASS_NAMED_CONTAINER_ERROR + ).on(kotlinRepeatable.entry) + ) + } + } + private fun checkRepeatedEntries(annotations: List, trace: BindingTrace) { val entryTypesWithAnnotations = hashMapOf>() diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/DefaultErrorMessagesJvm.java b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/DefaultErrorMessagesJvm.java index b7dd06596f4..011803d750f 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/DefaultErrorMessagesJvm.java +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/DefaultErrorMessagesJvm.java @@ -83,6 +83,8 @@ public class DefaultErrorMessagesJvm implements DefaultErrorMessages.Extension { MAP.put(REPEATABLE_CONTAINER_HAS_SHORTER_RETENTION_ERROR, "Container annotation ''{0}'' has shorter retention (''{1}'') than the repeatable annotation ''{2}'' (''{3}'')", TO_STRING, TO_STRING, TO_STRING, TO_STRING); MAP.put(REPEATABLE_CONTAINER_TARGET_SET_NOT_A_SUBSET, "Target set of container annotation ''{0}'' must be a subset of the target set of contained annotation ''{1}''. This code will be prohibited in Kotlin 1.6", TO_STRING, TO_STRING); MAP.put(REPEATABLE_CONTAINER_TARGET_SET_NOT_A_SUBSET_ERROR, "Target set of container annotation ''{0}'' must be a subset of the target set of contained annotation ''{1}''", TO_STRING, TO_STRING); + MAP.put(REPEATABLE_ANNOTATION_HAS_NESTED_CLASS_NAMED_CONTAINER, "Repeatable annotation cannot have a nested class named 'Container'. This name is reserved for auto-generated container class"); + MAP.put(REPEATABLE_ANNOTATION_HAS_NESTED_CLASS_NAMED_CONTAINER_ERROR, "Repeatable annotation cannot have a nested class named 'Container'. This name is reserved for auto-generated container class"); MAP.put(JVM_PACKAGE_NAME_CANNOT_BE_EMPTY, "''@JvmPackageName'' annotation value cannot be empty"); MAP.put(JVM_PACKAGE_NAME_MUST_BE_VALID_NAME, "''@JvmPackageName'' annotation value must be a valid dot-qualified name of a package"); diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/ErrorsJvm.java b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/ErrorsJvm.java index b3c49cde010..d74e6ec1e79 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/ErrorsJvm.java +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/ErrorsJvm.java @@ -83,6 +83,8 @@ public interface ErrorsJvm { DiagnosticFactory4 REPEATABLE_CONTAINER_HAS_SHORTER_RETENTION_ERROR = DiagnosticFactory4.create(ERROR); DiagnosticFactory2 REPEATABLE_CONTAINER_TARGET_SET_NOT_A_SUBSET = DiagnosticFactory2.create(WARNING); DiagnosticFactory2 REPEATABLE_CONTAINER_TARGET_SET_NOT_A_SUBSET_ERROR = DiagnosticFactory2.create(ERROR); + DiagnosticFactory0 REPEATABLE_ANNOTATION_HAS_NESTED_CLASS_NAMED_CONTAINER = DiagnosticFactory0.create(WARNING); + DiagnosticFactory0 REPEATABLE_ANNOTATION_HAS_NESTED_CLASS_NAMED_CONTAINER_ERROR = DiagnosticFactory0.create(WARNING); DiagnosticFactory1 ANNOTATION_IS_NOT_APPLICABLE_TO_MULTIFILE_CLASSES = DiagnosticFactory1.create(ERROR); diff --git a/compiler/testData/diagnostics/tests/annotations/repeatable/nestedClassContainer_1_5.fir.kt b/compiler/testData/diagnostics/tests/annotations/repeatable/nestedClassContainer_1_5.fir.kt new file mode 100644 index 00000000000..77d90f161a4 --- /dev/null +++ b/compiler/testData/diagnostics/tests/annotations/repeatable/nestedClassContainer_1_5.fir.kt @@ -0,0 +1,21 @@ +// !LANGUAGE: -RepeatableAnnotations -RepeatableAnnotationContainerConstraints +// FULL_JDK + +@Repeatable +annotation class A1 { + class Container +} + + +@java.lang.annotation.Repeatable(D1::class) +annotation class B1 { + class Container +} +annotation class D1(val value: Array) + +@Repeatable +@java.lang.annotation.Repeatable(D2::class) +annotation class B2 { + class Container +} +annotation class D2(val value: Array) diff --git a/compiler/testData/diagnostics/tests/annotations/repeatable/nestedClassContainer_1_5.kt b/compiler/testData/diagnostics/tests/annotations/repeatable/nestedClassContainer_1_5.kt new file mode 100644 index 00000000000..2ad24687db3 --- /dev/null +++ b/compiler/testData/diagnostics/tests/annotations/repeatable/nestedClassContainer_1_5.kt @@ -0,0 +1,21 @@ +// !LANGUAGE: -RepeatableAnnotations -RepeatableAnnotationContainerConstraints +// FULL_JDK + +@Repeatable +annotation class A1 { + class Container +} + + +@java.lang.annotation.Repeatable(D1::class) +annotation class B1 { + class Container +} +annotation class D1(val value: Array) + +@Repeatable +@java.lang.annotation.Repeatable(D2::class) +annotation class B2 { + class Container +} +annotation class D2(val value: Array) diff --git a/compiler/testData/diagnostics/tests/annotations/repeatable/nestedClassContainer_1_5.txt b/compiler/testData/diagnostics/tests/annotations/repeatable/nestedClassContainer_1_5.txt new file mode 100644 index 00000000000..ad3a71091cc --- /dev/null +++ b/compiler/testData/diagnostics/tests/annotations/repeatable/nestedClassContainer_1_5.txt @@ -0,0 +1,59 @@ +package + +@kotlin.annotation.Repeatable public final annotation class A1 : kotlin.Annotation { + public constructor A1() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + + public final class Container { + public constructor Container() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } +} + +@java.lang.annotation.Repeatable(value = D1::class) public final annotation class B1 : kotlin.Annotation { + public constructor B1() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + + public final class Container { + public constructor Container() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } +} + +@kotlin.annotation.Repeatable @java.lang.annotation.Repeatable(value = D2::class) public final annotation class B2 : kotlin.Annotation { + public constructor B2() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + + public final class Container { + public constructor Container() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } +} + +public final annotation class D1 : kotlin.Annotation { + public constructor D1(/*0*/ value: kotlin.Array) + public final val value: kotlin.Array + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final annotation class D2 : kotlin.Annotation { + public constructor D2(/*0*/ value: kotlin.Array) + public final val value: kotlin.Array + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/testData/diagnostics/tests/annotations/repeatable/nestedClassContainer_1_6.fir.kt b/compiler/testData/diagnostics/tests/annotations/repeatable/nestedClassContainer_1_6.fir.kt new file mode 100644 index 00000000000..c7c21af8fa6 --- /dev/null +++ b/compiler/testData/diagnostics/tests/annotations/repeatable/nestedClassContainer_1_6.fir.kt @@ -0,0 +1,21 @@ +// !LANGUAGE: +RepeatableAnnotations +RepeatableAnnotationContainerConstraints +// FULL_JDK + +@Repeatable +annotation class A1 { + class Container +} + + +@java.lang.annotation.Repeatable(D1::class) +annotation class B1 { + class Container +} +annotation class D1(val value: Array) + +@Repeatable +@java.lang.annotation.Repeatable(D2::class) +annotation class B2 { + class Container +} +annotation class D2(val value: Array) diff --git a/compiler/testData/diagnostics/tests/annotations/repeatable/nestedClassContainer_1_6.kt b/compiler/testData/diagnostics/tests/annotations/repeatable/nestedClassContainer_1_6.kt new file mode 100644 index 00000000000..09b1221c190 --- /dev/null +++ b/compiler/testData/diagnostics/tests/annotations/repeatable/nestedClassContainer_1_6.kt @@ -0,0 +1,21 @@ +// !LANGUAGE: +RepeatableAnnotations +RepeatableAnnotationContainerConstraints +// FULL_JDK + +@Repeatable +annotation class A1 { + class Container +} + + +@java.lang.annotation.Repeatable(D1::class) +annotation class B1 { + class Container +} +annotation class D1(val value: Array) + +@Repeatable +@java.lang.annotation.Repeatable(D2::class) +annotation class B2 { + class Container +} +annotation class D2(val value: Array) diff --git a/compiler/testData/diagnostics/tests/annotations/repeatable/nestedClassContainer_1_6.txt b/compiler/testData/diagnostics/tests/annotations/repeatable/nestedClassContainer_1_6.txt new file mode 100644 index 00000000000..ad3a71091cc --- /dev/null +++ b/compiler/testData/diagnostics/tests/annotations/repeatable/nestedClassContainer_1_6.txt @@ -0,0 +1,59 @@ +package + +@kotlin.annotation.Repeatable public final annotation class A1 : kotlin.Annotation { + public constructor A1() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + + public final class Container { + public constructor Container() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } +} + +@java.lang.annotation.Repeatable(value = D1::class) public final annotation class B1 : kotlin.Annotation { + public constructor B1() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + + public final class Container { + public constructor Container() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } +} + +@kotlin.annotation.Repeatable @java.lang.annotation.Repeatable(value = D2::class) public final annotation class B2 : kotlin.Annotation { + public constructor B2() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + + public final class Container { + public constructor Container() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } +} + +public final annotation class D1 : kotlin.Annotation { + public constructor D1(/*0*/ value: kotlin.Array) + public final val value: kotlin.Array + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final annotation class D2 : kotlin.Annotation { + public constructor D2(/*0*/ value: kotlin.Array) + public final val value: kotlin.Array + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} 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 2b87dcfa096..81c42d5369a 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 @@ -2183,6 +2183,18 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { public void testKotlinRepeatable_1_6() throws Exception { runTest("compiler/testData/diagnostics/tests/annotations/repeatable/kotlinRepeatable_1_6.kt"); } + + @Test + @TestMetadata("nestedClassContainer_1_5.kt") + public void testNestedClassContainer_1_5() throws Exception { + runTest("compiler/testData/diagnostics/tests/annotations/repeatable/nestedClassContainer_1_5.kt"); + } + + @Test + @TestMetadata("nestedClassContainer_1_6.kt") + public void testNestedClassContainer_1_6() throws Exception { + runTest("compiler/testData/diagnostics/tests/annotations/repeatable/nestedClassContainer_1_6.kt"); + } } @Nested diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java b/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java index f05f0b09c75..c185ff775da 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java @@ -2177,6 +2177,18 @@ public class DiagnosisCompilerTestFE10TestdataTestGenerated extends AbstractDiag public void testKotlinRepeatable_1_6() throws Exception { runTest("compiler/testData/diagnostics/tests/annotations/repeatable/kotlinRepeatable_1_6.kt"); } + + @Test + @TestMetadata("nestedClassContainer_1_5.kt") + public void testNestedClassContainer_1_5() throws Exception { + runTest("compiler/testData/diagnostics/tests/annotations/repeatable/nestedClassContainer_1_5.kt"); + } + + @Test + @TestMetadata("nestedClassContainer_1_6.kt") + public void testNestedClassContainer_1_6() throws Exception { + runTest("compiler/testData/diagnostics/tests/annotations/repeatable/nestedClassContainer_1_6.kt"); + } } @Nested