Warn about suspend extension functional types as supertypes

They will become error in 2.0

 #KT-58529 Fixed
 #KT-49175 Fixed
This commit is contained in:
Ilmir Usmanov
2023-05-15 20:24:53 +02:00
parent b19116d3af
commit f3a22e0ac4
12 changed files with 145 additions and 0 deletions
@@ -0,0 +1,24 @@
class A : <!SUPERTYPE_IS_EXTENSION_FUNCTION_TYPE!>suspend Double.() -> Unit<!> {
override suspend fun invoke(p1: Double) {}
}
class B : <!SUPERTYPE_IS_EXTENSION_FUNCTION_TYPE!>suspend Int.(Double) -> Unit<!> {
override suspend fun invoke(p1: Int, p2: Double) {}
}
open class C {}
abstract class A0 : <!SUPERTYPE_IS_EXTENSION_FUNCTION_TYPE!>suspend C.() -> Int<!>
abstract class A1 : <!SUPERTYPE_IS_EXTENSION_FUNCTION_TYPE!>suspend C.(Int) -> Int<!>
abstract class A2 : <!SUPERTYPE_IS_EXTENSION_FUNCTION_TYPE!>suspend C.(Int, String) -> Int<!>
open class D<T> {}
abstract class B0<T> : <!SUPERTYPE_IS_EXTENSION_FUNCTION_TYPE!>suspend D<T>.() -> Int<!>
abstract class B1<T> : <!SUPERTYPE_IS_EXTENSION_FUNCTION_TYPE!>suspend D<T>.(C) -> Int<!>
abstract class B2<T> : <!SUPERTYPE_IS_EXTENSION_FUNCTION_TYPE!>suspend D<T>.(T, C) -> T<!>
interface E<T> {}
abstract class C0: C(), <!SUPERTYPE_IS_EXTENSION_FUNCTION_TYPE!>suspend Int.() -> Double<!>
abstract class C1<T>: C(), E<T>, <!SUPERTYPE_IS_EXTENSION_FUNCTION_TYPE!>suspend Int.(C) -> Double<!>
@@ -0,0 +1,24 @@
class A : <!SUPERTYPE_IS_SUSPEND_EXTENSION_FUNCTION_TYPE!>suspend Double.() -> Unit<!> {
override suspend fun invoke(p1: Double) {}
}
class B : <!SUPERTYPE_IS_SUSPEND_EXTENSION_FUNCTION_TYPE!>suspend Int.(Double) -> Unit<!> {
override suspend fun invoke(p1: Int, p2: Double) {}
}
open class C {}
abstract class A0 : <!SUPERTYPE_IS_SUSPEND_EXTENSION_FUNCTION_TYPE!>suspend C.() -> Int<!>
abstract class A1 : <!SUPERTYPE_IS_SUSPEND_EXTENSION_FUNCTION_TYPE!>suspend C.(Int) -> Int<!>
abstract class A2 : <!SUPERTYPE_IS_SUSPEND_EXTENSION_FUNCTION_TYPE!>suspend C.(Int, String) -> Int<!>
open class D<T> {}
abstract class B0<T> : <!SUPERTYPE_IS_SUSPEND_EXTENSION_FUNCTION_TYPE!>suspend D<T>.() -> Int<!>
abstract class B1<T> : <!SUPERTYPE_IS_SUSPEND_EXTENSION_FUNCTION_TYPE!>suspend D<T>.(C) -> Int<!>
abstract class B2<T> : <!SUPERTYPE_IS_SUSPEND_EXTENSION_FUNCTION_TYPE!>suspend D<T>.(T, C) -> T<!>
interface E<T> {}
abstract class C0: C(), <!SUPERTYPE_IS_SUSPEND_EXTENSION_FUNCTION_TYPE!>suspend Int.() -> Double<!>
abstract class C1<T>: C(), E<T>, <!SUPERTYPE_IS_SUSPEND_EXTENSION_FUNCTION_TYPE!>suspend Int.(C) -> Double<!>
@@ -0,0 +1,26 @@
// FIR_IDENTICAL
// !LANGUAGE: +FunctionalTypeWithExtensionAsSupertype
class A : suspend Double.() -> Unit {
override suspend fun invoke(p1: Double) {}
}
class B : suspend Int.(Double) -> Unit {
override suspend fun invoke(p1: Int, p2: Double) {}
}
open class C {}
abstract class A0 : suspend C.() -> Int
abstract class A1 : suspend C.(Int) -> Int
abstract class A2 : suspend C.(Int, String) -> Int
open class D<T> {}
abstract class B0<T> : suspend D<T>.() -> Int
abstract class B1<T> : suspend D<T>.(C) -> Int
abstract class B2<T> : suspend D<T>.(T, C) -> T
interface E<T> {}
abstract class C0: C(), suspend Int.() -> Double
abstract class C1<T>: C(), E<T>, suspend Int.(C) -> Double