diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index 5ef0054af61..da4258d6769 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -13,14 +13,12 @@
-
+
-
-
-
-
-
-
+
+
+
+
@@ -64,21 +62,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -135,20 +118,9 @@
-
+
-
-
-
-
-
-
-
-
-
-
-
@@ -167,19 +139,10 @@
-
-
+
+
-
-
-
-
-
-
-
-
-
-
+
@@ -187,15 +150,26 @@
-
-
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
@@ -205,32 +179,19 @@
-
-
+
+
-
-
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
+
-
+
@@ -240,82 +201,82 @@
-
-
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
+
@@ -355,13 +316,6 @@
@@ -603,184 +564,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -788,7 +571,7 @@
-
+
@@ -813,77 +596,17 @@
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -978,6 +701,68 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -1164,11 +949,11 @@
-
-
-
-
-
+
+
+
+
+
localhost
@@ -1256,8 +1041,8 @@
-
-
+
+
@@ -1304,7 +1089,7 @@
-
+
@@ -1317,7 +1102,6 @@
-
@@ -1342,6 +1126,7 @@
+
@@ -1351,125 +1136,117 @@
-
+
-
+
-
+
-
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
+
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
+
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -1528,11 +1305,12 @@
- frontend.java
+ jslib
+
diff --git a/config.txt b/config.txt
new file mode 100644
index 00000000000..3d4240955ae
--- /dev/null
+++ b/config.txt
@@ -0,0 +1 @@
+C:\Dev\Projects\jet-contrib\k2js\jslib\src
\ No newline at end of file
diff --git a/js/src/com/google/dart/compiler/util/AstUtil.java b/js/src/com/google/dart/compiler/util/AstUtil.java
index a130ab44be8..110b9fc5404 100644
--- a/js/src/com/google/dart/compiler/util/AstUtil.java
+++ b/js/src/com/google/dart/compiler/util/AstUtil.java
@@ -328,6 +328,10 @@ public class AstUtil {
return equals(expression, program.getTrueLiteral());
}
+ public static JsExpression assignment(JsExpression left, JsExpression right) {
+ return new JsBinaryOperation(JsBinaryOperator.ASG, left, right);
+ }
+
public static JsBinaryOperation sum(JsExpression left, JsExpression right) {
return new JsBinaryOperation(JsBinaryOperator.ADD, left, right);
}
@@ -343,4 +347,33 @@ public class AstUtil {
public static JsBinaryOperation typeof(JsExpression expression, JsStringLiteral string) {
return equals(new JsPrefixOperation(JsUnaryOperator.TYPEOF, expression), string);
}
+
+ public static interface Mutator {
+ public JsNode mutate(JsNode node);
+ }
+
+ //TODO: refactor and review
+ public static JsNode mutateLastExpression(JsNode node, Mutator mutator) {
+ if (node instanceof JsBlock) {
+ JsBlock block = (JsBlock) node;
+ List statements = block.getStatements();
+ int size = statements.size();
+ statements.set(size - 1,
+ AstUtil.convertToStatement(mutateLastExpression(statements.get(size - 1), mutator)));
+ return block;
+ }
+ if (node instanceof JsIf) {
+ JsIf ifExpr = (JsIf) node;
+ ifExpr.setThenStmt(AstUtil.convertToStatement(mutateLastExpression(ifExpr.getThenStmt(), mutator)));
+ JsStatement elseStmt = ifExpr.getElseStmt();
+ if (elseStmt != null) {
+ ifExpr.setElseStmt(AstUtil.convertToStatement(mutateLastExpression(elseStmt, mutator)));
+ }
+ return ifExpr;
+ }
+ if (node instanceof JsExprStmt) {
+ return AstUtil.convertToStatement(mutateLastExpression(((JsExprStmt) node).getExpression(), mutator));
+ }
+ return mutator.mutate(node);
+ }
}
diff --git a/translator/src/org/jetbrains/k2js/config/Config.java b/translator/src/org/jetbrains/k2js/config/Config.java
index 3e6a8862435..d912ef32c0b 100644
--- a/translator/src/org/jetbrains/k2js/config/Config.java
+++ b/translator/src/org/jetbrains/k2js/config/Config.java
@@ -1,11 +1,14 @@
package org.jetbrains.k2js.config;
+import com.google.common.base.Charsets;
+import com.google.common.io.Files;
import com.intellij.openapi.project.Project;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.k2js.utils.JetFileUtils;
+import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@@ -15,14 +18,30 @@ import java.util.List;
*/
public abstract class Config {
+ @NotNull
+ private static final String PATH_TO_JS_LIB_SRC = getPathToJsLibSrc();
+
//TODO: provide some generic way to access
+ @NotNull
private static final List LIB_FILE_NAMES = Arrays.asList(
- "C:\\Dev\\Projects\\jet-contrib\\k2js\\jslib\\src\\core\\annotations.kt",
- "C:\\Dev\\Projects\\jet-contrib\\k2js\\jslib\\src\\jquery\\common.kt",
- "C:\\Dev\\Projects\\jet-contrib\\k2js\\jslib\\src\\core\\javautil.kt",
- "C:\\Dev\\Projects\\jet-contrib\\k2js\\jslib\\src\\core\\core.kt"
+ PATH_TO_JS_LIB_SRC + "\\core\\annotations.kt",
+ PATH_TO_JS_LIB_SRC + "\\jquery\\common.kt",
+ PATH_TO_JS_LIB_SRC + "\\core\\javautil.kt",
+ PATH_TO_JS_LIB_SRC + "\\core\\core.kt"
);
+
+ @NotNull
+ private static String getPathToJsLibSrc() {
+ try {
+ File file = new File("config.txt");
+ List lines = Files.readLines(file, Charsets.UTF_8);
+ return lines.get(0);
+ } catch (Exception ex) {
+ return "jslib\\src";
+ }
+ }
+
@NotNull
private static List initLibFiles(@NotNull Project project) {
List libFiles = new ArrayList();
diff --git a/translator/src/org/jetbrains/k2js/translate/context/TranslationContext.java b/translator/src/org/jetbrains/k2js/translate/context/TranslationContext.java
index 03614652a90..32aa282bdd4 100644
--- a/translator/src/org/jetbrains/k2js/translate/context/TranslationContext.java
+++ b/translator/src/org/jetbrains/k2js/translate/context/TranslationContext.java
@@ -190,6 +190,11 @@ public final class TranslationContext {
return dynamicContext.jsScope();
}
+ @NotNull
+ public JsBlock jsBlock() {
+ return dynamicContext.jsBlock();
+ }
+
@NotNull
private DeclarationFacade declarationFacade() {
return staticContext.getDeclarationFacade();
diff --git a/translator/src/org/jetbrains/k2js/translate/expression/WhenTranslator.java b/translator/src/org/jetbrains/k2js/translate/expression/WhenTranslator.java
index 6c1d1b6f774..dd55b7fb407 100644
--- a/translator/src/org/jetbrains/k2js/translate/expression/WhenTranslator.java
+++ b/translator/src/org/jetbrains/k2js/translate/expression/WhenTranslator.java
@@ -5,6 +5,7 @@ import com.google.dart.compiler.util.AstUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.psi.*;
+import org.jetbrains.k2js.translate.context.TemporaryVariable;
import org.jetbrains.k2js.translate.context.TranslationContext;
import org.jetbrains.k2js.translate.general.AbstractTranslator;
import org.jetbrains.k2js.translate.general.Translation;
@@ -12,9 +13,6 @@ import org.jetbrains.k2js.translate.general.Translation;
import java.util.ArrayList;
import java.util.List;
-import static com.google.dart.compiler.util.AstUtil.convertToStatement;
-import static org.jetbrains.k2js.translate.utils.BindingUtils.isStatement;
-
/**
* @author Pavel Talanov
*/
@@ -32,18 +30,18 @@ public class WhenTranslator extends AbstractTranslator {
@NotNull
private final JsExpression expressionToMatch;
@NotNull
- private final JsName dummyCounterName;
+ private final TemporaryVariable dummyCounter;
+ @NotNull
+ private final TemporaryVariable result;
+
private int currentEntryNumber = 0;
private WhenTranslator(@NotNull JetWhenExpression expression, @NotNull TranslationContext context) {
super(context);
this.whenExpression = expression;
this.expressionToMatch = translateExpressionToMatch(whenExpression);
- this.dummyCounterName = context.jsScope().declareTemporary();
- }
-
- boolean shouldWrapInFunction() {
- return !isStatement(context().bindingContext(), whenExpression);
+ this.dummyCounter = context.declareTemporary(context().program().getNumberLiteral(0));
+ this.result = context.declareTemporary(program().getNullLiteral());
}
@NotNull
@@ -51,16 +49,8 @@ public class WhenTranslator extends AbstractTranslator {
JsFor resultingFor = generateDummyFor();
List entries = translateEntries();
resultingFor.setBody(AstUtil.newBlock(entries));
- return mayBeWrapInFunction(resultingFor);
- }
-
- @NotNull
- private JsNode mayBeWrapInFunction(@NotNull JsFor resultingFor) {
- if (!shouldWrapInFunction()) return resultingFor;
-
- JsFunction dummyFunction = JsFunction.getAnonymousFunctionWithScope(context().jsScope());
- dummyFunction.setBody(AstUtil.convertToBlock(resultingFor));
- return AstUtil.newInvocation(dummyFunction);
+ context().jsBlock().addStatement(resultingFor);
+ return result.nameReference();
}
@NotNull
@@ -75,7 +65,7 @@ public class WhenTranslator extends AbstractTranslator {
@NotNull
private JsStatement surroundWithDummyIf(@NotNull JsStatement entryStatement) {
JsExpression stepNumberEqualsCurrentEntryNumber = new JsBinaryOperation(JsBinaryOperator.EQ,
- dummyCounterName.makeRef(), context().program().getNumberLiteral(currentEntryNumber));
+ dummyCounter.nameReference(), context().program().getNumberLiteral(currentEntryNumber));
currentEntryNumber++;
return new JsIf(stepNumberEqualsCurrentEntryNumber, entryStatement, null);
}
@@ -83,31 +73,26 @@ public class WhenTranslator extends AbstractTranslator {
@NotNull
private JsFor generateDummyFor() {
JsFor result = new JsFor();
- result.setInitVars(generateInitStatement());
+ result.setInitExpr(dummyCounter.assignmentExpression());
result.setIncrExpr(generateIncrementStatement());
result.setCondition(generateConditionStatement());
return result;
}
- @NotNull
- private JsVars generateInitStatement() {
- return AstUtil.newVar(dummyCounterName, context().program().getNumberLiteral(0));
- }
-
@NotNull
private JsBinaryOperation generateConditionStatement() {
JsNumberLiteral entriesNumber = program().getNumberLiteral(whenExpression.getEntries().size());
- return new JsBinaryOperation(JsBinaryOperator.LT, dummyCounterName.makeRef(), entriesNumber);
+ return new JsBinaryOperation(JsBinaryOperator.LT, dummyCounter.nameReference(), entriesNumber);
}
@NotNull
private JsPrefixOperation generateIncrementStatement() {
- return new JsPrefixOperation(JsUnaryOperator.INC, dummyCounterName.makeRef());
+ return new JsPrefixOperation(JsUnaryOperator.INC, dummyCounter.nameReference());
}
@NotNull
private JsStatement translateEntry(@NotNull JetWhenEntry entry) {
- JsStatement statementToExecute = mayBeWrapWithReturn(translateEntryExpression(entry));
+ JsStatement statementToExecute = withReturnValueCaptured(translateEntryExpression(entry));
if (entry.isElse()) {
return statementToExecute;
}
@@ -116,14 +101,17 @@ public class WhenTranslator extends AbstractTranslator {
}
@NotNull
- private JsStatement mayBeWrapWithReturn(@NotNull JsNode node) {
- if (shouldWrapInFunction()) {
- assert node instanceof JsExpression :
- "Statements are not supported in when clauses which are themselves expressions";
- return new JsReturn((JsExpression) node);
- } else {
- return convertToStatement(node);
- }
+ JsStatement withReturnValueCaptured(@NotNull JsNode node) {
+ AstUtil.Mutator lastExpressionCapturer = new AstUtil.Mutator() {
+ @Override
+ public JsNode mutate(JsNode node) {
+ if (!(node instanceof JsExpression)) {
+ return node;
+ }
+ return AstUtil.assignment(result.nameReference(), (JsExpression) node);
+ }
+ };
+ return AstUtil.convertToStatement(AstUtil.mutateLastExpression(node, lastExpressionCapturer));
}
@NotNull