diff --git a/js/js.libraries/src/core/javautilCode.kt b/js/js.libraries/src/core/javautilCode.kt deleted file mode 100644 index ce3e78e66e2..00000000000 --- a/js/js.libraries/src/core/javautilCode.kt +++ /dev/null @@ -1,48 +0,0 @@ -package java.util - -import java.lang.* - -public object Collections { - library("collectionsMax") - public fun max(col : Collection, comp : Comparator) : T = js.noImpl - - // TODO should be immutable! - library - public val emptyList: List = ArrayList() - library - public val emptyMap: Map = HashMap() - - library - public val EMPTY_LIST: List - get() = emptyList() - - library - public val EMPTY_MAP: Map - get() = emptyMap() - - library - public fun emptyList(): List = emptyList as List - library - public fun emptyMap(): Map = emptyMap as Map - - library - public fun sort(list: MutableList): Unit { - throw UnsupportedOperationException() - } - - library("sortWithComp") - public fun sort(list: MutableList, comparator: java.util.Comparator): Unit { - throw UnsupportedOperationException() - } - - library - public fun reverse(list: MutableList): Unit { - val size = list.size() - for (i in 0.rangeTo(size / 2)) { - val i2 = size - i - val tmp = list[i] - list[i] = list[i2] - list[i2] = tmp - } - } -} diff --git a/js/js.libraries/src/core/javautilCollections.kt b/js/js.libraries/src/core/javautilCollections.kt new file mode 100644 index 00000000000..8bc1b76c654 --- /dev/null +++ b/js/js.libraries/src/core/javautilCollections.kt @@ -0,0 +1,13 @@ +package java.util.Collections + +import java.lang.* +import java.util.* + +library("collectionsMax") +public fun max(col : Collection, comp : Comparator) : T = js.noImpl + +library("collectionsSort") +public fun sort(list: MutableList): Unit = js.noImpl + +library("collectionsSort") +public fun sort(list: MutableList, comparator: java.util.Comparator): Unit = js.noImpl \ No newline at end of file diff --git a/js/js.libraries/src/core/javautilCollectionsCode.kt b/js/js.libraries/src/core/javautilCollectionsCode.kt new file mode 100644 index 00000000000..2f3c9a5c8c9 --- /dev/null +++ b/js/js.libraries/src/core/javautilCollectionsCode.kt @@ -0,0 +1,34 @@ +package java.util.Collections + +import java.lang.* +import java.util.* + +// TODO should be immutable! +library +public val emptyList: List = ArrayList() +library +public val emptyMap: Map = HashMap() + +library +public val EMPTY_LIST: List + get() = emptyList() + +library +public val EMPTY_MAP: Map + get() = emptyMap() + +library +public fun emptyList(): List = emptyList as List +library +public fun emptyMap(): Map = emptyMap as Map + +library +public fun reverse(list: MutableList): Unit { + val size = list.size() + for (i in 0.rangeTo(size / 2)) { + val i2 = size - i + val tmp = list[i] + list[i] = list[i2] + list[i2] = tmp + } +} \ No newline at end of file diff --git a/js/js.tests/test/org/jetbrains/k2js/test/semantics/StdLibJavaUtilCollectionsTest.java b/js/js.tests/test/org/jetbrains/k2js/test/semantics/StdLibJavaUtilCollectionsTest.java new file mode 100644 index 00000000000..b4c0298274c --- /dev/null +++ b/js/js.tests/test/org/jetbrains/k2js/test/semantics/StdLibJavaUtilCollectionsTest.java @@ -0,0 +1,26 @@ +/* + * 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.k2js.test.semantics; + +import junit.framework.Test; + +@SuppressWarnings("JUnitTestCaseWithNoTests") +public final class StdLibJavaUtilCollectionsTest extends JsUnitTestBase { + public static Test suite() throws Exception { + return createTestSuiteForFile("libraries/stdlib/test/js/javautilCollectionsTest.kt"); + } +} diff --git a/js/js.translator/src/org/jetbrains/k2js/config/Config.java b/js/js.translator/src/org/jetbrains/k2js/config/Config.java index 8647b610972..1caab8933fb 100644 --- a/js/js.translator/src/org/jetbrains/k2js/config/Config.java +++ b/js/js.translator/src/org/jetbrains/k2js/config/Config.java @@ -65,6 +65,7 @@ public abstract class Config { "/core/javaio.kt", "/core/javalang.kt", "/core/javautil.kt", + "/core/javautilCollections.kt", "/core/json.kt", "/core/kotlin.kt", "/core/math.kt", @@ -83,7 +84,7 @@ public abstract class Config { @NotNull public static final List LIB_FILES_WITH_CODE = Arrays.asList( "/stdlib/TuplesCode.kt", - "/core/javautilCode.kt" + "/core/javautilCollectionsCode.kt" ); @NotNull diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/context/StandardClasses.java b/js/js.translator/src/org/jetbrains/k2js/translate/context/StandardClasses.java index 133a64b73cd..dcdef387dc1 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/context/StandardClasses.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/context/StandardClasses.java @@ -107,8 +107,6 @@ public final class StandardClasses { .methods("iterator", "contains").properties("start", "end", "increment"); standardClasses.declare().forFQ("jet.Any.toString").kotlinFunction("toString"); - - standardClasses.declare().forFQ("java.util.Collections..max").kotlinFunction("collectionsMax"); } diff --git a/js/js.translator/testFiles/kotlin_lib.js b/js/js.translator/testFiles/kotlin_lib.js index 98dc08721ca..60680741756 100644 --- a/js/js.translator/testFiles/kotlin_lib.js +++ b/js/js.translator/testFiles/kotlin_lib.js @@ -198,6 +198,7 @@ var kotlin = {set:function (receiver, key, value) { } }); + //TODO: should be JS Array-like (https://developer.mozilla.org/en-US/docs/JavaScript/Guide/Predefined_Core_Objects#Working_with_Array-like_objects) Kotlin.ArrayList = Kotlin.$createClass(Kotlin.AbstractList, { initialize: function () { this.array = []; @@ -364,7 +365,7 @@ var kotlin = {set:function (receiver, key, value) { }, next: function () { var value = this.$i; - this.set_i(this.$i + this.$increment) + this.set_i(this.$i + this.$increment); return value; }, get_hasNext: function () { @@ -446,6 +447,31 @@ var kotlin = {set:function (receiver, key, value) { return max; }; + Kotlin.collectionsSort = function (mutableList, comparator) { + var boundComparator = undefined; + if (comparator !== undefined) { + boundComparator = comparator.compare.bind(comparator); + } + + if (mutableList instanceof Array) { + mutableList.sort(boundComparator); + } + + //TODO: should be deleted when List will be JS Array-like (https://developer.mozilla.org/en-US/docs/JavaScript/Guide/Predefined_Core_Objects#Working_with_Array-like_objects) + var array = []; + var it = mutableList.iterator(); + while (it.hasNext()) { + array.push(it.next()); + } + + array.sort(boundComparator); + + for (var i = 0, n = array.length; i < n; i++) { + mutableList.set(i, array[i]); + } + }; + + Kotlin.StringBuilder = Kotlin.$createClass( { initialize:function () { diff --git a/libraries/stdlib/test/js/MapJsTest.kt b/libraries/stdlib/test/js/MapJsTest.kt index e2dbcc3d030..f66d170a9f7 100644 --- a/libraries/stdlib/test/js/MapJsTest.kt +++ b/libraries/stdlib/test/js/MapJsTest.kt @@ -44,8 +44,7 @@ class MapJsTest { test fun hashMapValues() { val map = createTestHashMap() - //todo: fixme after sort() will be fixed for JS - assertEquals(VALUES, map.values()) + assertEquals(VALUES.toList(), map.values().toSortedList()) } fun createTestHashMap(): HashMap { diff --git a/libraries/stdlib/test/js/javautilCollectionsTest.kt b/libraries/stdlib/test/js/javautilCollectionsTest.kt new file mode 100644 index 00000000000..9908fcf2675 --- /dev/null +++ b/libraries/stdlib/test/js/javautilCollectionsTest.kt @@ -0,0 +1,32 @@ +package testPackage + +import java.util.Collections +import java.util.ArrayList + +import kotlin.test.* +import org.junit.Test as test + +fun List.toArrayList() = this.toCollection(ArrayList()) + +class JavautilCollectionsTest { + val TEST_LIST = array(2, 0, 9, 7, 1).toList() + val SORTED_TEST_LIST = array(0, 1, 2, 7, 9).toList() + val MAX_ELEMENT = 9 + val COMPARATOR = comparator { (x: Int, y: Int) -> if (x > y) 1 else if (x < y) -1 else 0 } + + test fun maxWithComparator() { + assertEquals(MAX_ELEMENT, Collections.max(TEST_LIST, COMPARATOR)) + } + + test fun sort() { + val list = TEST_LIST.toArrayList() + Collections.sort(list) + assertEquals(SORTED_TEST_LIST, list) + } + + test fun sortWithComparator() { + val list = TEST_LIST.toArrayList() + Collections.sort(list, COMPARATOR) + assertEquals(SORTED_TEST_LIST, list) + } +}