From 377f6fe4da29337ee2b3b1e1039b5808ad66498d Mon Sep 17 00:00:00 2001 From: Michael Nedzelsky Date: Mon, 8 Sep 2014 23:59:53 +0400 Subject: [PATCH] JS backend: fix labels before for and do while loops --- .../translate/expression/ExpressionVisitor.java | 15 ++++++++++----- .../k2js/translate/expression/LoopTranslator.kt | 5 ++--- .../translate/expression/TryTranslator.java | 11 +++++++---- .../k2js/translate/general/Translation.java | 17 +++++++++++++---- .../initializer/InitializerVisitor.java | 4 ++-- 5 files changed, 34 insertions(+), 18 deletions(-) diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/expression/ExpressionVisitor.java b/js/js.translator/src/org/jetbrains/k2js/translate/expression/ExpressionVisitor.java index 532391e7c0a..866e0c92020 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/expression/ExpressionVisitor.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/expression/ExpressionVisitor.java @@ -19,7 +19,9 @@ package org.jetbrains.k2js.translate.expression; import com.google.dart.compiler.backend.js.ast.*; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.jet.lang.descriptors.*; +import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; +import org.jetbrains.jet.lang.descriptors.FunctionDescriptor; +import org.jetbrains.jet.lang.descriptors.VariableDescriptor; import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.BindingContextUtils; @@ -38,7 +40,8 @@ import org.jetbrains.k2js.translate.general.TranslatorVisitor; import org.jetbrains.k2js.translate.operation.BinaryOperationTranslator; import org.jetbrains.k2js.translate.operation.UnaryOperationTranslator; import org.jetbrains.k2js.translate.reference.*; -import org.jetbrains.k2js.translate.utils.*; +import org.jetbrains.k2js.translate.utils.JsAstUtils; +import org.jetbrains.k2js.translate.utils.TranslationUtils; import java.util.List; @@ -48,7 +51,8 @@ import static org.jetbrains.k2js.translate.general.Translation.translateAsExpres import static org.jetbrains.k2js.translate.reference.ReferenceTranslator.translateAsFQReference; import static org.jetbrains.k2js.translate.utils.BindingUtils.*; import static org.jetbrains.k2js.translate.utils.ErrorReportingUtils.message; -import static org.jetbrains.k2js.translate.utils.JsAstUtils.*; +import static org.jetbrains.k2js.translate.utils.JsAstUtils.convertToStatement; +import static org.jetbrains.k2js.translate.utils.JsAstUtils.newVar; import static org.jetbrains.k2js.translate.utils.JsDescriptorUtils.getReceiverParameterForDeclaration; import static org.jetbrains.k2js.translate.utils.TranslationUtils.translateInitializerForProperty; @@ -204,8 +208,9 @@ public final class ExpressionVisitor extends TranslatorVisitor { assert thenExpression != null : "then expression should not be null: " + expression.getText(); JetExpression elseExpression = expression.getElse(); - JsStatement thenStatement = Translation.translateAsStatement(thenExpression, context); - JsStatement elseStatement = (elseExpression != null) ? Translation.translateAsStatement(elseExpression, context) : null; + JsStatement thenStatement = Translation.translateAsStatementAndMergeInBlockIfNeeded(thenExpression, context); + JsStatement elseStatement = (elseExpression != null) ? Translation.translateAsStatementAndMergeInBlockIfNeeded(elseExpression, + context) : null; if (isKotlinExpression) { JsExpression jsThenExpression = JsAstUtils.extractExpressionFromStatement(thenStatement); diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/expression/LoopTranslator.kt b/js/js.translator/src/org/jetbrains/k2js/translate/expression/LoopTranslator.kt index 6e1bc621e49..c49d69c39eb 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/expression/LoopTranslator.kt +++ b/js/js.translator/src/org/jetbrains/k2js/translate/expression/LoopTranslator.kt @@ -26,7 +26,6 @@ import org.jetbrains.k2js.translate.callTranslator.CallTranslator import org.jetbrains.k2js.translate.context.TemporaryVariable import org.jetbrains.k2js.translate.context.TranslationContext import org.jetbrains.k2js.translate.expression.MultiDeclarationTranslator -import org.jetbrains.k2js.translate.general.AbstractTranslator import org.jetbrains.k2js.translate.general.Translation import org.jetbrains.k2js.translate.intrinsic.functions.factories.CompositeFIF import org.jetbrains.k2js.translate.utils.BindingUtils.* @@ -44,7 +43,7 @@ public fun createWhile(doWhile: Boolean, expression: JetWhileExpressionBase, con val body = expression.getBody() var bodyStatement = if (body != null) - Translation.translateAsStatement(body, context) + Translation.translateAsStatementAndMergeInBlockIfNeeded(body, context) else context.getEmptyStatement() @@ -121,7 +120,7 @@ public fun translateForExpression(expression: JetForExpression, context: Transla val parameterName: JsName = declareParameter() fun translateBody(itemValue: JsExpression?): JsStatement { - val realBody = Translation.translateAsStatement(getLoopBody(expression), context) + val realBody = Translation.translateAsStatementAndMergeInBlockIfNeeded(getLoopBody(expression), context) if (itemValue == null && multiParameter == null) { return realBody } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/expression/TryTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/expression/TryTranslator.java index 642d5671095..effaaf1846d 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/expression/TryTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/expression/TryTranslator.java @@ -16,7 +16,10 @@ package org.jetbrains.k2js.translate.expression; -import com.google.dart.compiler.backend.js.ast.*; +import com.google.dart.compiler.backend.js.ast.JsBlock; +import com.google.dart.compiler.backend.js.ast.JsCatch; +import com.google.dart.compiler.backend.js.ast.JsName; +import com.google.dart.compiler.backend.js.ast.JsTry; import com.intellij.util.SmartList; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -57,12 +60,12 @@ public final class TryTranslator extends AbstractTranslator { JetFinallySection finallyBlock = expression.getFinallyBlock(); if (finallyBlock == null) return null; - return convertToBlock(Translation.translateAsStatement(finallyBlock.getFinalExpression(), context())); + return convertToBlock(Translation.translateAsStatementAndMergeInBlockIfNeeded(finallyBlock.getFinalExpression(), context())); } @NotNull private JsBlock translateTryBlock() { - return convertToBlock(Translation.translateAsStatement(expression.getTryBlock(), context())); + return convertToBlock(Translation.translateAsStatementAndMergeInBlockIfNeeded(expression.getTryBlock(), context())); } @NotNull @@ -91,7 +94,7 @@ public final class TryTranslator extends AbstractTranslator { if (catchBody == null) { return convertToBlock(context().getEmptyStatement()); } - return convertToBlock(Translation.translateAsStatement(catchBody, context())); + return convertToBlock(Translation.translateAsStatementAndMergeInBlockIfNeeded(catchBody, context())); } } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/general/Translation.java b/js/js.translator/src/org/jetbrains/k2js/translate/general/Translation.java index 6e51d865eb7..27f573d0dde 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/general/Translation.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/general/Translation.java @@ -55,7 +55,8 @@ import java.util.Collections; import java.util.List; import static org.jetbrains.k2js.translate.utils.BindingUtils.getFunctionDescriptor; -import static org.jetbrains.k2js.translate.utils.JsAstUtils.*; +import static org.jetbrains.k2js.translate.utils.JsAstUtils.convertToStatement; +import static org.jetbrains.k2js.translate.utils.JsAstUtils.toStringLiteralList; import static org.jetbrains.k2js.translate.utils.mutator.LastExpressionMutator.mutateLastExpression; /** @@ -138,9 +139,7 @@ public final class Translation { @NotNull public static JsStatement translateAsStatement(@NotNull JetExpression expression, @NotNull TranslationContext context) { - JsBlock block = new JsBlock(); - JsNode node = translateExpression(expression, context, block); - return JsAstUtils.mergeStatementInBlockIfNeeded(convertToStatement(node), block); + return translateAsStatement(expression, context, context.dynamicContext().jsBlock()); } @NotNull @@ -151,6 +150,16 @@ public final class Translation { return convertToStatement(translateExpression(expression, context, block)); } + @NotNull + public static JsStatement translateAsStatementAndMergeInBlockIfNeeded( + @NotNull JetExpression expression, + @NotNull TranslationContext context + ) { + JsBlock block = new JsBlock(); + JsNode node = translateExpression(expression, context, block); + return JsAstUtils.mergeStatementInBlockIfNeeded(convertToStatement(node), block); + } + @NotNull public static JsProgram generateAst(@NotNull BindingContext bindingContext, @NotNull Collection files, @NotNull MainCallParameters mainCallParameters, diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/initializer/InitializerVisitor.java b/js/js.translator/src/org/jetbrains/k2js/translate/initializer/InitializerVisitor.java index ca84d6eedf9..e3cabe581d8 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/initializer/InitializerVisitor.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/initializer/InitializerVisitor.java @@ -25,7 +25,7 @@ import org.jetbrains.k2js.translate.general.TranslatorVisitor; import java.util.List; -import static org.jetbrains.k2js.translate.general.Translation.translateAsStatement; +import static org.jetbrains.k2js.translate.general.Translation.translateAsStatementAndMergeInBlockIfNeeded; import static org.jetbrains.k2js.translate.initializer.InitializerUtils.generateInitializerForDelegate; import static org.jetbrains.k2js.translate.initializer.InitializerUtils.generateInitializerForProperty; import static org.jetbrains.k2js.translate.utils.BindingUtils.getPropertyDescriptor; @@ -53,7 +53,7 @@ public final class InitializerVisitor extends TranslatorVisitor { @Override public Void visitAnonymousInitializer(@NotNull JetClassInitializer initializer, @NotNull TranslationContext context) { - result.add(translateAsStatement(initializer.getBody(), context)); + result.add(translateAsStatementAndMergeInBlockIfNeeded(initializer.getBody(), context)); return null; }