From b5218915f8dae55b81f3f78aaefb7db754066e5f Mon Sep 17 00:00:00 2001 From: Alexey Andreev Date: Thu, 22 Jun 2017 16:18:38 +0300 Subject: [PATCH] Fix associativity of generated comma operator in JS BE --- .../org/jetbrains/kotlin/js/util/AstUtil.java | 21 ++----------------- .../operation/IncrementTranslator.java | 11 +++++----- .../kotlin/js/translate/utils/JsAstUtils.java | 6 +++--- 3 files changed, 11 insertions(+), 27 deletions(-) diff --git a/js/js.ast/src/org/jetbrains/kotlin/js/util/AstUtil.java b/js/js.ast/src/org/jetbrains/kotlin/js/util/AstUtil.java index 2dea15e36fc..5be28c415e7 100644 --- a/js/js.ast/src/org/jetbrains/kotlin/js/util/AstUtil.java +++ b/js/js.ast/src/org/jetbrains/kotlin/js/util/AstUtil.java @@ -19,23 +19,6 @@ public final class AstUtil { private AstUtil() { } - /** - * Returns a sequence of expressions (using the binary sequence operator). - * - * @param exprs - expressions to add to sequence - * @return a sequence of expressions. - */ - public static JsBinaryOperation newSequence(JsExpression... exprs) { - if (exprs.length < 2) { - throw new RuntimeException("newSequence expects at least two arguments"); - } - JsExpression result = exprs[exprs.length - 1]; - for (int i = exprs.length - 2; i >= 0; i--) { - result = new JsBinaryOperation(JsBinaryOperator.COMMA, exprs[i], result); - } - return (JsBinaryOperation) result; - } - @Nullable public static T deepCopy(@Nullable T node) { if (node == null) return null; @@ -46,9 +29,9 @@ public final class AstUtil { @NotNull public static List deepCopy(@Nullable List nodes) { - if (nodes == null) return new SmartList(); + if (nodes == null) return new SmartList<>(); - List nodesCopy = new ArrayList(nodes.size()); + List nodesCopy = new ArrayList<>(nodes.size()); for (T node : nodes) { nodesCopy.add(deepCopy(node)); } diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/operation/IncrementTranslator.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/operation/IncrementTranslator.java index c058f89bef3..77dadf4b6a9 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/operation/IncrementTranslator.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/operation/IncrementTranslator.java @@ -16,15 +16,14 @@ package org.jetbrains.kotlin.js.translate.operation; +import com.intellij.psi.tree.IElementType; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.kotlin.descriptors.CallableDescriptor; import org.jetbrains.kotlin.js.backend.ast.JsBinaryOperation; import org.jetbrains.kotlin.js.backend.ast.JsBinaryOperator; import org.jetbrains.kotlin.js.backend.ast.JsBlock; import org.jetbrains.kotlin.js.backend.ast.JsExpression; import org.jetbrains.kotlin.js.backend.ast.metadata.MetadataProperties; -import org.jetbrains.kotlin.js.util.AstUtil; -import com.intellij.psi.tree.IElementType; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.kotlin.descriptors.CallableDescriptor; import org.jetbrains.kotlin.js.translate.context.TemporaryVariable; import org.jetbrains.kotlin.js.translate.context.TranslationContext; import org.jetbrains.kotlin.js.translate.general.AbstractTranslator; @@ -35,6 +34,8 @@ import org.jetbrains.kotlin.psi.KtUnaryExpression; import org.jetbrains.kotlin.resolve.calls.tasks.DynamicCallsKt; import org.jetbrains.kotlin.types.expressions.OperatorConventions; +import java.util.Arrays; + import static org.jetbrains.kotlin.js.translate.reference.AccessTranslationUtils.getAccessTranslator; import static org.jetbrains.kotlin.js.translate.utils.BindingUtils.getCallableDescriptorForOperationExpression; import static org.jetbrains.kotlin.js.translate.utils.PsiUtils.getBaseExpression; @@ -121,7 +122,7 @@ public abstract class IncrementTranslator extends AbstractTranslator { JsExpression result; if (accessBlock.getStatements().size() == 2) { - result = AstUtil.newSequence(t1.assignmentExpression(), variableReassignment, t1.reference()); + result = JsAstUtils.newSequence(Arrays.asList(t1.assignmentExpression(), variableReassignment, t1.reference())); } else { context().getCurrentBlock().getStatements().addAll(accessBlock.getStatements()); diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/JsAstUtils.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/JsAstUtils.java index ce7506ca991..6235b22ddac 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/JsAstUtils.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/JsAstUtils.java @@ -433,9 +433,9 @@ public final class JsAstUtils { if (expressions.size() == 1) { return expressions.get(0); } - JsExpression result = expressions.get(expressions.size() - 1); - for (int i = expressions.size() - 2; i >= 0; i--) { - result = new JsBinaryOperation(JsBinaryOperator.COMMA, expressions.get(i), result); + JsExpression result = expressions.get(0); + for (int i = 1; i < expressions.size(); i++) { + result = new JsBinaryOperation(JsBinaryOperator.COMMA, result, expressions.get(i)); } return result; }