JS backend: fix labels before for and do while loops

This commit is contained in:
Michael Nedzelsky
2014-09-08 23:59:53 +04:00
parent 041d009b9a
commit 377f6fe4da
5 changed files with 34 additions and 18 deletions
@@ -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<JsNode> {
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);
@@ -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
}
@@ -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()));
}
}
@@ -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<JetFile> files, @NotNull MainCallParameters mainCallParameters,
@@ -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<Void> {
@Override
public Void visitAnonymousInitializer(@NotNull JetClassInitializer initializer, @NotNull TranslationContext context) {
result.add(translateAsStatement(initializer.getBody(), context));
result.add(translateAsStatementAndMergeInBlockIfNeeded(initializer.getBody(), context));
return null;
}