Introduce basic suspend conversion in FE

#KT-15917 In Progress
This commit is contained in:
Mikhail Zarechenskiy
2020-04-22 04:30:58 +03:00
parent 9e04ebdace
commit 537a59d6ca
23 changed files with 388 additions and 6 deletions
@@ -0,0 +1,23 @@
// !LANGUAGE: +SuspendConversion
// !DIAGNOSTICS: -UNUSED_PARAMETER
fun foo1(f: suspend () -> String) {}
fun foo2(f: suspend (Int) -> String) {}
fun foo3(f: suspend () -> Unit) {}
fun test(
f0: suspend () -> String,
f1: () -> String,
f2: (Int) -> String,
f3: () -> Unit,
) {
foo1 { "str" }
foo1(f0)
<!INAPPLICABLE_CANDIDATE!>foo1<!>(f1)
<!INAPPLICABLE_CANDIDATE!>foo2<!>(f2)
<!INAPPLICABLE_CANDIDATE!>foo3<!>(f3)
<!INAPPLICABLE_CANDIDATE!>foo1<!>(f2)
<!INAPPLICABLE_CANDIDATE!>foo1<!>(f3)
}
@@ -0,0 +1,23 @@
// !LANGUAGE: +SuspendConversion
// !DIAGNOSTICS: -UNUSED_PARAMETER
fun foo1(f: suspend () -> String) {}
fun foo2(f: suspend (Int) -> String) {}
fun foo3(f: suspend () -> Unit) {}
fun test(
f0: suspend () -> String,
f1: () -> String,
f2: (Int) -> String,
f3: () -> Unit,
) {
foo1 { "str" }
foo1(f0)
foo1(f1)
foo2(f2)
foo3(f3)
foo1(<!TYPE_MISMATCH!>f2<!>)
foo1(<!TYPE_MISMATCH!>f3<!>)
}
@@ -0,0 +1,6 @@
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
@@ -0,0 +1,30 @@
// !LANGUAGE: +SuspendConversion
// !DIAGNOSTICS: -UNUSED_PARAMETER -UNUSED_EXPRESSION
class Inv2<T, K>
fun <T> foo1(f: suspend (T) -> String): T = TODO()
fun <T> foo2(f: suspend () -> T): T = TODO()
fun <T, K> foo3(f: suspend (T) -> K): Inv2<T, K> = TODO()
fun <I> id(e: I): I = e
fun test(f: (Int) -> String, g: () -> String) {
val a0 = <!INAPPLICABLE_CANDIDATE!>foo1<!>(f)
a0
val a1 = <!INAPPLICABLE_CANDIDATE!>foo2<!>(g)
a1
val a2 = <!INAPPLICABLE_CANDIDATE!>foo3<!>(f)
a2
val a3 = <!INAPPLICABLE_CANDIDATE!>foo1<!>(id(f))
a3
val a4 = <!INAPPLICABLE_CANDIDATE!>foo2<!>(id(g))
a4
val a5 = <!INAPPLICABLE_CANDIDATE!>foo3<!>(id(f))
a5
}
@@ -0,0 +1,30 @@
// !LANGUAGE: +SuspendConversion
// !DIAGNOSTICS: -UNUSED_PARAMETER -UNUSED_EXPRESSION
class Inv2<T, K>
fun <T> foo1(f: suspend (T) -> String): T = TODO()
fun <T> foo2(f: suspend () -> T): T = TODO()
fun <T, K> foo3(f: suspend (T) -> K): Inv2<T, K> = TODO()
fun <I> id(e: I): I = e
fun test(f: (Int) -> String, g: () -> String) {
val a0 = foo1(f)
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Int")!>a0<!>
val a1 = foo2(g)
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.String")!>a1<!>
val a2 = foo3(f)
<!DEBUG_INFO_EXPRESSION_TYPE("Inv2<kotlin.Int, kotlin.String>")!>a2<!>
val a3 = foo1(id(f))
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Int")!>a3<!>
val a4 = foo2(id(g))
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.String")!>a4<!>
val a5 = foo3(id(f))
<!DEBUG_INFO_EXPRESSION_TYPE("Inv2<kotlin.Int, kotlin.String>")!>a5<!>
}
@@ -0,0 +1,14 @@
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
}
@@ -0,0 +1,11 @@
// !LANGUAGE: +SuspendConversion
// !DIAGNOSTICS: -UNUSED_PARAMETER
fun foo(f: () -> String, g: suspend () -> String, h: suspend () -> String) {}
fun test(f: () -> String, g: suspend () -> String) {
<!INAPPLICABLE_CANDIDATE!>foo<!>(f, f, f)
<!INAPPLICABLE_CANDIDATE!>foo<!>(f, { "str" }, f)
<!INAPPLICABLE_CANDIDATE!>foo<!>(f, f, g)
foo(f, g, g)
}
@@ -0,0 +1,11 @@
// !LANGUAGE: +SuspendConversion
// !DIAGNOSTICS: -UNUSED_PARAMETER
fun foo(f: () -> String, g: suspend () -> String, h: suspend () -> String) {}
fun test(f: () -> String, g: suspend () -> String) {
foo(f, f, f)
foo(f, { "str" }, f)
foo(f, f, g)
foo(f, g, g)
}
@@ -0,0 +1,4 @@
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
@@ -0,0 +1,23 @@
// !LANGUAGE: -SuspendConversion
// !DIAGNOSTICS: -UNUSED_PARAMETER
fun foo1(f: suspend () -> String) {}
fun foo2(f: suspend (Int) -> String) {}
fun foo3(f: suspend () -> Unit) {}
fun test(
f0: suspend () -> String,
f1: () -> String,
f2: (Int) -> String,
f3: () -> Unit,
) {
foo1 { "str" }
foo1(f0)
<!INAPPLICABLE_CANDIDATE!>foo1<!>(f1)
<!INAPPLICABLE_CANDIDATE!>foo2<!>(f2)
<!INAPPLICABLE_CANDIDATE!>foo3<!>(f3)
<!INAPPLICABLE_CANDIDATE!>foo1<!>(f2)
<!INAPPLICABLE_CANDIDATE!>foo1<!>(f3)
}
@@ -0,0 +1,23 @@
// !LANGUAGE: -SuspendConversion
// !DIAGNOSTICS: -UNUSED_PARAMETER
fun foo1(f: suspend () -> String) {}
fun foo2(f: suspend (Int) -> String) {}
fun foo3(f: suspend () -> Unit) {}
fun test(
f0: suspend () -> String,
f1: () -> String,
f2: (Int) -> String,
f3: () -> Unit,
) {
foo1 { "str" }
foo1(f0)
foo1(<!TYPE_MISMATCH!>f1<!>)
foo2(<!TYPE_MISMATCH!>f2<!>)
foo3(<!TYPE_MISMATCH!>f3<!>)
foo1(<!TYPE_MISMATCH!>f2<!>)
foo1(<!TYPE_MISMATCH!>f3<!>)
}
@@ -0,0 +1,6 @@
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