From b4c622d43389544572f99ec26b8e655b9ad00a7f Mon Sep 17 00:00:00 2001 From: Alexey Andreev Date: Mon, 18 Sep 2017 13:07:14 +0300 Subject: [PATCH] JS: optimize destructuring declaration when possible See KT-8285 --- .../js/test/semantics/BoxJsTestGenerated.java | 6 ++++++ .../expression/ExpressionVisitor.java | 4 +++- .../singleComponentDestructuring.kt | 20 +++++++++++++++++++ 3 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 js/js.translator/testData/box/expression/evaluationOrder/singleComponentDestructuring.kt diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java index cc81d170942..a30b8206f44 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java @@ -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"); diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/ExpressionVisitor.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/ExpressionVisitor.java index 2c0f36ff01f..6b2f6fd7da5 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/ExpressionVisitor.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/ExpressionVisitor.java @@ -122,7 +122,9 @@ public final class ExpressionVisitor extends TranslatorVisitor { 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); } diff --git a/js/js.translator/testData/box/expression/evaluationOrder/singleComponentDestructuring.kt b/js/js.translator/testData/box/expression/evaluationOrder/singleComponentDestructuring.kt new file mode 100644 index 00000000000..4864f46d380 --- /dev/null +++ b/js/js.translator/testData/box/expression/evaluationOrder/singleComponentDestructuring.kt @@ -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 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" +} \ No newline at end of file