PSI2IR fix suspend conversion tests

- support chained suspend conversion + SAM conversion
- support suspend conversion in vararg elements
This commit is contained in:
Dmitry Petrov
2021-07-15 20:09:04 +03:00
committed by teamcityserver
parent 0cc6fbbc6e
commit d41fc0b599
47 changed files with 592 additions and 328 deletions
@@ -1,3 +1,6 @@
// IGNORE_BACKEND: JVM
// IGNORE_BACKEND: WASM
// !LANGUAGE: +SuspendConversion
// !DIAGNOSTICS: -UNUSED_PARAMETER
@@ -1,6 +0,0 @@
package
public fun foo1(/*0*/ f: suspend () -> kotlin.String): kotlin.Unit
public fun foo2(/*0*/ f: suspend (kotlin.Int) -> kotlin.String): kotlin.Unit
public fun foo3(/*0*/ f: suspend () -> kotlin.Unit): kotlin.Unit
public fun test(/*0*/ f0: suspend () -> kotlin.String, /*1*/ f1: () -> kotlin.String, /*2*/ f2: (kotlin.Int) -> kotlin.String, /*3*/ f3: () -> kotlin.Unit): kotlin.Unit
@@ -1,5 +1,6 @@
// !LANGUAGE: +SuspendConversion
// !DIAGNOSTICS: -UNUSED_PARAMETER
// IGNORE_BACKEND: WASM
fun foo1(f: suspend () -> Unit) {}
fun bar1() {}
@@ -1,8 +0,0 @@
package
public fun bar1(): kotlin.Unit
public fun bar2(/*0*/ x: kotlin.Int): kotlin.Unit
public fun bar2(/*0*/ s: kotlin.String): kotlin.Unit
public fun foo1(/*0*/ f: suspend () -> kotlin.Unit): kotlin.Unit
public fun </*0*/ T> foo2(/*0*/ e: T, /*1*/ f: suspend (T) -> kotlin.Unit): kotlin.Unit
public fun test(): kotlin.Unit
@@ -1,7 +1,13 @@
// TARGET_BACKEND: JVM
// ^ TODO: get rid of T::class.java
// IGNORE_BACKEND: JVM
// !LANGUAGE: +SuspendConversion
// !DIAGNOSTICS: -UNUSED_PARAMETER -UNUSED_EXPRESSION
// WITH_RUNTIME
class C
class Inv2<T, K>
inline fun <reified T> materialize(): T = T::class.java.newInstance()
@@ -10,42 +16,30 @@ inline fun <reified T> foo1(crossinline f: suspend (T) -> String): T = materiali
inline fun <reified T> foo2(crossinline f: suspend () -> T): T = materialize()
inline fun <reified T, K> foo3(crossinline f: suspend (T) -> K): Inv2<T, K> = Inv2()
fun <T> foo11(f: suspend (T) -> String): T = 1 as T
fun <T> foo11(f: suspend (T) -> String): T = C() as T
fun <T> foo21(f: suspend () -> T): T = "" as T
fun <T, K> foo31(f: suspend (T) -> K): Inv2<T, K> = Inv2()
fun <I> id(e: I): I = e
fun test(f: (Int) -> String, g: () -> String) {
fun test(f: (C) -> String, g: () -> String) {
val a0 = foo1(f)
val a01 = foo11(f)
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Int")!>a0<!>
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Int")!>a01<!>
val a1 = foo2(g)
val a11 = foo21(g)
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.String")!>a1<!>
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.String")!>a11<!>
val a2 = foo3(f)
val a21 = foo31(f)
<!DEBUG_INFO_EXPRESSION_TYPE("Inv2<kotlin.Int, kotlin.String>")!>a2<!>
<!DEBUG_INFO_EXPRESSION_TYPE("Inv2<kotlin.Int, kotlin.String>")!>a21<!>
val a3 = foo1(id(f))
val a31 = foo11(id(f))
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Int")!>a3<!>
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Int")!>a31<!>
val a4 = foo2(id(g))
val a41 = foo21(id(g))
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.String")!>a4<!>
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.String")!>a41<!>
val a5 = foo3(id(f))
val a51 = foo31(id(f))
<!DEBUG_INFO_EXPRESSION_TYPE("Inv2<kotlin.Int, kotlin.String>")!>a5<!>
<!DEBUG_INFO_EXPRESSION_TYPE("Inv2<kotlin.Int, kotlin.String>")!>a51<!>
}
fun box(): String {
@@ -1,14 +0,0 @@
package
public fun </*0*/ T> foo1(/*0*/ f: suspend (T) -> kotlin.String): T
public fun </*0*/ T> foo2(/*0*/ f: suspend () -> T): T
public fun </*0*/ T, /*1*/ K> foo3(/*0*/ f: suspend (T) -> K): Inv2<T, K>
public fun </*0*/ I> id(/*0*/ e: I): I
public fun test(/*0*/ f: (kotlin.Int) -> kotlin.String, /*1*/ g: () -> kotlin.String): kotlin.Unit
public final class Inv2</*0*/ T, /*1*/ K> {
public constructor Inv2</*0*/ T, /*1*/ K>()
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
}
@@ -1,6 +1,6 @@
// FIR_IDENTICAL
// !LANGUAGE: +SuspendConversion
// !DIAGNOSTICS: -UNUSED_PARAMETER
// IGNORE_BACKEND: JVM
// IGNORE_BACKEND_FIR: JVM_IR
fun interface SuspendRunnable {
suspend fun invoke()
@@ -1,11 +0,0 @@
package
public fun foo(/*0*/ s: SuspendRunnable): kotlin.Unit
public fun test(/*0*/ f: () -> kotlin.Unit): kotlin.Unit
public fun interface SuspendRunnable {
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 abstract suspend fun invoke(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@@ -1,13 +1,17 @@
// !LANGUAGE: +SuspendConversion
// !DIAGNOSTICS: -UNUSED_PARAMETER
// IGNORE_BACKEND: JVM
// IGNORE_BACKEND: WASM
fun foo(x: () -> Int) {}
fun foo(x: suspend () -> Int) {}
var foo1 = false
var foo2 = false
fun foo(x: () -> Int) { foo1 = true }
fun foo(x: suspend () -> Int) { foo2 = true}
fun usualCall(): Int = 42
suspend fun suspendCall(): Int = 42
// candidate without suspend conversions is more specific
fun test2(f: () -> Int, g: suspend () -> Int) {
foo(f)
foo(g)
@@ -15,5 +19,8 @@ fun test2(f: () -> Int, g: suspend () -> Int) {
fun box(): String {
test2({ 1 }, { 2 })
return "OK"
return if (foo1 && foo2)
"OK"
else
"foo1: $foo1; foo2: $foo2"
}
@@ -1,8 +0,0 @@
package
public fun foo(/*0*/ x: () -> kotlin.Int): kotlin.Unit
public fun foo(/*0*/ x: suspend () -> kotlin.Int): kotlin.Unit
public suspend fun suspendCall(): kotlin.Int
public fun test1(): kotlin.Unit
public fun test2(/*0*/ f: () -> kotlin.Int, /*1*/ g: suspend () -> kotlin.Int): kotlin.Unit
public fun usualCall(): kotlin.Int
@@ -1,6 +1,8 @@
// FIR_IDENTICAL
// !LANGUAGE: +SuspendConversion
// !DIAGNOSTICS: -UNUSED_PARAMETER
// IGNORE_BACKEND: JVM
// IGNORE_BACKEND: WASM
fun foo(f: () -> String, g: suspend () -> String, h: suspend () -> String) {}
@@ -1,4 +0,0 @@
package
public fun foo(/*0*/ f: () -> kotlin.String, /*1*/ g: suspend () -> kotlin.String, /*2*/ h: suspend () -> kotlin.String): kotlin.Unit
public fun test(/*0*/ f: () -> kotlin.String, /*1*/ g: suspend () -> kotlin.String): kotlin.Unit
@@ -1,5 +1,12 @@
// !LANGUAGE: +SuspendConversion
// !DIAGNOSTICS: -UNUSED_PARAMETER -UNUSED_EXPRESSION
// IGNORE_BACKEND: JVM
// IGNORE_BACKEND: WASM
// IGNORE_BACKEND_FIR: JVM_IR
fun interface Runnable {
fun run()
}
fun interface SuspendRunnable {
suspend fun run()
@@ -12,7 +19,7 @@ object Test1 {
fun call(r: SuspendRunnable) {}
fun bar(f: () -> Unit) {
<!DEBUG_INFO_CALL("fqName: Test1.call; typeCall: function")!>call(f)<!>
call(f)
}
}
}
@@ -24,13 +31,13 @@ object Test2 {
fun call(r: SuspendRunnable) {}
fun bar(f: () -> Unit) {
<!DEBUG_INFO_CALL("fqName: Test2.Scope.call; typeCall: function")!>call(f)<!>
call(f)
}
}
}
fun box(): String {
Test2.Scope.bar { }
Test1.Scope.bar { }
Test2.Scope.bar { }
return "OK"
}
@@ -1,42 +0,0 @@
package
public fun interface SuspendRunnable {
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 abstract suspend fun run(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public object Test1 {
private constructor Test1()
public final fun call(/*0*/ r: () -> kotlin.Unit): kotlin.Unit
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 object Scope {
private constructor Scope()
public final fun bar(/*0*/ f: () -> kotlin.Unit): kotlin.Unit
public final fun call(/*0*/ r: SuspendRunnable): kotlin.Unit
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 object Test2 {
private constructor Test2()
public final fun call(/*0*/ r: java.lang.Runnable): kotlin.Unit
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 object Scope {
private constructor Scope()
public final fun bar(/*0*/ f: () -> kotlin.Unit): kotlin.Unit
public final fun call(/*0*/ r: SuspendRunnable): kotlin.Unit
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
}
}
@@ -1,6 +1,8 @@
// !LANGUAGE: +SuspendConversion
// !DIAGNOSTICS: -UNUSED_PARAMETER -UNUSED_EXPRESSION
// WITH_RUNTIME
// IGNORE_BACKEND: WASM
// IGNORE_BACKEND_FIR: JVM_IR
object Test1 {
fun foo(f: () -> Unit) {}
@@ -9,7 +11,7 @@ object Test1 {
fun foo(f: suspend () -> Unit) {}
fun test(g: () -> Unit) {
<!DEBUG_INFO_CALL("fqName: Test1.foo; typeCall: function")!>foo(g)<!>
foo(g)
}
}
}
@@ -25,8 +27,6 @@ object Test2 {
fun test() {
val result = foo(::bar)
val result2 = foo2(::bar)
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Int")!>result<!>
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Int")!>result2<!>
}
}
}
@@ -43,8 +43,6 @@ object Test3 {
fun test() {
val result = foo(::bar)
val result2 = foo2(::bar)
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.String")!>result<!>
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.String")!>result2<!>
}
}
}
@@ -1,54 +0,0 @@
package
public object Test1 {
private constructor Test1()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public final fun foo(/*0*/ f: () -> kotlin.Unit): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
public object Scope {
private constructor Scope()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public final fun foo(/*0*/ f: suspend () -> kotlin.Unit): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public final fun test(/*0*/ g: () -> kotlin.Unit): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
}
public object Test2 {
private constructor Test2()
public final suspend fun bar(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public final fun </*0*/ T> foo(/*0*/ f: suspend () -> T): T
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
public object Scope {
private constructor Scope()
public final fun bar(): kotlin.String
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 final fun test(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
}
public object Test3 {
private constructor Test3()
public final suspend fun bar(/*0*/ x: kotlin.Int = ...): kotlin.Int
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public final fun </*0*/ T> foo(/*0*/ f: suspend () -> T): T
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
public object Scope {
private constructor Scope()
public final fun bar(/*0*/ x: kotlin.Int = ...): kotlin.String
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 final fun test(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
}
@@ -1,6 +1,9 @@
// FIR_IDENTICAL
// !LANGUAGE: +SuspendConversion
// !DIAGNOSTICS: -UNUSED_PARAMETER
// IGNORE_BACKEND: JVM
// IGNORE_BACKEND: WASM
// IGNORE_BACKEND_FIR: JVM_IR
fun useSuspendVararg(vararg sfn: suspend () -> Unit) {}
@@ -1,5 +0,0 @@
package
public fun testSuspendConversionInVarargElementsAll(/*0*/ f1: () -> kotlin.Unit, /*1*/ f2: () -> kotlin.Unit, /*2*/ f3: () -> kotlin.Unit): kotlin.Unit
public fun testSuspendConversionInVarargElementsSome(/*0*/ sf1: suspend () -> kotlin.Unit, /*1*/ f2: () -> kotlin.Unit, /*2*/ sf3: suspend () -> kotlin.Unit): kotlin.Unit
public fun useSuspendVararg(/*0*/ vararg sfn: suspend () -> kotlin.Unit /*kotlin.Array<out suspend () -> kotlin.Unit>*/): kotlin.Unit
@@ -1,6 +1,7 @@
// FIR_IDENTICAL
// !LANGUAGE: +SuspendConversion
// !DIAGNOSTICS: -UNUSED_PARAMETER
// IGNORE_BACKEND: JVM
fun interface SuspendRunnable {
suspend fun invoke()
@@ -17,8 +18,7 @@ suspend fun bar3(s: String = ""): Int = 0
fun box(): String {
foo1(::bar1)
foo1(::bar2)
foo1(::bar3) // Should be ambiguity
foo1(::bar3)
return "OK"
}
@@ -1,15 +0,0 @@
package
public fun bar1(): kotlin.Unit
public fun bar2(/*0*/ s: kotlin.String = ...): kotlin.Int
public fun bar3(): kotlin.Unit
public suspend fun bar3(/*0*/ s: kotlin.String = ...): kotlin.Int
public fun foo1(/*0*/ s: SuspendRunnable): kotlin.Unit
public fun test(): kotlin.Unit
public fun interface SuspendRunnable {
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 abstract suspend fun invoke(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@@ -1,6 +1,7 @@
// FIR_IDENTICAL
// !LANGUAGE: +SuspendConversion
// !DIAGNOSTICS: -UNUSED_PARAMETER
// IGNORE_BACKEND: WASM
fun unitCoercion(f: suspend () -> Unit) {}
fun foo(): Int = 0
@@ -1,11 +0,0 @@
package
public fun all(/*0*/ s: kotlin.String = ...): kotlin.Int
public fun bar(/*0*/ i: kotlin.Int, /*1*/ l: kotlin.Long = ...): kotlin.String
public fun baz(/*0*/ vararg ints: kotlin.Int /*kotlin.IntArray*/): kotlin.String
public fun defaults(/*0*/ f: suspend (kotlin.Int) -> kotlin.String): kotlin.Unit
public fun foo(): kotlin.Int
public fun test(): kotlin.Unit
public fun unitCoercion(/*0*/ f: suspend () -> kotlin.Unit): kotlin.Unit
public fun unitCoercionAndDefaults(/*0*/ f: suspend () -> kotlin.Unit): kotlin.Unit
public fun varargs(/*0*/ f: suspend (kotlin.Int, kotlin.Int, kotlin.Int) -> kotlin.String): kotlin.Unit