[stdlib] Introduce interface to access collection toArray on non-JVM platforms
diff --git a/kotlin-native/runtime/src/main/kotlin/kotlin/collections/ArraysNative.kt b/kotlin-native/runtime/src/main/kotlin/kotlin/collections/ArraysNative.kt
index 36fca3d..2e2ea09 100644
--- a/kotlin-native/runtime/src/main/kotlin/kotlin/collections/ArraysNative.kt
+++ b/kotlin-native/runtime/src/main/kotlin/kotlin/collections/ArraysNative.kt
@@ -12,7 +12,12 @@
* and populates the array with the elements of this collection.
* @sample samples.collections.Collections.Collections.collectionToTypedArray
*/
-public actual inline fun <reified T> Collection<T>.toTypedArray(): Array<T> {
+public actual inline fun <reified T> Collection<T>.toTypedArray(): Array<T> = copyToTypedArray()
+
+@PublishedApi
+internal fun <T> Collection<T>.copyToTypedArray(): Array<T> {
+ @Suppress("UNCHECKED_CAST")
+ if (this is SupportsToArray) return toArray() as Array<T>
val result = arrayOfNulls<T>(size)
var index = 0
for (element in this) result[index++] = element
diff --git a/libraries/stdlib/js/src/kotlin/collectionJs.kt b/libraries/stdlib/js/src/kotlin/collectionJs.kt
index 562b46d..4889381 100644
--- a/libraries/stdlib/js/src/kotlin/collectionJs.kt
+++ b/libraries/stdlib/js/src/kotlin/collectionJs.kt
@@ -29,8 +29,8 @@
@JsName("copyToArray")
@PublishedApi
internal fun <T> copyToArray(collection: Collection<T>): Array<T> {
- return if (collection.asDynamic().toArray !== undefined)
- collection.asDynamic().toArray().unsafeCast<Array<T>>()
+ return if (collection is SupportsToArray)
+ collection.toArray().unsafeCast<Array<T>>()
else
collectionToArray(collection).unsafeCast<Array<T>>()
}
diff --git a/libraries/stdlib/src/kotlin/collections/AbstractCollection.kt b/libraries/stdlib/src/kotlin/collections/AbstractCollection.kt
index 9f92754..316184b 100644
--- a/libraries/stdlib/src/kotlin/collections/AbstractCollection.kt
+++ b/libraries/stdlib/src/kotlin/collections/AbstractCollection.kt
@@ -12,7 +12,7 @@
* @param E the type of elements contained in the collection. The collection is covariant in its element type.
*/
@SinceKotlin("1.1")
-public abstract class AbstractCollection<out E> protected constructor() : Collection<E> {
+public abstract class AbstractCollection<out E> protected constructor() : Collection<E>, SupportsToArray {
abstract override val size: Int
abstract override fun iterator(): Iterator<E>
@@ -30,8 +30,9 @@
/**
* Returns new array of type `Array<Any?>` with the elements of this collection.
*/
- @JsName("toArray")
- protected open fun toArray(): Array<Any?> = collectionToArray(this)
+// @JsName("toArray")
+ @Suppress("CANNOT_WEAKEN_ACCESS_PRIVILEGE")
+ protected override fun toArray(): Array<Any?> = collectionToArray(this)
/**
* Fills the provided [array] or creates new array of the same type
@@ -45,5 +46,11 @@
*
* @return An array containing all elements of this collection.
*/
- protected open fun <T> toArray(array: Array<T>): Array<T> = collectionToArray(this, array)
+ @Suppress("CANNOT_WEAKEN_ACCESS_PRIVILEGE")
+ protected override fun <T> toArray(array: Array<T>): Array<T> = collectionToArray(this, array)
}
+
+internal interface SupportsToArray {
+ fun toArray(): Array<Any?>
+ fun <T> toArray(array: Array<T>): Array<T>
+}
\ No newline at end of file
diff --git a/libraries/stdlib/wasm/src/kotlin/collections/ArraysWasm.kt b/libraries/stdlib/wasm/src/kotlin/collections/ArraysWasm.kt
index 50271fd..17652d9 100644
--- a/libraries/stdlib/wasm/src/kotlin/collections/ArraysWasm.kt
+++ b/libraries/stdlib/wasm/src/kotlin/collections/ArraysWasm.kt
@@ -18,8 +18,7 @@
@Suppress("UNCHECKED_CAST")
@PublishedApi
internal fun <T> copyToArray(collection: Collection<T>): Array<T> =
- if (collection is AbstractCollection<T>)
- //TODO: Find more proper way to call abstract collection's toArray
- @Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE") collection.toArray() as Array<T>
+ if (collection is SupportsToArray)
+ collection.toArray() as Array<T>
else
collectionToArray(collection) as Array<T>
\ No newline at end of file
diff --git a/libraries/tools/binary-compatibility-validator/klib-public-api/kotlin-stdlib.api b/libraries/tools/binary-compatibility-validator/klib-public-api/kotlin-stdlib.api
index de477f3..906889b 100644
--- a/libraries/tools/binary-compatibility-validator/klib-public-api/kotlin-stdlib.api
+++ b/libraries/tools/binary-compatibility-validator/klib-public-api/kotlin-stdlib.api
@@ -1065,7 +1065,7 @@
final object Companion // kotlin/Enum.Companion|null[0]
}
-abstract class <#A: out kotlin/Any?> kotlin.collections/AbstractCollection : kotlin.collections/Collection<#A> { // kotlin.collections/AbstractCollection|null[0]
+abstract class <#A: out kotlin/Any?> kotlin.collections/AbstractCollection : kotlin.collections/Collection<#A>, kotlin.collections/SupportsToArray { // kotlin.collections/AbstractCollection|null[0]
constructor <init>() // kotlin.collections/AbstractCollection.<init>|<init>(){}[0]
abstract val size // kotlin.collections/AbstractCollection.size|{}size[0]
@@ -12273,6 +12273,9 @@
final fun <#A: kotlin/Any?> (#A).kotlin.native.concurrent/freeze(): #A // kotlin.native.concurrent/freeze|freeze@0:0(){0§<kotlin.Any?>}[0]
// Targets: [native]
+final fun <#A: kotlin/Any?> (kotlin.collections/Collection<#A>).kotlin.collections/copyToTypedArray(): kotlin/Array<#A> // kotlin.collections/copyToTypedArray|copyToTypedArray@kotlin.collections.Collection<0:0>(){0§<kotlin.Any?>}[0]
+
+// Targets: [native]
final fun <#A: kotlin/Any?> (kotlin.collections/Collection<kotlin.native.concurrent/Future<#A>>).kotlin.native.concurrent/waitForMultipleFutures(kotlin/Int): kotlin.collections/Set<kotlin.native.concurrent/Future<#A>> // kotlin.native.concurrent/waitForMultipleFutures|waitForMultipleFutures@kotlin.collections.Collection<kotlin.native.concurrent.Future<0:0>>(kotlin.Int){0§<kotlin.Any?>}[0]
// Targets: [native]
diff --git a/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-stdlib-runtime-merged.txt b/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-stdlib-runtime-merged.txt
index 36c81ca..6a3f01c 100644
--- a/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-stdlib-runtime-merged.txt
+++ b/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-stdlib-runtime-merged.txt
@@ -583,7 +583,7 @@
public abstract fun allowedTargets ()[Lkotlin/annotation/AnnotationTarget;
}
-public abstract class kotlin/collections/AbstractCollection : java/util/Collection, kotlin/jvm/internal/markers/KMappedMarker {
+public abstract class kotlin/collections/AbstractCollection : java/util/Collection, kotlin/collections/SupportsToArray, kotlin/jvm/internal/markers/KMappedMarker {
protected fun <init> ()V
public fun add (Ljava/lang/Object;)Z
public fun addAll (Ljava/util/Collection;)Z