d7d86a0e95
If a lambda expression does not capture any local variables, convert
it to a global free function and replace the lambda creation with
a reference to that function.
Example: for the following Kotlin code
```kotlin
fun foo(f: () -> Unit) = f()
fun bar() = foo { console.log("hello") }
```
before this patch, we generated:
```js
function foo(f) {
return f();
}
function bar() {
return foo(bar$lambda());
}
function bar$lambda() {
return function () {
console.log('hello');
};
}
```
after this patch, we generate:
```js
function foo(f) {
return f();
}
function bar() {
return foo(bar$lambda);
}
function bar$lambda() {
console.log('hello');
}
```
57 lines
1.6 KiB
Kotlin
Vendored
57 lines
1.6 KiB
Kotlin
Vendored
// WITH_STDLIB
|
|
// CHECK_CASES_COUNT: function=bar1_u51tkt$ count=3 TARGET_BACKENDS=JS
|
|
// CHECK_IF_COUNT: function=bar1_u51tkt$ count=0 TARGET_BACKENDS=JS
|
|
// CHECK_CASES_COUNT: function=A$bar2$lambda count=3 TARGET_BACKENDS=JS
|
|
// CHECK_CASES_COUNT: function=A$bar2$lambda count=4 IGNORED_BACKENDS=JS
|
|
// CHECK_IF_COUNT: function=A$bar2$lambda count=0
|
|
|
|
import kotlin.test.assertEquals
|
|
|
|
enum class Season {
|
|
WINTER,
|
|
SPRING,
|
|
SUMMER,
|
|
AUTUMN
|
|
}
|
|
|
|
class A {
|
|
public fun bar1(x : Season) : String {
|
|
when (x) {
|
|
Season.WINTER, Season.SPRING -> return "winter_spring"
|
|
Season.SPRING -> return "spring"
|
|
Season.SUMMER -> return "summer"
|
|
else -> return "autumn";
|
|
}
|
|
}
|
|
|
|
public fun bar2(y : Season) : String {
|
|
return bar3(y) { x ->
|
|
when (x) {
|
|
Season.WINTER, Season.SPRING -> "winter_spring"
|
|
Season.SPRING -> "spring"
|
|
Season.SUMMER -> "summer"
|
|
else -> "autumn"
|
|
}
|
|
}
|
|
}
|
|
|
|
private fun bar3(x : Season, block : (Season) -> String) = block(x)
|
|
}
|
|
|
|
fun box() : String {
|
|
val a = A()
|
|
|
|
assertEquals("winter_spring", a.bar1(Season.WINTER))
|
|
assertEquals("winter_spring", a.bar1(Season.SPRING))
|
|
assertEquals("summer", a.bar1(Season.SUMMER))
|
|
assertEquals("autumn", a.bar1(Season.AUTUMN))
|
|
|
|
assertEquals("winter_spring", a.bar2(Season.WINTER))
|
|
assertEquals("winter_spring", a.bar2(Season.SPRING))
|
|
assertEquals("summer", a.bar2(Season.SUMMER))
|
|
assertEquals("autumn", a.bar2(Season.AUTUMN))
|
|
|
|
|
|
return "OK"
|
|
}
|