diff --git a/js/js.tests/test/org/jetbrains/k2js/test/semantics/MiscTest.java b/js/js.tests/test/org/jetbrains/k2js/test/semantics/MiscTest.java index 70c52d665a3..02974babc5a 100644 --- a/js/js.tests/test/org/jetbrains/k2js/test/semantics/MiscTest.java +++ b/js/js.tests/test/org/jetbrains/k2js/test/semantics/MiscTest.java @@ -187,4 +187,12 @@ public final class MiscTest extends AbstractExpressionTest { public void testInheritFromJetIterator() throws Exception { fooBoxTest(); } + + public void testIterableExtension() throws Exception { + fooBoxTest(); + } + + public void testIterationOverIterator() throws Exception { + fooBoxTest(); + } } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/TopLevelFIF.java b/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/TopLevelFIF.java index ca8f7c90e42..0027a5304cd 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/TopLevelFIF.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/TopLevelFIF.java @@ -16,12 +16,18 @@ package org.jetbrains.k2js.translate.intrinsic.functions.factories; +import com.google.dart.compiler.backend.js.ast.JsExpression; import com.google.dart.compiler.backend.js.ast.JsNameRef; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.k2js.translate.context.TranslationContext; import org.jetbrains.k2js.translate.intrinsic.functions.basic.BuiltInFunctionIntrinsic; import org.jetbrains.k2js.translate.intrinsic.functions.basic.CallStandardMethodIntrinsic; +import org.jetbrains.k2js.translate.intrinsic.functions.basic.FunctionIntrinsic; import org.jetbrains.k2js.translate.intrinsic.functions.patterns.NamePredicate; +import java.util.List; + import static org.jetbrains.k2js.translate.intrinsic.functions.patterns.PatternBuilder.pattern; /** @@ -31,6 +37,19 @@ public final class TopLevelFIF extends CompositeFIF { @NotNull public static final CallStandardMethodIntrinsic EQUALS = new CallStandardMethodIntrinsic(new JsNameRef("equals", "Kotlin"), true, 1); @NotNull + public static final FunctionIntrinsic RETURN_RECEIVER_INTRINSIC = new FunctionIntrinsic() { + @NotNull + @Override + public JsExpression apply( + @Nullable JsExpression receiver, + @NotNull List arguments, + @NotNull TranslationContext context + ) { + assert receiver != null; + return receiver; + } + }; + @NotNull public static final FunctionIntrinsicFactory INSTANCE = new TopLevelFIF(); private TopLevelFIF() { @@ -39,5 +58,6 @@ public final class TopLevelFIF extends CompositeFIF { add(pattern(NamePredicate.PRIMITIVE_NUMBERS, "equals"), EQUALS); add(pattern("String|Boolean|Char|Number.equals"), EQUALS); add(pattern("arrayOfNulls"), new CallStandardMethodIntrinsic(new JsNameRef("nullArray", "Kotlin"), false, 1)); + add(pattern("iterator"), RETURN_RECEIVER_INTRINSIC); } } diff --git a/js/js.translator/testFiles/expression/misc/cases/iterableExtension.kt b/js/js.translator/testFiles/expression/misc/cases/iterableExtension.kt new file mode 100644 index 00000000000..7d92f125bb9 --- /dev/null +++ b/js/js.translator/testFiles/expression/misc/cases/iterableExtension.kt @@ -0,0 +1,22 @@ +package foo + +import java.util.* +import java.lang.* +import jet.Iterator + +public inline fun > Iterator.takeWhileTo(result: C, predicate: (T) -> Boolean) : C { + for (element in this) if (predicate(element)) result.add(element) else break + return result +} + +fun box(): Any? { + val c = ArrayList() + for (i in 0..5) { + c.add(i) + } + + val d = ArrayList() + + c.iterator().takeWhileTo(d, {i -> i < 4 }) + return d.size() == 4 +} \ No newline at end of file diff --git a/js/js.translator/testFiles/expression/misc/cases/iterationOverIterator.kt b/js/js.translator/testFiles/expression/misc/cases/iterationOverIterator.kt new file mode 100644 index 00000000000..df5b01b6da5 --- /dev/null +++ b/js/js.translator/testFiles/expression/misc/cases/iterationOverIterator.kt @@ -0,0 +1,18 @@ +package foo + + +import java.util.* + +fun box(): Boolean { + val c = ArrayList() + for (i in 0..5) { + c.add(i) + } + + var s = "" + for (i in c.iterator()) { + s = s + i.toString() + } + + return s == "012345" +} \ No newline at end of file