diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index f2237039113..0c2faf99960 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -5,10 +5,12 @@
-
+
+
+
+
-
@@ -145,6 +147,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -193,8 +221,8 @@
-
+
@@ -202,71 +230,67 @@
-
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
+
@@ -303,66 +327,46 @@
-
-
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
@@ -373,25 +377,43 @@
-
+
-
-
+
+
-
+
-
-
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -418,22 +440,22 @@
@@ -523,7 +545,6 @@
-
@@ -538,6 +559,7 @@
+
@@ -646,7 +668,29 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -668,11 +712,43 @@
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -814,9 +890,9 @@
-
-
+
+
@@ -834,75 +910,7 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
@@ -992,6 +1000,68 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -1050,17 +1120,6 @@
-
-
-
-
-
-
-
-
-
-
-
@@ -1087,6 +1146,17 @@
+
+
+
+
+
+
+
+
+
+
+
@@ -1119,11 +1189,11 @@
-
-
-
-
-
+
+
+
+
+
localhost
@@ -1181,29 +1251,29 @@
-
+
-
-
-
+
+
-
+
-
+
-
-
+
+
+
+
-
@@ -1242,7 +1312,7 @@
-
+
@@ -1255,8 +1325,6 @@
-
-
@@ -1280,6 +1348,8 @@
+
+
@@ -1289,128 +1359,120 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
+
+
+
+
+
+
+
+
-
+
-
+
-
+
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/translator/src/org/jetbrains/k2js/translate/expression/ExpressionVisitor.java b/translator/src/org/jetbrains/k2js/translate/expression/ExpressionVisitor.java
index 020d0135f43..4ffc2d9a81f 100644
--- a/translator/src/org/jetbrains/k2js/translate/expression/ExpressionVisitor.java
+++ b/translator/src/org/jetbrains/k2js/translate/expression/ExpressionVisitor.java
@@ -382,5 +382,10 @@ public final class ExpressionVisitor extends TranslatorVisitor {
return AccessTranslator.translateAsGet(expression, context);
}
-
+ @Override
+ @NotNull
+ public JsNode visitForExpression(@NotNull JetForExpression expression,
+ @NotNull TranslationContext context) {
+ return ForTranslator.translate(expression, context);
+ }
}
diff --git a/translator/src/org/jetbrains/k2js/translate/expression/ForTranslator.java b/translator/src/org/jetbrains/k2js/translate/expression/ForTranslator.java
new file mode 100644
index 00000000000..3ed85bd0cf6
--- /dev/null
+++ b/translator/src/org/jetbrains/k2js/translate/expression/ForTranslator.java
@@ -0,0 +1,73 @@
+package org.jetbrains.k2js.translate.expression;
+
+import com.google.dart.compiler.backend.js.ast.*;
+import com.google.dart.compiler.util.AstUtil;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.jet.lang.psi.JetExpression;
+import org.jetbrains.jet.lang.psi.JetForExpression;
+import org.jetbrains.jet.lang.psi.JetParameter;
+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;
+
+/**
+ * @author Talanov Pavel
+ */
+public final class ForTranslator extends AbstractTranslator {
+
+ @NotNull
+ public static JsStatement translate(@NotNull JetForExpression expression,
+ @NotNull TranslationContext context) {
+ return (new ForTranslator(expression, context).translate());
+ }
+
+ @NotNull
+ private final JetForExpression expression;
+
+ private ForTranslator(@NotNull JetForExpression forExpression, @NotNull TranslationContext context) {
+ super(context);
+ this.expression = forExpression;
+ }
+
+
+ @NotNull
+ private JsBlock translate() {
+ JetParameter loopParameter = expression.getLoopParameter();
+ assert loopParameter != null;
+ JsName parameterName = context().declareLocalVariable(loopParameter);
+ TemporaryVariable iterator = context().declareTemporary(iteratorMethodInvocation());
+ JsBlock bodyBlock = new JsBlock();
+ bodyBlock.addStatement(AstUtil.newAssignmentStatement(parameterName.makeRef(), nextMethodInvocation(iterator)));
+ bodyBlock.addStatement(AstUtil.convertToBlock(Translation.translateExpression(expression.getBody(), context())));
+ JsWhile cycle = new JsWhile(hasNextMethodInvocation(iterator), bodyBlock);
+ return AstUtil.newBlock(iterator.assignmentExpression().makeStmt(), cycle);
+ }
+
+ @NotNull
+ private JsExpression nextMethodInvocation(@NotNull TemporaryVariable iterator) {
+ JsNameRef next = AstUtil.newQualifiedNameRef("next");
+ JsNameRef result = iterator.nameReference();
+ AstUtil.setQualifier(next, result);
+ return AstUtil.newInvocation(next);
+ }
+
+ @NotNull
+ private JsExpression hasNextMethodInvocation(@NotNull TemporaryVariable iterator) {
+ JsNameRef hasNext = AstUtil.newQualifiedNameRef("hasNext");
+ JsNameRef result = iterator.nameReference();
+ AstUtil.setQualifier(hasNext, result);
+ return AstUtil.newInvocation(hasNext);
+ }
+
+
+ @NotNull
+ private JsExpression iteratorMethodInvocation() {
+ JetExpression rangeExpression = expression.getLoopRange();
+ assert rangeExpression != null;
+ JsExpression range = Translation.translateAsExpression(rangeExpression, context());
+ JsNameRef iteratorMethodReference = AstUtil.newQualifiedNameRef("iterator");
+ AstUtil.setQualifier(iteratorMethodReference, range);
+ return AstUtil.newInvocation(iteratorMethodReference);
+ }
+}
diff --git a/translator/test/org/jetbrains/k2js/test/ForTest.java b/translator/test/org/jetbrains/k2js/test/ForTest.java
new file mode 100644
index 00000000000..cad1cd7ca2c
--- /dev/null
+++ b/translator/test/org/jetbrains/k2js/test/ForTest.java
@@ -0,0 +1,21 @@
+package org.jetbrains.k2js.test;
+
+import org.junit.Test;
+
+/**
+ * @author Talanov Pavel
+ */
+public final class ForTest extends AbstractExpressionTest {
+
+ final private static String MAIN = "for/";
+
+ @Override
+ protected String mainDirectory() {
+ return MAIN;
+ }
+
+ @Test
+ public void forIteratesOverArray() throws Exception {
+ testFooBoxIsTrue("forIteratesOverArray.kt");
+ }
+}
diff --git a/translator/testFiles/expression/for/cases/forIteratesOverArray.kt b/translator/testFiles/expression/for/cases/forIteratesOverArray.kt
new file mode 100644
index 00000000000..9b3b71fe617
--- /dev/null
+++ b/translator/testFiles/expression/for/cases/forIteratesOverArray.kt
@@ -0,0 +1,19 @@
+namespace foo
+
+val a1 = Array(10)
+
+fun box() : Boolean {
+ var c = 0
+ var d = 0
+ a1[3] = 3
+ a1[5] = 5
+
+ for (var a : Int? in a1) {
+ if (a != null) {
+ c += 1;
+ } else {
+ d += 1
+ }
+ }
+ return (c == 2) && (d == 8)
+}
\ No newline at end of file
diff --git a/translator/testFiles/kotlin_lib.js b/translator/testFiles/kotlin_lib.js
index 155f90662f5..cd38fba7d6d 100644
--- a/translator/testFiles/kotlin_lib.js
+++ b/translator/testFiles/kotlin_lib.js
@@ -483,6 +483,31 @@ Kotlin.Array = Class.create({
}
});
+//Kotlin.Array = Class.create({
+// initialize:function (len) {
+// this.array = [];
+// this.size = 0
+// },
+// get:function (index) {
+// if ((index < 0) || (index > this.size)) {
+// throw Kotlin.Exceptions.IndexOutOfBounds;
+// }
+// return (this.array)[index];
+// },
+// set:function (index, value) {
+// if ((index < 0) || (index > this.size)) {
+// throw Kotlin.Exceptions.IndexOutOfBounds;
+// }
+// (this.array)[index] = value;
+// },
+// size:function () {
+// return this.size;
+// },
+// iterator:function () {
+// return new Kotlin.ArrayIterator(this);
+// }
+//});
+
Kotlin.ArrayIterator = Class.create({
initialize:function (array) {
this.array = array;