// !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: RequiresOptIn) {} fun f2(u: OptIn?) {} typealias Experimental0 = RequiresOptIn typealias OptIn0 = OptIn fun f3(e: Experimental0 /* TODO */) {} fun f4(u: OptIn0 /* TODO */) {} // Usages as ::class literals should be errors annotation class VarargKClasses(vararg val k: KClass<*>) @VarargKClasses( RequiresOptIn::class, OptIn::class, kotlin.RequiresOptIn::class, 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: A.Marker) {} fun f7(): ListMarker>? = null fun f8(): test.A.Marker? = null typealias Marker0 = A.Marker typealias Marker1 = Marker0 fun f9(m: Marker0) {} // Usages of markers as qualifiers are errors as well (we can lift this restriction for select cases) fun f10(m: A.Marker.NestedClass) { val a = A.Marker.value A.Marker.Companion.value A.Marker.bar() A.Marker.Companion.bar() } fun f11(m: 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 import test.A.Marker.NestedClass import test.A.Marker.NestedClass.NestedClass2 import test.A.Marker.Companion import test.A.Marker.Companion.value // FILE: usage-from-other-file-2.kt import test.Marker0 import test.Marker0.NestedClass // FILE: usage-from-other-file-3.kt import test.Marker1 import test.Marker1.NestedClass fun f12(m: test.A.Marker.NestedClass.NestedClass2) {}