JS: lambda constructor cannot have sideEffect
This commit is contained in:
@@ -31,6 +31,7 @@ public fun JsExpression.canHaveOwnSideEffect(): Boolean =
|
|||||||
is JsArrayLiteral,
|
is JsArrayLiteral,
|
||||||
is JsNameRef -> false
|
is JsNameRef -> false
|
||||||
is JsBinaryOperation -> getOperator().isAssignment()
|
is JsBinaryOperation -> getOperator().isAssignment()
|
||||||
|
is JsInvocation -> !isFunctionCreatorInvocation(this)
|
||||||
else -> true
|
else -> true
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -43,6 +44,5 @@ public fun JsExpression.shouldHaveOwnAlias(): Boolean =
|
|||||||
is JsConditional,
|
is JsConditional,
|
||||||
is JsBinaryOperation,
|
is JsBinaryOperation,
|
||||||
is JsArrayLiteral -> true
|
is JsArrayLiteral -> true
|
||||||
is JsInvocation -> !isFunctionCreatorInvocation(this)
|
|
||||||
else -> canHaveOwnSideEffect()
|
else -> canHaveOwnSideEffect()
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,49 @@
|
|||||||
|
package foo
|
||||||
|
|
||||||
|
/* This tests checks, that lambda fabric invocation is not extracted.
|
||||||
|
|
||||||
|
An example:
|
||||||
|
fun foo() {
|
||||||
|
val status = "OK"
|
||||||
|
run { println(status) }
|
||||||
|
}
|
||||||
|
|
||||||
|
It's compiled to something like:
|
||||||
|
function foo() {
|
||||||
|
var status = "OK";
|
||||||
|
run(foo$(status));
|
||||||
|
}
|
||||||
|
|
||||||
|
function foo$(status) {
|
||||||
|
return function() {
|
||||||
|
console.log(status);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
Thus, we need to be sure, that foo$() is not extracted to some temporary var.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// CHECK_NOT_CALLED: max
|
||||||
|
// CHECK_NOT_CALLED: box$f
|
||||||
|
// CHECK_NOT_CALLED: box$f_0
|
||||||
|
|
||||||
|
inline fun max(getA: ()->Int, b: Int): Int {
|
||||||
|
val a = getA()
|
||||||
|
log("max($a, $b)")
|
||||||
|
|
||||||
|
if (a > b) return a
|
||||||
|
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
val one = 1
|
||||||
|
val two = 2
|
||||||
|
val three = 3
|
||||||
|
|
||||||
|
val test = max({ fizz(one) }, max({ fizz(two) }, buzz(three)))
|
||||||
|
assertEquals(3, test)
|
||||||
|
assertEquals("buzz(3);fizz(2);max(2, 3);fizz(1);max(1, 3);", pullLog())
|
||||||
|
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user