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 @@ - - - - - + - - - - - - - - - - - @@ -167,19 +139,10 @@ - - + + - - - - - - - - - - + @@ -187,15 +150,26 @@ - - + + - + + + + + + + + + + + + @@ -205,32 +179,19 @@ - - + + - - - - + + - - - - - - - - - - - - + - + @@ -240,82 +201,82 @@ - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + @@ -355,13 +316,6 @@ @@ -603,184 +564,6 @@ - + @@ -813,77 +596,17 @@ + - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -978,6 +701,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -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