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 com.google.dart.compiler.backend.js.ast.*;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
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.psi.*;
|
||||||
import org.jetbrains.jet.lang.resolve.BindingContext;
|
import org.jetbrains.jet.lang.resolve.BindingContext;
|
||||||
import org.jetbrains.jet.lang.resolve.BindingContextUtils;
|
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.BinaryOperationTranslator;
|
||||||
import org.jetbrains.k2js.translate.operation.UnaryOperationTranslator;
|
import org.jetbrains.k2js.translate.operation.UnaryOperationTranslator;
|
||||||
import org.jetbrains.k2js.translate.reference.*;
|
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;
|
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.reference.ReferenceTranslator.translateAsFQReference;
|
||||||
import static org.jetbrains.k2js.translate.utils.BindingUtils.*;
|
import static org.jetbrains.k2js.translate.utils.BindingUtils.*;
|
||||||
import static org.jetbrains.k2js.translate.utils.ErrorReportingUtils.message;
|
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.JsDescriptorUtils.getReceiverParameterForDeclaration;
|
||||||
import static org.jetbrains.k2js.translate.utils.TranslationUtils.translateInitializerForProperty;
|
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();
|
assert thenExpression != null : "then expression should not be null: " + expression.getText();
|
||||||
JetExpression elseExpression = expression.getElse();
|
JetExpression elseExpression = expression.getElse();
|
||||||
|
|
||||||
JsStatement thenStatement = Translation.translateAsStatement(thenExpression, context);
|
JsStatement thenStatement = Translation.translateAsStatementAndMergeInBlockIfNeeded(thenExpression, context);
|
||||||
JsStatement elseStatement = (elseExpression != null) ? Translation.translateAsStatement(elseExpression, context) : null;
|
JsStatement elseStatement = (elseExpression != null) ? Translation.translateAsStatementAndMergeInBlockIfNeeded(elseExpression,
|
||||||
|
context) : null;
|
||||||
|
|
||||||
if (isKotlinExpression) {
|
if (isKotlinExpression) {
|
||||||
JsExpression jsThenExpression = JsAstUtils.extractExpressionFromStatement(thenStatement);
|
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.TemporaryVariable
|
||||||
import org.jetbrains.k2js.translate.context.TranslationContext
|
import org.jetbrains.k2js.translate.context.TranslationContext
|
||||||
import org.jetbrains.k2js.translate.expression.MultiDeclarationTranslator
|
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.general.Translation
|
||||||
import org.jetbrains.k2js.translate.intrinsic.functions.factories.CompositeFIF
|
import org.jetbrains.k2js.translate.intrinsic.functions.factories.CompositeFIF
|
||||||
import org.jetbrains.k2js.translate.utils.BindingUtils.*
|
import org.jetbrains.k2js.translate.utils.BindingUtils.*
|
||||||
@@ -44,7 +43,7 @@ public fun createWhile(doWhile: Boolean, expression: JetWhileExpressionBase, con
|
|||||||
val body = expression.getBody()
|
val body = expression.getBody()
|
||||||
var bodyStatement =
|
var bodyStatement =
|
||||||
if (body != null)
|
if (body != null)
|
||||||
Translation.translateAsStatement(body, context)
|
Translation.translateAsStatementAndMergeInBlockIfNeeded(body, context)
|
||||||
else
|
else
|
||||||
context.getEmptyStatement()
|
context.getEmptyStatement()
|
||||||
|
|
||||||
@@ -121,7 +120,7 @@ public fun translateForExpression(expression: JetForExpression, context: Transla
|
|||||||
val parameterName: JsName = declareParameter()
|
val parameterName: JsName = declareParameter()
|
||||||
|
|
||||||
fun translateBody(itemValue: JsExpression?): JsStatement {
|
fun translateBody(itemValue: JsExpression?): JsStatement {
|
||||||
val realBody = Translation.translateAsStatement(getLoopBody(expression), context)
|
val realBody = Translation.translateAsStatementAndMergeInBlockIfNeeded(getLoopBody(expression), context)
|
||||||
if (itemValue == null && multiParameter == null) {
|
if (itemValue == null && multiParameter == null) {
|
||||||
return realBody
|
return realBody
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,7 +16,10 @@
|
|||||||
|
|
||||||
package org.jetbrains.k2js.translate.expression;
|
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 com.intellij.util.SmartList;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
@@ -57,12 +60,12 @@ public final class TryTranslator extends AbstractTranslator {
|
|||||||
JetFinallySection finallyBlock = expression.getFinallyBlock();
|
JetFinallySection finallyBlock = expression.getFinallyBlock();
|
||||||
if (finallyBlock == null) return null;
|
if (finallyBlock == null) return null;
|
||||||
|
|
||||||
return convertToBlock(Translation.translateAsStatement(finallyBlock.getFinalExpression(), context()));
|
return convertToBlock(Translation.translateAsStatementAndMergeInBlockIfNeeded(finallyBlock.getFinalExpression(), context()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
private JsBlock translateTryBlock() {
|
private JsBlock translateTryBlock() {
|
||||||
return convertToBlock(Translation.translateAsStatement(expression.getTryBlock(), context()));
|
return convertToBlock(Translation.translateAsStatementAndMergeInBlockIfNeeded(expression.getTryBlock(), context()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@@ -91,7 +94,7 @@ public final class TryTranslator extends AbstractTranslator {
|
|||||||
if (catchBody == null) {
|
if (catchBody == null) {
|
||||||
return convertToBlock(context().getEmptyStatement());
|
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 java.util.List;
|
||||||
|
|
||||||
import static org.jetbrains.k2js.translate.utils.BindingUtils.getFunctionDescriptor;
|
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;
|
import static org.jetbrains.k2js.translate.utils.mutator.LastExpressionMutator.mutateLastExpression;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -138,9 +139,7 @@ public final class Translation {
|
|||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
public static JsStatement translateAsStatement(@NotNull JetExpression expression, @NotNull TranslationContext context) {
|
public static JsStatement translateAsStatement(@NotNull JetExpression expression, @NotNull TranslationContext context) {
|
||||||
JsBlock block = new JsBlock();
|
return translateAsStatement(expression, context, context.dynamicContext().jsBlock());
|
||||||
JsNode node = translateExpression(expression, context, block);
|
|
||||||
return JsAstUtils.mergeStatementInBlockIfNeeded(convertToStatement(node), block);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@@ -151,6 +150,16 @@ public final class Translation {
|
|||||||
return convertToStatement(translateExpression(expression, context, block));
|
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
|
@NotNull
|
||||||
public static JsProgram generateAst(@NotNull BindingContext bindingContext,
|
public static JsProgram generateAst(@NotNull BindingContext bindingContext,
|
||||||
@NotNull Collection<JetFile> files, @NotNull MainCallParameters mainCallParameters,
|
@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 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.generateInitializerForDelegate;
|
||||||
import static org.jetbrains.k2js.translate.initializer.InitializerUtils.generateInitializerForProperty;
|
import static org.jetbrains.k2js.translate.initializer.InitializerUtils.generateInitializerForProperty;
|
||||||
import static org.jetbrains.k2js.translate.utils.BindingUtils.getPropertyDescriptor;
|
import static org.jetbrains.k2js.translate.utils.BindingUtils.getPropertyDescriptor;
|
||||||
@@ -53,7 +53,7 @@ public final class InitializerVisitor extends TranslatorVisitor<Void> {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Void visitAnonymousInitializer(@NotNull JetClassInitializer initializer, @NotNull TranslationContext context) {
|
public Void visitAnonymousInitializer(@NotNull JetClassInitializer initializer, @NotNull TranslationContext context) {
|
||||||
result.add(translateAsStatement(initializer.getBody(), context));
|
result.add(translateAsStatementAndMergeInBlockIfNeeded(initializer.getBody(), context));
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user