JS: optimize destructuring declaration when possible
See KT-8285
This commit is contained in:
@@ -2332,6 +2332,12 @@ public class BoxJsTestGenerated extends AbstractBoxJsTest {
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("singleComponentDestructuring.kt")
|
||||
public void testSingleComponentDestructuring() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/expression/evaluationOrder/singleComponentDestructuring.kt");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("whenAsMinusArgument.kt")
|
||||
public void testWhenAsMinusArgument() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/expression/evaluationOrder/whenAsMinusArgument.kt");
|
||||
|
||||
+3
-1
@@ -122,7 +122,9 @@ public final class ExpressionVisitor extends TranslatorVisitor<JsNode> {
|
||||
assert jetInitializer != null : "Initializer for multi declaration must be not null";
|
||||
JsExpression initializer = Translation.translateAsExpression(jetInitializer, context);
|
||||
JsName parameterName = JsScope.declareTemporary();
|
||||
context.addStatementToCurrentBlock(JsAstUtils.newVar(parameterName, initializer));
|
||||
JsVars tempVarDeclaration = JsAstUtils.newVar(parameterName, initializer);
|
||||
MetadataProperties.setSynthetic(tempVarDeclaration, true);
|
||||
context.addStatementToCurrentBlock(tempVarDeclaration);
|
||||
return DestructuringDeclarationTranslator.translate(multiDeclaration, JsAstUtils.pureFqn(parameterName, null), context);
|
||||
}
|
||||
|
||||
|
||||
+20
@@ -0,0 +1,20 @@
|
||||
// EXPECTED_REACHABLE_NODES: 1029
|
||||
// CHECK_VARS_COUNT: function=test count=2
|
||||
var log = ""
|
||||
|
||||
fun test() {
|
||||
val (a, _) = idAndLog(Pair(idAndLog(1), idAndLog(2)))
|
||||
val (_, b) = idAndLog(Pair(idAndLog(3), idAndLog(4)))
|
||||
log += "result:$a,$b;"
|
||||
}
|
||||
|
||||
fun <T> idAndLog(x: T): T {
|
||||
log += "$x;"
|
||||
return x
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
test()
|
||||
if (log != "1;2;(1, 2);3;4;(3, 4);result:1,4;") return "fail: $log"
|
||||
return "OK"
|
||||
}
|
||||
Reference in New Issue
Block a user