| // RUN_PIPELINE_TILL: FRONTEND |
| // LANGUAGE: +NestedClassesInAnnotations |
| // OPT_IN: kotlin.RequiresOptIn |
| // DIAGNOSTICS: -UNUSED_PARAMETER |
| // FILE: api.kt |
| |
| package test |
| |
| import kotlin.reflect.KClass |
| |
| // Usages in import should be OK |
| import kotlin.RequiresOptIn.Level.* |
| import kotlin.RequiresOptIn.Level |
| import kotlin.RequiresOptIn |
| |
| // Usages with FQ names should be OK |
| |
| @kotlin.RequiresOptIn(level = kotlin.RequiresOptIn.Level.ERROR) |
| @Retention(AnnotationRetention.BINARY) |
| annotation class M |
| |
| |
| // Usages as types should be errors |
| |
| fun f1(e: <!OPT_IN_CAN_ONLY_BE_USED_AS_ANNOTATION!>RequiresOptIn<!>) {} |
| fun f2(u: <!OPT_IN_CAN_ONLY_BE_USED_AS_ANNOTATION!>OptIn?<!>) {} |
| |
| typealias Experimental0 = <!OPT_IN_CAN_ONLY_BE_USED_AS_ANNOTATION!>RequiresOptIn<!> |
| typealias OptIn0 = <!OPT_IN_CAN_ONLY_BE_USED_AS_ANNOTATION!>OptIn<!> |
| fun f3(e: <!OPT_IN_CAN_ONLY_BE_USED_AS_ANNOTATION!>Experimental0<!> /* TODO */) {} |
| fun f4(u: <!OPT_IN_CAN_ONLY_BE_USED_AS_ANNOTATION!>OptIn0<!> /* TODO */) {} |
| |
| |
| // Usages as ::class literals should be errors |
| |
| annotation class VarargKClasses(vararg val k: KClass<*>) |
| |
| @VarargKClasses( |
| <!OPT_IN_CAN_ONLY_BE_USED_AS_ANNOTATION!>RequiresOptIn<!>::class, |
| <!OPT_IN_CAN_ONLY_BE_USED_AS_ANNOTATION!>OptIn<!>::class, |
| <!OPT_IN_CAN_ONLY_BE_USED_AS_ANNOTATION!>kotlin.RequiresOptIn<!>::class, |
| <!OPT_IN_CAN_ONLY_BE_USED_AS_ANNOTATION!>kotlin.OptIn<!>::class |
| ) |
| fun f5() {} |
| |
| |
| // Usages of markers as types should be errors |
| |
| object A { |
| @RequiresOptIn |
| annotation class Marker { |
| class NestedClass() { |
| class NestedClass2 |
| |
| fun f12(m: NestedClass2){ |
| val x = value |
| bar() |
| } |
| } |
| |
| companion object { |
| const val value = 42 |
| |
| fun bar(){} |
| } |
| } |
| } |
| |
| fun f6(m: <!OPT_IN_MARKER_CAN_ONLY_BE_USED_AS_ANNOTATION_OR_ARGUMENT_IN_OPT_IN!>A.Marker<!>) {} |
| fun f7(): List<<!OPT_IN_MARKER_CAN_ONLY_BE_USED_AS_ANNOTATION_OR_ARGUMENT_IN_OPT_IN!>A.Marker<!>>? = null |
| fun f8(): <!OPT_IN_MARKER_CAN_ONLY_BE_USED_AS_ANNOTATION_OR_ARGUMENT_IN_OPT_IN!>test.A.Marker?<!> = null |
| |
| typealias Marker0 = <!OPT_IN_MARKER_CAN_ONLY_BE_USED_AS_ANNOTATION_OR_ARGUMENT_IN_OPT_IN!>A.Marker<!> |
| |
| typealias Marker1 = <!OPT_IN_MARKER_CAN_ONLY_BE_USED_AS_ANNOTATION_OR_ARGUMENT_IN_OPT_IN!>Marker0<!> |
| |
| fun f9(m: <!OPT_IN_MARKER_CAN_ONLY_BE_USED_AS_ANNOTATION_OR_ARGUMENT_IN_OPT_IN!>Marker0<!>) {} |
| |
| |
| // Usages of markers as qualifiers are errors as well (we can lift this restriction for select cases) |
| |
| fun f10(m: <!OPT_IN_MARKER_CAN_ONLY_BE_USED_AS_ANNOTATION_OR_ARGUMENT_IN_OPT_IN!>A.Marker.NestedClass<!>) { |
| val a = <!OPT_IN_MARKER_CAN_ONLY_BE_USED_AS_ANNOTATION_OR_ARGUMENT_IN_OPT_IN!>A.Marker.value<!> |
| <!OPT_IN_MARKER_CAN_ONLY_BE_USED_AS_ANNOTATION_OR_ARGUMENT_IN_OPT_IN!>A.Marker.Companion.value<!> |
| <!OPT_IN_MARKER_CAN_ONLY_BE_USED_AS_ANNOTATION_OR_ARGUMENT_IN_OPT_IN!>A.Marker.bar()<!> |
| <!OPT_IN_MARKER_CAN_ONLY_BE_USED_AS_ANNOTATION_OR_ARGUMENT_IN_OPT_IN!>A.Marker.Companion.bar()<!> |
| } |
| |
| fun f11(m: <!OPT_IN_MARKER_CAN_ONLY_BE_USED_AS_ANNOTATION_OR_ARGUMENT_IN_OPT_IN!>A.Marker.NestedClass.NestedClass2<!>) {} |
| |
| |
| // FILE: usage-from-other-file.kt |
| |
| // Usages of markers in import statements should be OK, but not as qualifiers to import their nested classes |
| |
| import test.A.Marker |
| <!OPT_IN_MARKER_CAN_ONLY_BE_USED_AS_ANNOTATION_OR_ARGUMENT_IN_OPT_IN!>import test.A.Marker.NestedClass<!> |
| <!OPT_IN_MARKER_CAN_ONLY_BE_USED_AS_ANNOTATION_OR_ARGUMENT_IN_OPT_IN!>import test.A.Marker.NestedClass.NestedClass2<!> |
| <!OPT_IN_MARKER_CAN_ONLY_BE_USED_AS_ANNOTATION_OR_ARGUMENT_IN_OPT_IN!>import test.A.Marker.Companion<!> |
| <!OPT_IN_MARKER_CAN_ONLY_BE_USED_AS_ANNOTATION_OR_ARGUMENT_IN_OPT_IN!>import test.A.Marker.Companion.value<!> |
| |
| // FILE: usage-from-other-file-2.kt |
| import test.Marker0 |
| <!OPT_IN_MARKER_CAN_ONLY_BE_USED_AS_ANNOTATION_OR_ARGUMENT_IN_OPT_IN!>import test.Marker0.NestedClass<!> |
| |
| // FILE: usage-from-other-file-3.kt |
| import test.Marker1 |
| <!OPT_IN_MARKER_CAN_ONLY_BE_USED_AS_ANNOTATION_OR_ARGUMENT_IN_OPT_IN!>import test.Marker1.NestedClass<!> |
| |
| fun f12(m: <!OPT_IN_MARKER_CAN_ONLY_BE_USED_AS_ANNOTATION_OR_ARGUMENT_IN_OPT_IN!>test.A.Marker.NestedClass.NestedClass2<!>) {} |
| |
| /* GENERATED_FIR_TAGS: annotationDeclaration, classDeclaration, classReference, companionObject, const, |
| functionDeclaration, integerLiteral, localProperty, nestedClass, nullableType, objectDeclaration, outProjection, |
| primaryConstructor, propertyDeclaration, starProjection, typeAliasDeclaration, vararg */ |