JS: support explicit SAM constructor invocation

This commit is contained in:
Anton Bannykh
2020-04-09 15:34:11 +03:00
parent 0ee32ea9c5
commit 81798282b9
10 changed files with 99 additions and 4 deletions
@@ -10,11 +10,37 @@ fun interface CharToAny {
fun invoke(c: Char): Any
}
fun foo(c: CharToAny): Any = c.invoke('O')
fun interface GenericToAny<T> {
fun invoke(t: T): Any
}
fun interface GenericCharToAny: GenericToAny<Char>
fun foo1(c: CharToAny): Any = c.invoke('1')
fun <T> foo2(t: T, g: GenericToAny<T>): Any = g.invoke(t)
fun foo3(c: GenericCharToAny) = c.invoke('3')
fun box(): String {
if (foo { it } !is Char) return "fail"
val c1 = foo1 { it }
if (c1 !is Char || c1 != '1') return "fail1"
val c2 = foo2<Char>('2') { it }
if (c2 !is Char || c2 != '2') return "fail2"
val c3 = foo3 { it }
if (c3 !is Char || c3 != '3') return "fail3"
val c4 = CharToAny { it }.invoke('4')
if (c4 !is Char || c4 != '4') return "fail4"
val c5 = GenericToAny<Char> { it }.invoke('5')
if (c5 !is Char || c5 != '5') return "fail5"
val c6 = GenericCharToAny { it }.invoke('6')
if (c6 !is Char || c6 != '6') return "fail6"
return "OK"
}
@@ -0,0 +1,33 @@
// !LANGUAGE: +FunctionalInterfaceConversion
// IGNORE_BACKEND_FIR: JVM_IR
// SKIP_DCE_DRIVEN
fun interface S {
fun invoke(): String
}
fun interface G<T> {
fun foo(t: T): T
}
fun interface C: G<Char>
fun interface C2 {
fun bar(c: Char): Char
}
fun box(): String {
val g = G<Int> { it * 10 }
if (g.foo(2) != 20) return "fail1"
val g2 = G { a: Char -> a + 1 }
if (g2.foo('a') != 'b') return "fail2"
val c = C { it + 2 }
if (c.foo('A') != 'C') return "fail3"
val c2 = C2 { it + 3 }
if (c2.bar('0') != '3') return "fail4"
return S { "OK" }.invoke()
}