blob: 1931633f931fd5e464b072158fd285f3e49a8d16 [file]
package foo
external fun Function(vararg argsAndCode: String): Function
external interface Function {
// JsFun("(f, a) -> f(a)")
@nativeInvoke
operator fun invoke(a: Int?): Int?
@nativeInvoke
operator fun invoke(a: String?): String?
@nativeInvoke
operator fun invoke(a: String?, b: Int?, c: Int? = definedExternally): String?
@nativeInvoke
operator fun invoke(a: Int, b: Int, c: Int): Int
@nativeInvoke
fun baz(a: Int?, b: Int? = definedExternally, c: Int? = definedExternally): Int?
@nativeInvoke
fun bar(a: String?, b: Int? = definedExternally, c: Int? = definedExternally): String?
}
fun box(): String {
val f = Function("a", "return a")
val g = Function("a", "b", "c", "return a + (b || 10) + (c || 100)")
assertEquals(1, f(1))
assertEquals("ok", f("ok"))
assertEquals("ok34100", g("ok", 34)) // g("ok", 34, null)
assertEquals(10, g(1, 4, 5))
assertEquals("ok3410", g("ok", 34, 10))
assertEquals(105, g.baz(1, 4)) // g(1, 4, null)
assertEquals(45, g.baz(1, c = 34)) // g(1, null, 34)
assertEquals("ok34100", g.bar("ok", 34)) // g("ok", 34, null)
assertEquals("ok1034", g.bar("ok", 10, 34)) // g("ok", 10, 34)
return "OK"
}