Forbid non-intended usages of Experimental and markers
Experimental and UseExperimental can only be used as annotations or qualifiers (to allow "Experimental.Level.*"); experimental markers can only be used as annotations or qualifiers, or as left-hand side of a ::class literal in arguments to UseExperimental/WasExperimental. This is needed because we're not yet sure of the design of this feature and would like to retain the possibility to drop these declarations (Experimental, UseExperimental) altogether. If they were going to be used as types, it would be problematic because we can't simply delete something from stdlib, should deprecate it first. With this change, these declarations can only be used if the user has opted into using the experimental API somehow (for example, with `-Xuse-experimental=kotlin.Experimental`), so we won't stop conforming to our deprecation policy if we decide to remove these declarations in the future
This commit is contained in:
+3
-1
@@ -1,7 +1,9 @@
|
||||
// !USE_EXPERIMENTAL: kotlin.Experimental
|
||||
|
||||
annotation class NotAMarker
|
||||
|
||||
<!USE_EXPERIMENTAL_WITHOUT_ARGUMENTS!>@UseExperimental<!>
|
||||
fun f1() {}
|
||||
|
||||
<!USE_EXPERIMENTAL_ARGUMENT_IS_NOT_MARKER!>@UseExperimental(UseExperimental::class)<!>
|
||||
<!USE_EXPERIMENTAL_ARGUMENT_IS_NOT_MARKER!>@UseExperimental(NotAMarker::class)<!>
|
||||
fun f2() {}
|
||||
|
||||
+8
-1
@@ -1,4 +1,11 @@
|
||||
package
|
||||
|
||||
@kotlin.UseExperimental(markerClass = {}) public fun f1(): kotlin.Unit
|
||||
@kotlin.UseExperimental(markerClass = {kotlin.UseExperimental::class}) public fun f2(): kotlin.Unit
|
||||
@kotlin.UseExperimental(markerClass = {NotAMarker::class}) public fun f2(): kotlin.Unit
|
||||
|
||||
public final annotation class NotAMarker : kotlin.Annotation {
|
||||
public constructor NotAMarker()
|
||||
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
|
||||
}
|
||||
|
||||
+54
@@ -0,0 +1,54 @@
|
||||
// !USE_EXPERIMENTAL: kotlin.Experimental
|
||||
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
||||
|
||||
package test
|
||||
|
||||
import kotlin.reflect.KClass
|
||||
|
||||
// Usages in import should be OK
|
||||
import kotlin.Experimental.Level.*
|
||||
import kotlin.Experimental.Level
|
||||
import kotlin.Experimental
|
||||
|
||||
// Usages with FQ names should be OK
|
||||
|
||||
@kotlin.Experimental(kotlin.Experimental.Level.ERROR)
|
||||
annotation class M
|
||||
|
||||
|
||||
// Usages as types should be errors
|
||||
|
||||
fun f1(e: <!EXPERIMENTAL_CAN_ONLY_BE_USED_AS_ANNOTATION!>Experimental<!>) {}
|
||||
fun f2(u: <!EXPERIMENTAL_CAN_ONLY_BE_USED_AS_ANNOTATION!>UseExperimental<!>?) {}
|
||||
|
||||
typealias Experimental0 = <!EXPERIMENTAL_CAN_ONLY_BE_USED_AS_ANNOTATION!>Experimental<!>
|
||||
typealias UseExperimental0 = <!EXPERIMENTAL_CAN_ONLY_BE_USED_AS_ANNOTATION!>UseExperimental<!>
|
||||
fun f3(e: Experimental0 /* TODO */) {}
|
||||
fun f4(u: UseExperimental0 /* TODO */) {}
|
||||
|
||||
|
||||
// Usages as ::class literals should be errors
|
||||
|
||||
annotation class VarargKClasses(vararg val k: KClass<*>)
|
||||
|
||||
@VarargKClasses(
|
||||
<!EXPERIMENTAL_CAN_ONLY_BE_USED_AS_ANNOTATION!>Experimental<!>::class,
|
||||
<!EXPERIMENTAL_CAN_ONLY_BE_USED_AS_ANNOTATION!>UseExperimental<!>::class,
|
||||
kotlin.<!EXPERIMENTAL_CAN_ONLY_BE_USED_AS_ANNOTATION!>Experimental<!>::class,
|
||||
kotlin.<!EXPERIMENTAL_CAN_ONLY_BE_USED_AS_ANNOTATION!>UseExperimental<!>::class
|
||||
)
|
||||
fun f5() {}
|
||||
|
||||
|
||||
// Usages of markers as types should be errors
|
||||
|
||||
@Experimental
|
||||
annotation class Marker
|
||||
|
||||
fun f6(m: <!EXPERIMENTAL_MARKER_CAN_ONLY_BE_USED_AS_ANNOTATION_OR_ARGUMENT_IN_USE_EXPERIMENTAL!>Marker<!>) {}
|
||||
fun f7(): List<<!EXPERIMENTAL_MARKER_CAN_ONLY_BE_USED_AS_ANNOTATION_OR_ARGUMENT_IN_USE_EXPERIMENTAL!>Marker<!>>? = null
|
||||
fun f8(): test.<!EXPERIMENTAL_MARKER_CAN_ONLY_BE_USED_AS_ANNOTATION_OR_ARGUMENT_IN_USE_EXPERIMENTAL!>Marker<!>? = null
|
||||
|
||||
typealias Marker0 = <!EXPERIMENTAL_MARKER_CAN_ONLY_BE_USED_AS_ANNOTATION_OR_ARGUMENT_IN_USE_EXPERIMENTAL!>Marker<!>
|
||||
|
||||
fun f9(m: <!EXPERIMENTAL_MARKER_CAN_ONLY_BE_USED_AS_ANNOTATION_OR_ARGUMENT_IN_USE_EXPERIMENTAL!>Marker0<!>) {}
|
||||
+38
@@ -0,0 +1,38 @@
|
||||
package
|
||||
|
||||
package test {
|
||||
public fun f1(/*0*/ e: kotlin.Experimental): kotlin.Unit
|
||||
public fun f2(/*0*/ u: kotlin.UseExperimental?): kotlin.Unit
|
||||
public fun f3(/*0*/ e: test.Experimental0 /* = kotlin.Experimental */): kotlin.Unit
|
||||
public fun f4(/*0*/ u: test.UseExperimental0 /* = kotlin.UseExperimental */): kotlin.Unit
|
||||
@test.VarargKClasses(k = {kotlin.Experimental::class, kotlin.UseExperimental::class, kotlin.Experimental::class, kotlin.UseExperimental::class}) public fun f5(): kotlin.Unit
|
||||
public fun f6(/*0*/ m: test.Marker): kotlin.Unit
|
||||
public fun f7(): kotlin.collections.List<test.Marker>?
|
||||
public fun f8(): test.Marker?
|
||||
public fun f9(/*0*/ m: test.Marker0 /* = test.Marker */): kotlin.Unit
|
||||
|
||||
@kotlin.Experimental(level = Level.ERROR) public final annotation class M : kotlin.Annotation {
|
||||
public constructor M()
|
||||
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.Experimental public final annotation class Marker : kotlin.Annotation {
|
||||
public constructor Marker()
|
||||
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 VarargKClasses : kotlin.Annotation {
|
||||
public constructor VarargKClasses(/*0*/ vararg k: kotlin.reflect.KClass<*> /*kotlin.Array<out kotlin.reflect.KClass<*>>*/)
|
||||
public final val k: kotlin.Array<out kotlin.reflect.KClass<*>>
|
||||
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 typealias Experimental0 = kotlin.Experimental
|
||||
public typealias Marker0 = test.Marker
|
||||
public typealias UseExperimental0 = kotlin.UseExperimental
|
||||
}
|
||||
+4
-4
@@ -1,6 +1,6 @@
|
||||
// !API_VERSION: 1.2
|
||||
// !USE_EXPERIMENTAL: kotlin.Experimental
|
||||
// !DIAGNOSTICS: -INVISIBLE_MEMBER -INVISIBLE_REFERENCE -NEWER_VERSION_IN_SINCE_KOTLIN -UNUSED_PARAMETER
|
||||
// !DIAGNOSTICS: -INVISIBLE_MEMBER -INVISIBLE_REFERENCE -NEWER_VERSION_IN_SINCE_KOTLIN
|
||||
|
||||
@SinceKotlin("1.3")
|
||||
fun newPublishedFun() {}
|
||||
@@ -21,7 +21,7 @@ val newValExperimentalInThePast = ""
|
||||
@WasExperimental(Marker::class)
|
||||
class NewClassExperimentalInThePast
|
||||
|
||||
fun use1(c: <!UNRESOLVED_REFERENCE!>NewClassExperimentalInThePast<!>) {
|
||||
fun use1() {
|
||||
<!UNRESOLVED_REFERENCE!>newPublishedFun<!>()
|
||||
<!UNRESOLVED_REFERENCE!>newFunExperimentalInThePast<!>()
|
||||
<!UNRESOLVED_REFERENCE!>newValExperimentalInThePast<!>
|
||||
@@ -29,7 +29,7 @@ fun use1(c: <!UNRESOLVED_REFERENCE!>NewClassExperimentalInThePast<!>) {
|
||||
}
|
||||
|
||||
@UseExperimental(Marker::class)
|
||||
fun use2(c: NewClassExperimentalInThePast) {
|
||||
fun use2() {
|
||||
<!UNRESOLVED_REFERENCE!>newPublishedFun<!>()
|
||||
newFunExperimentalInThePast()
|
||||
newValExperimentalInThePast
|
||||
@@ -37,7 +37,7 @@ fun use2(c: NewClassExperimentalInThePast) {
|
||||
}
|
||||
|
||||
@Marker
|
||||
fun use3(c: NewClassExperimentalInThePast) {
|
||||
fun use3() {
|
||||
<!UNRESOLVED_REFERENCE!>newPublishedFun<!>()
|
||||
newFunExperimentalInThePast()
|
||||
newValExperimentalInThePast
|
||||
|
||||
Reference in New Issue
Block a user