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');
}
```
20 lines
522 B
Kotlin
Vendored
20 lines
522 B
Kotlin
Vendored
// NO_CHECK_LAMBDA_INLINING
|
|
// FILE: 1.kt
|
|
package test
|
|
|
|
inline fun inlineFun(capturedParam: String, noinline lambda: () -> String = { capturedParam }): String {
|
|
return call(lambda)
|
|
}
|
|
|
|
fun call(lambda: () -> String ) = lambda()
|
|
|
|
// FILE: 2.kt
|
|
// CHECK_CALLED_IN_SCOPE: function=inlineFun$lambda scope=box TARGET_BACKENDS=JS
|
|
// HAS_NO_CAPTURED_VARS: function=box except=box$lambda;call IGNORED_BACKENDS=JS
|
|
// CHECK_CALLED_IN_SCOPE: function=call scope=box
|
|
import test.*
|
|
|
|
fun box(): String {
|
|
return inlineFun("OK")
|
|
}
|