| 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" | |
| } |