Iterating over iterator.

This commit is contained in:
Pavel V. Talanov
2012-08-16 20:24:57 +04:00
parent e184bf7a8f
commit 52a933e179
4 changed files with 68 additions and 0 deletions
@@ -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();
}
}
@@ -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<JsExpression> 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);
}
}
@@ -0,0 +1,22 @@
package foo
import java.util.*
import java.lang.*
import jet.Iterator
public inline fun <T, C: Collection<in T>> Iterator<T>.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<Int>()
for (i in 0..5) {
c.add(i)
}
val d = ArrayList<Int>()
c.iterator().takeWhileTo(d, {i -> i < 4 })
return d.size() == 4
}
@@ -0,0 +1,18 @@
package foo
import java.util.*
fun box(): Boolean {
val c = ArrayList<Int>()
for (i in 0..5) {
c.add(i)
}
var s = ""
for (i in c.iterator()) {
s = s + i.toString()
}
return s == "012345"
}