// TARGET_BACKEND: JS_IR // FILE: a.kt @JsExport fun exclamate(s: String) = "$s!" @Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE") @JsFun(""" function (a, b) { return _.exclamate(a) + _.exclamate(b); } """) external fun exclamateAndConcat(`a!`: String, `b!`: String): String @Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE") @JsPolyfill(""" if (typeof String.prototype.myAwesomePolyfill === "undefined") { Object.defineProperty(String.prototype, "myAwesomePolyfill", { value: function () { return this + "!"; } }); } """) internal inline fun String.myAwesomePolyfill(): Boolean = asDynamic() .myAwesomePolyfill() val walter1VarDecl = "var walter1 = _.exclamate('Walter');" val jesse1VarDecl = "var jesse1 = _.exclamate(jesse);" // FILE: test.kt fun box() { exclamateAndConcat( "hello", "world") val jesse = "Jesse" js( "_.exclamate(jesse);") // Local variable is captured js( "_.exclamate('Walter');") // No local variables captured js( walter1VarDecl + "_.exclamate(walter1);") js( jesse1VarDecl + "_.exclamate(jesse1);") "foo".myAwesomePolyfill() js(""" function localFun(hello, world) { return '' + hello + ', ' + world + '!'; } """) js("localFun('hello', 'world')") } // EXPECTATIONS // a.kt:11 box: // a.kt:6 exclamate: s="hello":kotlin.String // a.kt:12 box: // a.kt:6 exclamate: s="world":kotlin.String // test.kt:43 box: // test.kt:45 box: jesse="Jesse":kotlin.String // a.kt:6 exclamate: s="Jesse":kotlin.String // test.kt:47 box: jesse="Jesse":kotlin.String // a.kt:6 exclamate: s="Walter":kotlin.String // test.kt:49 box: jesse="Jesse":kotlin.String // a.kt:6 exclamate: s="Walter":kotlin.String // test.kt:49 box: jesse="Jesse":kotlin.String, walter1="Walter!":kotlin.String // a.kt:6 exclamate: s="Walter!":kotlin.String // test.kt:52 box: jesse="Jesse":kotlin.String, walter1="Walter!":kotlin.String // a.kt:6 exclamate: s="Jesse":kotlin.String // test.kt:52 box: jesse="Jesse":kotlin.String, walter1="Walter!":kotlin.String, jesse1="Jesse!":kotlin.String // a.kt:6 exclamate: s="Jesse!":kotlin.String // a.kt:29 box: jesse="Jesse":kotlin.String, walter1="Walter!":kotlin.String, jesse1="Jesse!":kotlin.String // a.kt:22 value: // test.kt:63 box: jesse="Jesse":kotlin.String, walter1="Walter!":kotlin.String, jesse1="Jesse!":kotlin.String // test.kt:59 localFun: hello="hello":kotlin.String, world="world":kotlin.String // test.kt:64 box: jesse="Jesse":kotlin.String, walter1="Walter!":kotlin.String, jesse1="Jesse!":kotlin.String