From 87c9d4e84e2beaa0e45fcc61d6d18b5b91af0acd Mon Sep 17 00:00:00 2001 From: Ilya Gorbunov Date: Thu, 17 Nov 2016 20:02:15 +0300 Subject: [PATCH] Introduce unsafeCast function. Provide more JS-idiomatic emptyArray() implementation. #KT-14034 Fixed --- js/js.libraries/src/core/collections.kt | 2 +- js/js.libraries/src/core/dynamic.kt | 13 ++++--- .../src/core/generated/_ArraysJs.kt | 34 +++++++++---------- js/js.libraries/src/core/kotlin.kt | 4 +-- js/js.libraries/src/core/regexp.kt | 2 +- .../src/templates/SpecialJS.kt | 6 ++-- 6 files changed, 33 insertions(+), 28 deletions(-) diff --git a/js/js.libraries/src/core/collections.kt b/js/js.libraries/src/core/collections.kt index 27dbbb259aa..a6c3d61570b 100644 --- a/js/js.libraries/src/core/collections.kt +++ b/js/js.libraries/src/core/collections.kt @@ -26,7 +26,7 @@ internal fun copyToArray(collection: Collection): Array { return if (collection.asDynamic().toArray !== undefined) collection.asDynamic().toArray() else - copyToArrayImpl(collection).asDynamic() + copyToArrayImpl(collection).unsafeCast>() } @JsName("copyToArrayImpl") diff --git a/js/js.libraries/src/core/dynamic.kt b/js/js.libraries/src/core/dynamic.kt index 321b11ddce1..3f194b901f5 100644 --- a/js/js.libraries/src/core/dynamic.kt +++ b/js/js.libraries/src/core/dynamic.kt @@ -16,17 +16,22 @@ package kotlin.js -inline fun Any?.asDynamic(): dynamic = this +public inline fun Any?.asDynamic(): dynamic = this + +/** + * Reinterprets this value as a value of the specified type [T] without any actual type checking. + */ +public inline fun Any?.unsafeCast(): @kotlin.internal.NoInfer T = this.asDynamic() // TODO add the support ES6 iterators -operator fun dynamic.iterator(): Iterator { - val r = this +public operator fun dynamic.iterator(): Iterator { + val r: Any? = this return when { this["iterator"] != null -> this["iterator"]() js("Array.isArray(r)") -> - (this as Array<*>).iterator() + r.unsafeCast>().iterator() else -> (r as Iterable<*>).iterator() diff --git a/js/js.libraries/src/core/generated/_ArraysJs.kt b/js/js.libraries/src/core/generated/_ArraysJs.kt index fca5e2162bc..d84f44140d1 100644 --- a/js/js.libraries/src/core/generated/_ArraysJs.kt +++ b/js/js.libraries/src/core/generated/_ArraysJs.kt @@ -14,119 +14,119 @@ import kotlin.comparisons.* * Returns a [List] that wraps the original array. */ public fun Array.asList(): List { - return ArrayList(this as Array) + return ArrayList(this.unsafeCast>()) } /** * Returns a [List] that wraps the original array. */ public inline fun ByteArray.asList(): List { - return (this as Array).asList() + return this.unsafeCast>().asList() } /** * Returns a [List] that wraps the original array. */ public inline fun ShortArray.asList(): List { - return (this as Array).asList() + return this.unsafeCast>().asList() } /** * Returns a [List] that wraps the original array. */ public inline fun IntArray.asList(): List { - return (this as Array).asList() + return this.unsafeCast>().asList() } /** * Returns a [List] that wraps the original array. */ public inline fun LongArray.asList(): List { - return (this as Array).asList() + return this.unsafeCast>().asList() } /** * Returns a [List] that wraps the original array. */ public inline fun FloatArray.asList(): List { - return (this as Array).asList() + return this.unsafeCast>().asList() } /** * Returns a [List] that wraps the original array. */ public inline fun DoubleArray.asList(): List { - return (this as Array).asList() + return this.unsafeCast>().asList() } /** * Returns a [List] that wraps the original array. */ public inline fun BooleanArray.asList(): List { - return (this as Array).asList() + return this.unsafeCast>().asList() } /** * Returns a [List] that wraps the original array. */ public inline fun CharArray.asList(): List { - return (this as Array).asList() + return this.unsafeCast>().asList() } /** * Returns a *typed* object array containing all of the elements of this primitive array. */ public fun ByteArray.toTypedArray(): Array { - return copyOf() as Array + return copyOf().unsafeCast>() } /** * Returns a *typed* object array containing all of the elements of this primitive array. */ public fun ShortArray.toTypedArray(): Array { - return copyOf() as Array + return copyOf().unsafeCast>() } /** * Returns a *typed* object array containing all of the elements of this primitive array. */ public fun IntArray.toTypedArray(): Array { - return copyOf() as Array + return copyOf().unsafeCast>() } /** * Returns a *typed* object array containing all of the elements of this primitive array. */ public fun LongArray.toTypedArray(): Array { - return copyOf() as Array + return copyOf().unsafeCast>() } /** * Returns a *typed* object array containing all of the elements of this primitive array. */ public fun FloatArray.toTypedArray(): Array { - return copyOf() as Array + return copyOf().unsafeCast>() } /** * Returns a *typed* object array containing all of the elements of this primitive array. */ public fun DoubleArray.toTypedArray(): Array { - return copyOf() as Array + return copyOf().unsafeCast>() } /** * Returns a *typed* object array containing all of the elements of this primitive array. */ public fun BooleanArray.toTypedArray(): Array { - return copyOf() as Array + return copyOf().unsafeCast>() } /** * Returns a *typed* object array containing all of the elements of this primitive array. */ public fun CharArray.toTypedArray(): Array { - return copyOf() as Array + return copyOf().unsafeCast>() } /** diff --git a/js/js.libraries/src/core/kotlin.kt b/js/js.libraries/src/core/kotlin.kt index e2ce3b94040..db61d056276 100644 --- a/js/js.libraries/src/core/kotlin.kt +++ b/js/js.libraries/src/core/kotlin.kt @@ -21,7 +21,7 @@ import java.util.* /** * Returns an empty array of the specified type [T]. */ -public inline fun emptyArray(): Array = arrayOfNulls(0) as Array +public inline fun emptyArray(): Array = js("[]") @library public fun arrayOf(vararg elements: T): Array = noImpl @@ -70,7 +70,7 @@ public fun lazy(lock: Any?, initializer: () -> T): Lazy = UnsafeLazyImpl( internal fun arrayOfNulls(reference: Array, size: Int): Array { - return arrayOfNulls(size) as Array + return arrayOfNulls(size).unsafeCast>() } internal fun arrayCopyResize(source: dynamic, newSize: Int, defaultValue: Any?): dynamic { diff --git a/js/js.libraries/src/core/regexp.kt b/js/js.libraries/src/core/regexp.kt index 62710e5f7d4..6596b487873 100644 --- a/js/js.libraries/src/core/regexp.kt +++ b/js/js.libraries/src/core/regexp.kt @@ -50,4 +50,4 @@ public fun RegExp.reset() { } -public inline fun RegExpMatch.asArray(): Array = this.asDynamic() \ No newline at end of file +public inline fun RegExpMatch.asArray(): Array = unsafeCast>() \ No newline at end of file diff --git a/libraries/tools/kotlin-stdlib-gen/src/templates/SpecialJS.kt b/libraries/tools/kotlin-stdlib-gen/src/templates/SpecialJS.kt index a95f3b01efb..780dccb2feb 100644 --- a/libraries/tools/kotlin-stdlib-gen/src/templates/SpecialJS.kt +++ b/libraries/tools/kotlin-stdlib-gen/src/templates/SpecialJS.kt @@ -27,12 +27,12 @@ fun specialJS(): List { returns("List") body(ArraysOfObjects) { """ - return ArrayList(this as Array) + return ArrayList(this.unsafeCast>()) """ } inline(true, ArraysOfPrimitives) - body(ArraysOfPrimitives) {"""return (this as Array).asList()"""} + body(ArraysOfPrimitives) {"""return this.unsafeCast>().asList()"""} } @@ -46,7 +46,7 @@ fun specialJS(): List { } body { """ - return copyOf() as Array + return copyOf().unsafeCast>() """ } }