diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index 775027e40c6..e9483184889 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -277,14 +277,17 @@ public class ExpressionCodegen extends JetVisitor { v.mark(begin); v.load(iteratorVar, asmIterType); - FunctionDescriptor hND; if(hasNextDescriptor instanceof FunctionDescriptor) { - hND = (FunctionDescriptor) hasNextDescriptor; + FunctionDescriptor hND = (FunctionDescriptor) hasNextDescriptor; + invokeFunctionNoParams(hND, Type.BOOLEAN_TYPE, v); } else { - hND = ((PropertyDescriptor) hasNextDescriptor).getGetter(); +// hND = ((PropertyDescriptor) hasNextDescriptor).getGetter(); +// if(hND != null) +// invokeFunctionNoParams(hND, Type.BOOLEAN_TYPE, v); +// else + intermediateValueForProperty((PropertyDescriptor) hasNextDescriptor, false, false).put(Type.BOOLEAN_TYPE, v); } - invokeFunctionNoParams(hND, Type.BOOLEAN_TYPE, v); v.ifeq(end); myMap.enter(parameterDescriptor, asmParamType.getSize()); diff --git a/compiler/frontend/src/jet/Library.jet b/compiler/frontend/src/jet/Library.jet index 0a57bbf4c91..296cd1038e6 100644 --- a/compiler/frontend/src/jet/Library.jet +++ b/compiler/frontend/src/jet/Library.jet @@ -41,8 +41,8 @@ fun Any?.equals(other : Any?) : Boolean// = this === other fun Any?.toString() : String// = this === other trait Iterator { - fun next() : T - fun hasNext() : Boolean + fun next() : T + val hasNext : Boolean } trait Iterable { diff --git a/compiler/testData/codegen/controlStructures/forUserType.jet b/compiler/testData/codegen/controlStructures/forUserType.jet index 0332dc28bf1..cd2e335196d 100644 --- a/compiler/testData/codegen/controlStructures/forUserType.jet +++ b/compiler/testData/codegen/controlStructures/forUserType.jet @@ -88,7 +88,8 @@ class MyCollection2(): Iterable { var k : Int = 5 override fun next() : Int = k-- - override fun hasNext() = k > 0 + override val hasNext : Boolean + get() = k > 0 } } @@ -99,7 +100,8 @@ class MyCollection3() { var k : Int = 5 fun next() : Int? = k-- - fun hasNext() = k > 0 + val hasNext : Boolean + get() = k > 0 } } diff --git a/compiler/tests/org/jetbrains/jet/codegen/ArrayGenTest.java b/compiler/tests/org/jetbrains/jet/codegen/ArrayGenTest.java index f5f89630aa5..76d4f93928c 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/ArrayGenTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/ArrayGenTest.java @@ -56,42 +56,42 @@ public class ArrayGenTest extends CodegenTestCase { } public void testIterator () throws Exception { - loadText("fun box() { val x = Array(5, { it } ).iterator(); while(x.hasNext()) { java.lang.System.out?.println(x.next()) } }"); + loadText("fun box() { val x = Array(5, { it } ).iterator(); while(x.hasNext) { java.lang.System.out?.println(x.next()) } }"); System.out.println(generateToText()); Method foo = generateFunction(); foo.invoke(null); } public void testPrimitiveIterator () throws Exception { - loadText("fun box() { val x = ByteArray(5).iterator(); while(x.hasNext()) { java.lang.System.out?.println(x.next()) } }"); + loadText("fun box() { val x = ByteArray(5).iterator(); while(x.hasNext) { java.lang.System.out?.println(x.next()) } }"); System.out.println(generateToText()); Method foo = generateFunction(); foo.invoke(null); } public void testLongIterator () throws Exception { - loadText("fun box() { val x = LongArray(5).iterator(); while(x.hasNext()) { java.lang.System.out?.println(x.next()) } }"); + loadText("fun box() { val x = LongArray(5).iterator(); while(x.hasNext) { java.lang.System.out?.println(x.next()) } }"); System.out.println(generateToText()); Method foo = generateFunction(); foo.invoke(null); } public void testCharIterator () throws Exception { - loadText("fun box() { val x = CharArray(5).iterator(); while(x.hasNext()) { java.lang.System.out?.println(x.next()) } }"); + loadText("fun box() { val x = CharArray(5).iterator(); while(x.hasNext) { java.lang.System.out?.println(x.next()) } }"); System.out.println(generateToText()); Method foo = generateFunction(); foo.invoke(null); } public void testArrayIndices () throws Exception { - loadText("fun box() { val x = Array(5, {it}).indices.iterator(); while(x.hasNext()) { java.lang.System.out?.println(x.next()) } }"); + loadText("fun box() { val x = Array(5, {it}).indices.iterator(); while(x.hasNext) { java.lang.System.out?.println(x.next()) } }"); System.out.println(generateToText()); Method foo = generateFunction(); foo.invoke(null); } public void testCharIndices () throws Exception { - loadText("fun box() { val x = CharArray(5).indices.iterator(); while(x.hasNext()) { java.lang.System.out?.println(x.next()) } }"); + loadText("fun box() { val x = CharArray(5).indices.iterator(); while(x.hasNext) { java.lang.System.out?.println(x.next()) } }"); System.out.println(generateToText()); Method foo = generateFunction(); foo.invoke(null); diff --git a/examples/src/collections/IIterator.kt b/examples/src/collections/IIterator.kt deleted file mode 100644 index 5677a6fc407..00000000000 --- a/examples/src/collections/IIterator.kt +++ /dev/null @@ -1,105 +0,0 @@ -namespace jet.collections.iterator - -import java.util.NoSuchElementException - -trait IIterator { - fun next() : T - val hasNext : Boolean - - inline fun foldLeft(init: R, operation: fun(accumulated: R, element: T) : R) : R { - while(hasNext) - init = operation(init, next()) - return init - } - - inline fun foldLeft(init: R, operation: fun(accumulated: R, index: Int, element: T) : R) : R { - var k = 0 - while(hasNext) - init = operation(init, k++, next()) - return init - } - - inline fun foreach(operation: fun(element: T) : Unit) = while(hasNext) operation(next()) - - inline fun foreach(operation: fun(index: Int, element: T) : Unit) : Unit { - var k = 0 - while(hasNext) - operation(k++, next()) - } - - inline fun map(transform: fun(element: T) : R) : IIterator { - return object : IIterator { - override fun next() : R = transform(this@map.next()) - - override val hasNext : Boolean - get() = this@map.hasNext - } - } - - inline fun plus(other: IIterator) : IIterator = - object : IIterator { - override fun next() : T = if(this@plus.hasNext) this@plus.next() else other.next() - - override val hasNext : Boolean - get() = this@plus.hasNext || other.hasNext - } - - inline fun filter(condition: fun(element: T) : Boolean) : IIterator { - return object : IIterator { - private var _next : T = null - private var _lookedAhead : Boolean = false - private var _hasNext : Boolean = false - - private fun lookAhead() : Boolean { - if(!_lookedAhead) { - _lookedAhead = true - while(this@filter.hasNext) { - _next = this@filter.next() - if(condition(_next)) { - _hasNext = true - return true - } - } - } - return _hasNext - } - - override fun next() : T { - lookAhead() - _lookedAhead = false - if(_hasNext) { - val res = _next - _next = null - _hasNext = false - return res - } - throw NoSuchElementException() - } - - override val hasNext : Boolean - get() = lookAhead() - } - } -/* - fun toArray(buffer : MutableArray) : Int { // T is still an in-parameter - return fillBuffer(buffer, 0, buffer.size) - } - - fun toArray(buffer : MutableArray, from : Int, length : Int) : Int { // T is still an in-parameter - if (from < 0 || from > buffer.lastIndex || length < 0 || length > buffer.size - from) { - throw IndexOutOfBoundsException(); - } - - if (len == 0) return 0 - - var count = 0; - for (i in from .. from + length - 1) { - if (!hasNext) - return count - buffer[i] = next() - count++ - } - return count - } -*/ -} diff --git a/examples/src/collections/Iterator.kt b/examples/src/collections/Iterator.kt new file mode 100644 index 00000000000..8fedf34a2d9 --- /dev/null +++ b/examples/src/collections/Iterator.kt @@ -0,0 +1,134 @@ +namespace jet.collections + +import java.util.NoSuchElementException + +trait ISized { + val size : Int +} + +val ISized.isEmpty : Boolean + get() = size == 0 + +val ISized.isNonEmpty : Boolean + get() = size != 0 + +trait ISet : Iterable, ISized { + fun contains(item : T) : Boolean +} + +fun Iterator.foreach(operation: fun(element: T) : Unit) : Unit = while(hasNext) operation(next()) + +fun Iterator.foreach(operation: fun(index: Int, element: T) : Unit) : Unit { + var k = 0 + while(hasNext) + operation(k++, next()) +} + +fun Iterable.foreach(operation: fun(element: T) : Unit) : Unit = iterator() foreach operation + +fun Iterable.foreach(operation: fun(index: Int, element: T) : Unit) : Unit = iterator() foreach operation + +fun Iterable.foldLeft(init: R, operation: fun(accumulated: R, element: T) : R) : R = + iterator () foreach operation + +fun Iterable.foldLeft(init: R, operation: fun(accumulated: R, index: Int, element: T) : R) : R = + iterator () foreach operation + +fun Iterator.foldLeft(init: R, operation: fun(accumulated: R, element: T) : R) : R { + while(hasNext) + init = operation(init, next()) + return init +} + +fun Iterator.foldLeft(init: R, operation: fun(accumulated: R, index: Int, element: T) : R) : R { + var k = 0 + while(hasNext) + init = operation(init, k++, next()) + return init +} + +fun Iterator.map(transform: fun(element: T) : R) : Iterator = + object : Iterator { + override fun next() : R = transform(this@map.next()) + + override val hasNext : Boolean + get() = this@map.hasNext + } + +fun Iterator.map(transform: fun(index: Int, element: T) : R) : Iterator { + return object : Iterator { + var index = 0 + + override fun next() : R = transform(index++, this@map.next()) + + override val hasNext : Boolean + get() = this@map.hasNext + } +} + +fun Iterator.plus(other: Iterator) : Iterator = + object : Iterator { + override fun next() : T = if(this@plus.hasNext) this@plus.next() else other.next() + + override val hasNext : Boolean + get() = this@plus.hasNext || other.hasNext + } + +fun Iterator.filter(condition: fun(element: T) : Boolean) : Iterator { + return object : Iterator { + private var _next : T = null + private var _lookedAhead : Boolean = false + private var _hasNext : Boolean = false + + private fun lookAhead() : Boolean { + if(!_lookedAhead) { + _lookedAhead = true + while(this@filter.hasNext) { + _next = this@filter.next() + if(condition(_next)) { + _hasNext = true + return true + } + } + } + return _hasNext + } + + override fun next() : T { + lookAhead() + _lookedAhead = false + if(_hasNext) { + val res = _next + _next = null + _hasNext = false + return res + } + throw NoSuchElementException() + } + + override val hasNext : Boolean + get() = lookAhead() + } +} +/* + fun toArray(buffer : MutableArray) : Int { // T is still an in-parameter + return fillBuffer(buffer, 0, buffer.size) + } + + fun toArray(buffer : MutableArray, from : Int, length : Int) : Int { // T is still an in-parameter + if (from < 0 || from > buffer.lastIndex || length < 0 || length > buffer.size - from) { + throw IndexOutOfBoundsException(); + } + + if (len == 0) return 0 + + var count = 0; + for (i in from .. from + length - 1) { + if (!hasNext) + return count + buffer[i] = next() + count++ + } + return count + } +*/ diff --git a/stdlib/src/jet/IntRange.java b/stdlib/src/jet/IntRange.java index abeb2a0f696..71d49ed0a73 100644 --- a/stdlib/src/jet/IntRange.java +++ b/stdlib/src/jet/IntRange.java @@ -76,7 +76,7 @@ public final class IntRange implements Range, Iterable, JetObj } @Override - public boolean hasNext() { + public boolean getHasNext() { return count > 0; } diff --git a/stdlib/src/jet/Iterator.java b/stdlib/src/jet/Iterator.java index 001bdd83863..f476440b7c4 100644 --- a/stdlib/src/jet/Iterator.java +++ b/stdlib/src/jet/Iterator.java @@ -1,6 +1,6 @@ package jet; public interface Iterator extends JetObject { - boolean hasNext(); + boolean getHasNext(); T next (); } diff --git a/stdlib/src/jet/LongRange.java b/stdlib/src/jet/LongRange.java index 7932f7d0b5d..e0a358599fb 100644 --- a/stdlib/src/jet/LongRange.java +++ b/stdlib/src/jet/LongRange.java @@ -76,7 +76,7 @@ public final class LongRange implements Range, Iterable, JetObject { } @Override - public boolean hasNext() { + public boolean getHasNext() { return count > 0; } diff --git a/stdlib/src/jet/arrays/ArrayIterator.java b/stdlib/src/jet/arrays/ArrayIterator.java index 761a153d474..79f3bd2a15a 100644 --- a/stdlib/src/jet/arrays/ArrayIterator.java +++ b/stdlib/src/jet/arrays/ArrayIterator.java @@ -20,7 +20,7 @@ public abstract class ArrayIterator implements Iterator, JetObject { } @Override - public boolean hasNext() { + public boolean getHasNext() { return index < size; }