From 11cc7f46f43beb9660ce6d2523be5c5a5a16aa01 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Fri, 21 Feb 2014 21:20:35 +0400 Subject: [PATCH] Remove "Iterator.iterator()" intrinsic, add stdlib function --- .../codegen/intrinsics/IntrinsicMethods.java | 1 - .../codegen/intrinsics/IteratorIterator.java | 44 ------------------- compiler/testData/builtin-classes.txt | 1 - core/builtins/native/kotlin/Iterator.kt | 2 - .../highlighter/deprecated/RangeTo.kt | 2 +- .../forLoopIn/inBuiltIns/extension.kt | 2 +- .../k2js/test/semantics/MiscTest.java | 10 ----- .../misc/cases/iterableExtension.kt | 21 --------- .../misc/cases/iterationOverIterator.kt | 18 -------- libraries/stdlib/src/kotlin/Iterators.kt | 5 +++ .../stdlib/test/iterators/IteratorsTest.kt | 22 ++++++++++ 11 files changed, 29 insertions(+), 99 deletions(-) delete mode 100644 compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/IteratorIterator.java delete mode 100644 js/js.translator/testFiles/expression/misc/cases/iterableExtension.kt delete mode 100644 js/js.translator/testFiles/expression/misc/cases/iterationOverIterator.kt diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/IntrinsicMethods.java b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/IntrinsicMethods.java index a0e61a0270f..6d8c9244e97 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/IntrinsicMethods.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/IntrinsicMethods.java @@ -122,7 +122,6 @@ public class IntrinsicMethods { intrinsicsMap.registerIntrinsic(BUILT_INS_PACKAGE_FQ_NAME, Name.identifier("identityEquals"), 1, IDENTITY_EQUALS); intrinsicsMap.registerIntrinsic(BUILT_INS_PACKAGE_FQ_NAME, Name.identifier("plus"), 1, STRING_PLUS); intrinsicsMap.registerIntrinsic(BUILT_INS_PACKAGE_FQ_NAME, Name.identifier("arrayOfNulls"), 1, new NewArray()); - intrinsicsMap.registerIntrinsic(BUILT_INS_PACKAGE_FQ_NAME, Name.identifier("iterator"), 0, new IteratorIterator()); for (PrimitiveType type : PrimitiveType.values()) { declareIntrinsicFunction(type.getTypeName(), Name.identifier("compareTo"), 1, new CompareTo()); diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/IteratorIterator.java b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/IteratorIterator.java deleted file mode 100644 index bd035126a9a..00000000000 --- a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/IteratorIterator.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright 2010-2013 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.jetbrains.jet.codegen.intrinsics; - -import com.intellij.psi.PsiElement; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.jetbrains.asm4.Type; -import org.jetbrains.asm4.commons.InstructionAdapter; -import org.jetbrains.jet.codegen.ExpressionCodegen; -import org.jetbrains.jet.codegen.StackValue; -import org.jetbrains.jet.lang.psi.JetExpression; - -import java.util.List; - -public class IteratorIterator extends IntrinsicMethod { - @NotNull - @Override - public Type generateImpl( - @NotNull ExpressionCodegen codegen, - @NotNull InstructionAdapter v, - @NotNull Type returnType, - @Nullable PsiElement element, - @Nullable List arguments, - StackValue receiver - ) { - receiver.put(returnType, v); - return returnType; - } -} diff --git a/compiler/testData/builtin-classes.txt b/compiler/testData/builtin-classes.txt index 3a5b4ac0fea..12ea1724f69 100644 --- a/compiler/testData/builtin-classes.txt +++ b/compiler/testData/builtin-classes.txt @@ -3,7 +3,6 @@ package-fragment jet public fun arrayOfNulls(/*0*/ size: jet.Int): jet.Array public fun jet.Any?.equals(/*0*/ other: jet.Any?): jet.Boolean public fun jet.Any?.identityEquals(/*0*/ other: jet.Any?): jet.Boolean -public fun jet.Iterator.iterator(): jet.Iterator public fun jet.String?.plus(/*0*/ other: jet.Any?): jet.String public fun jet.Any?.toString(): jet.String diff --git a/core/builtins/native/kotlin/Iterator.kt b/core/builtins/native/kotlin/Iterator.kt index 0f6f5af9270..ae722292e91 100644 --- a/core/builtins/native/kotlin/Iterator.kt +++ b/core/builtins/native/kotlin/Iterator.kt @@ -9,8 +9,6 @@ public trait MutableIterator : Iterator { public fun remove(): Unit } -public fun Iterator.iterator(): Iterator - public trait ListIterator : Iterator { // Query Operations override fun next(): T diff --git a/idea/testData/highlighter/deprecated/RangeTo.kt b/idea/testData/highlighter/deprecated/RangeTo.kt index d3fc250fc33..073f8844576 100644 --- a/idea/testData/highlighter/deprecated/RangeTo.kt +++ b/idea/testData/highlighter/deprecated/RangeTo.kt @@ -2,7 +2,7 @@ class MyClass { val i = 1 } -deprecated("Use A instead") fun MyClass.rangeTo(i: MyClass): IntIterator { +deprecated("Use A instead") fun MyClass.rangeTo(i: MyClass): Iterable { i.i throw Exception() } diff --git a/idea/testData/resolve/references/forLoopIn/inBuiltIns/extension.kt b/idea/testData/resolve/references/forLoopIn/inBuiltIns/extension.kt index 1835db78661..339d798417b 100644 --- a/idea/testData/resolve/references/forLoopIn/inBuiltIns/extension.kt +++ b/idea/testData/resolve/references/forLoopIn/inBuiltIns/extension.kt @@ -3,6 +3,6 @@ fun main(it: Iterator) { } // MULTIRESOLVE -// REF: (for Iterator in jet).iterator() +// REF: (for jet.Iterator in jet).iterator() // REF: (in jet.Iterator).hasNext() // REF: (in jet.Iterator).next() 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 31bdb26cf47..92883d70256 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 @@ -186,17 +186,7 @@ public final class MiscTest extends AbstractExpressionTest { fooBoxTest(); } - public void testIterableExtension() throws Exception { - fooBoxTest(); - } - - public void testIterationOverIterator() throws Exception { - fooBoxTest(); - } - public void testStringInterpolationEvaluationOrder() throws Exception { fooBoxTest(); } - - } diff --git a/js/js.translator/testFiles/expression/misc/cases/iterableExtension.kt b/js/js.translator/testFiles/expression/misc/cases/iterableExtension.kt deleted file mode 100644 index eabf122231e..00000000000 --- a/js/js.translator/testFiles/expression/misc/cases/iterableExtension.kt +++ /dev/null @@ -1,21 +0,0 @@ -package foo - -import java.util.* -import java.lang.* - -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 deleted file mode 100644 index df5b01b6da5..00000000000 --- a/js/js.translator/testFiles/expression/misc/cases/iterationOverIterator.kt +++ /dev/null @@ -1,18 +0,0 @@ -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 diff --git a/libraries/stdlib/src/kotlin/Iterators.kt b/libraries/stdlib/src/kotlin/Iterators.kt index eaf4510c37d..e032bdc31e5 100644 --- a/libraries/stdlib/src/kotlin/Iterators.kt +++ b/libraries/stdlib/src/kotlin/Iterators.kt @@ -4,6 +4,11 @@ import kotlin.support.* import java.util.Collections import kotlin.test.assertTrue +/** + * Returns the given iterator itself. This allows to use an instance of iterator in a ranged for-loop + */ +public fun Iterator.iterator(): Iterator = this + /** * Returns an iterator which invokes the function to calculate the next value on each iteration until the function returns *null* */ diff --git a/libraries/stdlib/test/iterators/IteratorsTest.kt b/libraries/stdlib/test/iterators/IteratorsTest.kt index 831678ea997..b88312473ca 100644 --- a/libraries/stdlib/test/iterators/IteratorsTest.kt +++ b/libraries/stdlib/test/iterators/IteratorsTest.kt @@ -3,6 +3,7 @@ package iterators import kotlin.test.assertEquals import org.junit.Test as test import kotlin.test.fails +import java.util.ArrayList fun fibonacci(): Iterator { // fibonacci terms @@ -87,4 +88,25 @@ class IteratorsTest { assertEquals("13, 21, 34, 55, 89, 144, 233, 377, 610, 987, ...", fibonacci().skip(7).makeString(limit = 10)) assertEquals("13, 21, 34, 55, 89, 144, 233, 377, 610, 987, ...", fibonacci().skip(3).skip(4).makeString(limit = 10)) } + + test fun iterationOverIterator() { + val c = arrayList(0, 1, 2, 3, 4, 5) + var s = "" + for (i in c.iterator()) { + s = s + i.toString() + } + assertEquals("012345", s) + } + + private fun > Iterator.takeWhileTo(result: C, predicate: (T) -> Boolean): C { + for (element in this) if (predicate(element)) result.add(element) else break + return result + } + + test fun iterableExtension() { + val c = arrayList(0, 1, 2, 3, 4, 5) + val d = ArrayList() + c.iterator().takeWhileTo(d, {i -> i < 4 }) + assertEquals(4, d.size()) + } }