Make EXPERIMENTAL_API_USAGE_ERR warning till 1.6 for signature type case

This commit is contained in:
Mikhail Glukhikh
2021-07-26 12:56:04 +03:00
parent 810def829c
commit 84bd347841
23 changed files with 435 additions and 27 deletions
@@ -1,4 +1,5 @@
// !USE_EXPERIMENTAL: kotlin.RequiresOptIn
// LANGUAGE: +OptInContagiousSignatures
@RequiresOptIn
@Retention(AnnotationRetention.BINARY)
@@ -1,4 +1,5 @@
// !USE_EXPERIMENTAL: kotlin.RequiresOptIn
// LANGUAGE: +OptInContagiousSignatures
@RequiresOptIn
@Retention(AnnotationRetention.BINARY)
@@ -0,0 +1,124 @@
// !USE_EXPERIMENTAL: kotlin.RequiresOptIn
// LANGUAGE: -OptInContagiousSignatures
@RequiresOptIn
@Retention(AnnotationRetention.BINARY)
@Target(AnnotationTarget.CLASS, AnnotationTarget.PROPERTY, AnnotationTarget.TYPEALIAS)
annotation class Marker
@Marker
interface Some
abstract class User {
abstract fun createSome(): <!EXPERIMENTAL_API_USAGE_ERROR!>Some<!>
fun <!EXPERIMENTAL_API_USAGE_ERROR!>Some<!>?.onSome() {}
fun withSome(some: <!EXPERIMENTAL_API_USAGE_ERROR!>Some<!>? = null) {}
fun use() {
val something = <!EXPERIMENTAL_API_USAGE_ERROR!>createSome<!>()
val somethingOther: <!EXPERIMENTAL_API_USAGE_ERROR!>Some<!> = <!EXPERIMENTAL_API_USAGE_ERROR!>createSome<!>()
null.<!EXPERIMENTAL_API_USAGE_ERROR!>onSome<!>()
<!EXPERIMENTAL_API_USAGE_ERROR!>withSome<!>()
}
}
data class DataClass(@property:Marker val x: Int)
fun useDataClass(d: DataClass) {
// Should have error in both
d.<!EXPERIMENTAL_API_USAGE_ERROR!>x<!>
val (x) = d
}
typealias My = <!EXPERIMENTAL_API_USAGE_ERROR!>Some<!>
fun my(my: <!EXPERIMENTAL_API_USAGE_ERROR!>My<!>) {}
fun your(my: <!EXPERIMENTAL_API_USAGE_ERROR!>Some<!>) {}
@Marker
interface ExperimentalType {
fun foo() {}
fun bar() {}
}
@OptIn(Marker::class)
interface NotExperimentalExtension : ExperimentalType {
override fun foo() {}
}
fun use(arg: NotExperimentalExtension) {
arg.foo()
arg.<!EXPERIMENTAL_API_USAGE_ERROR!>bar<!>()
}
@Marker
interface I
@OptIn(Marker::class)
class A : I
@OptIn(Marker::class)
class B : I
@OptIn(Marker::class)
typealias MyList = ArrayList<I>
@Marker
typealias YourList = ArrayList<String>
fun main() {
val x = <!EXPERIMENTAL_API_USAGE_ERROR!>listOf<!>(A(), B())
val y = MyList()
val z = YourList()
YourList().add("")
}
@Marker
class C {
operator fun getValue(x: Any?, y: Any?): String = ""
}
object O {
@OptIn(Marker::class)
operator fun provideDelegate(x: Any?, y: Any?): C = C()
}
val x: String by <!EXPERIMENTAL_API_USAGE_ERROR!>O<!>
@Marker
class OperatorContainer : Comparable<OperatorContainer> {
@OptIn(Marker::class)
override fun compareTo(other: OperatorContainer): Int {
return 0
}
}
@OptIn(Marker::class)
class AnotherContainer : Iterable<C> {
@OptIn(Marker::class)
override fun iterator(): Iterator<C> {
return object : Iterator<C> {
override fun hasNext(): Boolean {
return false
}
override fun next(): C {
throw java.util.NoSuchElementException()
}
}
}
}
@OptIn(Marker::class)
operator fun String.minus(s: String) = OperatorContainer()
@OptIn(Marker::class)
operator fun String.invoke() = OperatorContainer()
fun operatorContainerUsage(s: String, a: AnotherContainer) {
val res1 = s <!EXPERIMENTAL_API_USAGE_ERROR!>-<!> s
val res2 = <!EXPERIMENTAL_API_USAGE_ERROR!>s<!>()
val res3 = <!EXPERIMENTAL_API_USAGE_ERROR!>res1<!> <!EXPERIMENTAL_API_USAGE_ERROR!>><!> <!EXPERIMENTAL_API_USAGE_ERROR!>res2<!>
<!EXPERIMENTAL_API_USAGE_ERROR, EXPERIMENTAL_API_USAGE_ERROR, EXPERIMENTAL_API_USAGE_ERROR, EXPERIMENTAL_API_USAGE_ERROR!>for (c in a) {}<!>
}
@@ -0,0 +1,124 @@
// !USE_EXPERIMENTAL: kotlin.RequiresOptIn
// LANGUAGE: -OptInContagiousSignatures
@RequiresOptIn
@Retention(AnnotationRetention.BINARY)
@Target(AnnotationTarget.CLASS, AnnotationTarget.PROPERTY, AnnotationTarget.TYPEALIAS)
annotation class Marker
@Marker
interface Some
abstract class User {
abstract fun createSome(): <!EXPERIMENTAL_API_USAGE_ERROR!>Some<!>
fun <!EXPERIMENTAL_API_USAGE_ERROR!>Some<!>?.onSome() {}
fun withSome(some: <!EXPERIMENTAL_API_USAGE_ERROR!>Some<!>? = null) {}
fun use() {
val something = <!EXPERIMENTAL_API_USAGE_FUTURE_ERROR!>createSome<!>()
val somethingOther: <!EXPERIMENTAL_API_USAGE_ERROR!>Some<!> = <!EXPERIMENTAL_API_USAGE_FUTURE_ERROR!>createSome<!>()
null.<!EXPERIMENTAL_API_USAGE_FUTURE_ERROR!>onSome<!>()
<!EXPERIMENTAL_API_USAGE_FUTURE_ERROR!>withSome<!>()
}
}
data class DataClass(@property:Marker val x: Int)
fun useDataClass(d: DataClass) {
// Should have error in both
d.<!EXPERIMENTAL_API_USAGE_ERROR!>x<!>
val (<!EXPERIMENTAL_API_USAGE_ERROR!>x<!>) = d
}
typealias My = <!EXPERIMENTAL_API_USAGE_ERROR!>Some<!>
fun my(my: <!EXPERIMENTAL_API_USAGE_FUTURE_ERROR!>My<!>) {}
fun your(my: <!EXPERIMENTAL_API_USAGE_ERROR!>Some<!>) {}
@Marker
interface ExperimentalType {
fun foo() {}
fun bar() {}
}
@OptIn(Marker::class)
interface NotExperimentalExtension : ExperimentalType {
override fun foo() {}
}
fun use(arg: NotExperimentalExtension) {
arg.foo()
arg.<!EXPERIMENTAL_API_USAGE_ERROR!>bar<!>()
}
@Marker
interface I
@OptIn(Marker::class)
class A : I
@OptIn(Marker::class)
class B : I
@OptIn(Marker::class)
typealias MyList = ArrayList<I>
@Marker
typealias YourList = ArrayList<String>
fun main() {
val x = <!EXPERIMENTAL_API_USAGE_FUTURE_ERROR!>listOf<!>(A(), B())
val y = <!EXPERIMENTAL_API_USAGE_FUTURE_ERROR!>MyList<!>()
val z = <!EXPERIMENTAL_API_USAGE_FUTURE_ERROR!>YourList<!>()
<!EXPERIMENTAL_API_USAGE_FUTURE_ERROR!>YourList<!>().add("")
}
@Marker
class C {
operator fun getValue(x: Any?, y: Any?): String = ""
}
object O {
@OptIn(Marker::class)
operator fun provideDelegate(x: Any?, y: Any?): C = C()
}
val x: String by <!EXPERIMENTAL_API_USAGE_ERROR, EXPERIMENTAL_API_USAGE_FUTURE_ERROR!>O<!>
@Marker
class OperatorContainer : Comparable<OperatorContainer> {
@OptIn(Marker::class)
override fun compareTo(other: OperatorContainer): Int {
return 0
}
}
@OptIn(Marker::class)
class AnotherContainer : Iterable<C> {
@OptIn(Marker::class)
override fun iterator(): Iterator<C> {
return object : Iterator<C> {
override fun hasNext(): Boolean {
return false
}
override fun next(): C {
throw java.util.NoSuchElementException()
}
}
}
}
@OptIn(Marker::class)
operator fun String.minus(s: String) = OperatorContainer()
@OptIn(Marker::class)
operator fun String.invoke() = OperatorContainer()
fun operatorContainerUsage(s: String, a: AnotherContainer) {
val res1 = s <!EXPERIMENTAL_API_USAGE_FUTURE_ERROR!>-<!> s
val res2 = <!EXPERIMENTAL_API_USAGE_FUTURE_ERROR!>s<!>()
val res3 = <!EXPERIMENTAL_API_USAGE_FUTURE_ERROR!>res1<!> <!EXPERIMENTAL_API_USAGE_FUTURE_ERROR!>><!> <!EXPERIMENTAL_API_USAGE_FUTURE_ERROR!>res2<!>
for (c in <!EXPERIMENTAL_API_USAGE_FUTURE_ERROR!>a<!>) {}
}
@@ -0,0 +1,116 @@
package
public val x: kotlin.String
public fun main(): kotlin.Unit
public fun my(/*0*/ my: My /* = Some */): kotlin.Unit
public fun operatorContainerUsage(/*0*/ s: kotlin.String, /*1*/ a: AnotherContainer): kotlin.Unit
public fun use(/*0*/ arg: NotExperimentalExtension): kotlin.Unit
public fun useDataClass(/*0*/ d: DataClass): kotlin.Unit
public fun your(/*0*/ my: Some): kotlin.Unit
@kotlin.OptIn(markerClass = {Marker::class}) public operator fun kotlin.String.invoke(): OperatorContainer
@kotlin.OptIn(markerClass = {Marker::class}) public operator fun kotlin.String.minus(/*0*/ s: kotlin.String): OperatorContainer
@kotlin.OptIn(markerClass = {Marker::class}) public final class A : I {
public constructor A()
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.OptIn(markerClass = {Marker::class}) public final class AnotherContainer : kotlin.collections.Iterable<C> {
public constructor AnotherContainer()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
@kotlin.OptIn(markerClass = {Marker::class}) public open override /*1*/ fun iterator(): kotlin.collections.Iterator<C>
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@kotlin.OptIn(markerClass = {Marker::class}) public final class B : I {
public constructor B()
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
}
@Marker public final class C {
public constructor C()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public final operator fun getValue(/*0*/ x: kotlin.Any?, /*1*/ y: kotlin.Any?): kotlin.String
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public final data class DataClass {
public constructor DataClass(/*0*/ x: kotlin.Int)
@Marker public final val x: kotlin.Int
public final operator /*synthesized*/ fun component1(): kotlin.Int
public final /*synthesized*/ fun copy(/*0*/ x: kotlin.Int = ...): DataClass
public open override /*1*/ /*synthesized*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*synthesized*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String
}
@Marker public interface ExperimentalType {
public open fun bar(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open fun foo(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@Marker public interface I {
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.RequiresOptIn @kotlin.annotation.Retention(value = AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS, AnnotationTarget.PROPERTY, AnnotationTarget.TYPEALIAS}) 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
}
@kotlin.OptIn(markerClass = {Marker::class}) public interface NotExperimentalExtension : ExperimentalType {
public open override /*1*/ /*fake_override*/ fun bar(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ fun foo(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public object O {
private constructor O()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
@kotlin.OptIn(markerClass = {Marker::class}) public final operator fun provideDelegate(/*0*/ x: kotlin.Any?, /*1*/ y: kotlin.Any?): C
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@Marker public final class OperatorContainer : kotlin.Comparable<OperatorContainer> {
public constructor OperatorContainer()
@kotlin.OptIn(markerClass = {Marker::class}) public open override /*1*/ fun compareTo(/*0*/ other: OperatorContainer): kotlin.Int
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
}
@Marker public interface Some {
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 abstract class User {
public constructor User()
public abstract fun createSome(): Some
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 fun use(): kotlin.Unit
public final fun withSome(/*0*/ some: Some? = ...): kotlin.Unit
public final fun Some?.onSome(): kotlin.Unit
}
public typealias My = Some
@kotlin.OptIn(markerClass = {Marker::class}) public typealias MyList = kotlin.collections.ArrayList<I>
@Marker public typealias YourList = kotlin.collections.ArrayList<kotlin.String>