From d724ce3f7e21c1da0e73fcb609c877c5ff4ab3f9 Mon Sep 17 00:00:00 2001 From: Ilya Gorbunov Date: Thu, 26 Mar 2015 21:57:43 +0300 Subject: [PATCH] Add code generation for asList methods in js.libraries. --- js/js.libraries/src/core/kotlin_special.kt | 76 +++++++++++++++++++ .../stdlib/test/collections/ArraysTest.kt | 15 ++++ .../src/generators/GenerateCollections.kt | 4 + .../src/generators/GenerateStandardLib.kt | 1 + .../src/templates/SpecialJS.kt | 25 ++++++ 5 files changed, 121 insertions(+) create mode 100644 js/js.libraries/src/core/kotlin_special.kt create mode 100644 libraries/tools/kotlin-stdlib-gen/src/templates/SpecialJS.kt diff --git a/js/js.libraries/src/core/kotlin_special.kt b/js/js.libraries/src/core/kotlin_special.kt new file mode 100644 index 00000000000..5fb54cf8308 --- /dev/null +++ b/js/js.libraries/src/core/kotlin_special.kt @@ -0,0 +1,76 @@ +package kotlin + +// +// NOTE THIS FILE IS AUTO-GENERATED by the GenerateStandardLib.kt +// See: https://github.com/JetBrains/kotlin/tree/master/libraries/stdlib +// + +import java.util.* + +import java.util.Collections // TODO: it's temporary while we have java.util.Collections in js + +/** + * Returns a list that wraps the original array + */ +public fun Array.asList(): List { + val al = ArrayList() + (al: dynamic).array = this // black dynamic magic + return al +} + +/** + * Returns a list that wraps the original array + */ +public inline fun BooleanArray.asList(): List { + return (this as Array).asList() +} + +/** + * Returns a list that wraps the original array + */ +public inline fun ByteArray.asList(): List { + return (this as Array).asList() +} + +/** + * Returns a list that wraps the original array + */ +public inline fun CharArray.asList(): List { + return (this as Array).asList() +} + +/** + * Returns a list that wraps the original array + */ +public inline fun DoubleArray.asList(): List { + return (this as Array).asList() +} + +/** + * Returns a list that wraps the original array + */ +public inline fun FloatArray.asList(): List { + return (this as Array).asList() +} + +/** + * Returns a list that wraps the original array + */ +public inline fun IntArray.asList(): List { + return (this as Array).asList() +} + +/** + * Returns a list that wraps the original array + */ +public inline fun LongArray.asList(): List { + return (this as Array).asList() +} + +/** + * Returns a list that wraps the original array + */ +public inline fun ShortArray.asList(): List { + return (this as Array).asList() +} + diff --git a/libraries/stdlib/test/collections/ArraysTest.kt b/libraries/stdlib/test/collections/ArraysTest.kt index 2a65363a044..a4164a6a797 100644 --- a/libraries/stdlib/test/collections/ArraysTest.kt +++ b/libraries/stdlib/test/collections/ArraysTest.kt @@ -269,6 +269,21 @@ class ArraysTest { assertEquals(iter4.toList(), emptyList()) } + test fun asList() { + assertEquals(listOf(1, 2, 3), intArray(1, 2, 3).asList()) + assertEquals(listOf(1, 2, 3), byteArray(1, 2, 3).asList()) + assertEquals(listOf(true, false), booleanArray(true, false).asList()) + + assertEquals(listOf(1, 2, 3), array(1, 2, 3).asList()) + assertEquals(listOf("abc", "def"), array("abc", "def").asList()) + + val ints = intArray(1, 5, 7) + val intsAsList = ints.asList() + assertEquals(5, intsAsList[1]) + ints[1] = 10 + assertEquals(10, intsAsList[1], "Should reflect changes in original array") + } + /* TODO FIXME ASAP: These currently fail on JS due to missing upto() method on numbers diff --git a/libraries/tools/kotlin-stdlib-gen/src/generators/GenerateCollections.kt b/libraries/tools/kotlin-stdlib-gen/src/generators/GenerateCollections.kt index b75f01f9f8e..6006acd5dc9 100644 --- a/libraries/tools/kotlin-stdlib-gen/src/generators/GenerateCollections.kt +++ b/libraries/tools/kotlin-stdlib-gen/src/generators/GenerateCollections.kt @@ -37,3 +37,7 @@ fun generateCollectionsAPI(outDir: File) { } } + +fun generateCollectionsJsAPI(outDir: File) { + specialJS().writeTo(File(outDir, "kotlin_special.kt")) { build() } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-stdlib-gen/src/generators/GenerateStandardLib.kt b/libraries/tools/kotlin-stdlib-gen/src/generators/GenerateStandardLib.kt index 14816e824ec..99ae45e7497 100644 --- a/libraries/tools/kotlin-stdlib-gen/src/generators/GenerateStandardLib.kt +++ b/libraries/tools/kotlin-stdlib-gen/src/generators/GenerateStandardLib.kt @@ -29,6 +29,7 @@ fun main(args: Array) { generateDomEventsAPI(File(jsCoreDir, "domEvents.kt")) generateCollectionsAPI(outDir) + generateCollectionsJsAPI(jsCoreDir) generateDownTos(File(outDir, "_DownTo.kt"), "package kotlin") } diff --git a/libraries/tools/kotlin-stdlib-gen/src/templates/SpecialJS.kt b/libraries/tools/kotlin-stdlib-gen/src/templates/SpecialJS.kt new file mode 100644 index 00000000000..bfbe158be1f --- /dev/null +++ b/libraries/tools/kotlin-stdlib-gen/src/templates/SpecialJS.kt @@ -0,0 +1,25 @@ +package templates + +import templates.Family.* + +fun specialJS(): List { + val templates = arrayListOf() + + templates add f("asList()") { + only(ArraysOfObjects, ArraysOfPrimitives) + doc { "Returns a list that wraps the original array" } + returns("List") + body(ArraysOfObjects) { + """ + val al = ArrayList() + (al: dynamic).array = this // black dynamic magic + return al + """ + } + + inline(true, ArraysOfPrimitives) + body(ArraysOfPrimitives) {"""return (this as Array).asList()"""} + } + + return templates +} \ No newline at end of file