JS backend: fix labels before for and do while loops
This commit is contained in:
+10
-5
@@ -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,
|
||||
|
||||
+2
-2
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user