diff --git a/libraries/stdlib/js/src/kotlin/collections.kt b/libraries/stdlib/js/src/kotlin/collections.kt index 0c0f0376485..19897f480a4 100644 --- a/libraries/stdlib/js/src/kotlin/collections.kt +++ b/libraries/stdlib/js/src/kotlin/collections.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2018 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ @@ -60,11 +60,12 @@ internal actual fun copyToArrayImpl(collection: Collection<*>, array: Array< return array } - /** - * Returns an immutable list containing only the specified object [element]. + * Returns a new read-only list containing only the specified object [element]. + * + * @sample samples.collections.Collections.Lists.singletonReadOnlyList */ -public fun listOf(element: T): List = arrayListOf(element) +public actual fun listOf(element: T): List = arrayListOf(element) @PublishedApi @SinceKotlin("1.3") @@ -81,11 +82,12 @@ internal actual inline fun buildListInternal(capacity: Int, builderAction: M return ArrayList(capacity).apply(builderAction).build() } - /** - * Returns an immutable set containing only the specified object [element]. + * Returns a new read-only set containing only the specified object [element]. + * + * @sample samples.collections.Collections.Sets.singletonReadOnlySet */ -public fun setOf(element: T): Set = hashSetOf(element) +public actual fun setOf(element: T): Set = hashSetOf(element) @PublishedApi @SinceKotlin("1.3") @@ -101,13 +103,6 @@ internal actual inline fun buildSetInternal(capacity: Int, builderAction: Mu return LinkedHashSet(capacity).apply(builderAction).build() } - -/** - * Returns an immutable map, mapping only the specified key to the - * specified value. - */ -public fun mapOf(pair: Pair): Map = hashMapOf(pair) - @PublishedApi @SinceKotlin("1.3") @kotlin.internal.InlineOnly @@ -260,3 +255,11 @@ internal actual fun mapCapacity(expectedSize: Int) = expectedSize internal fun checkBuilderCapacity(capacity: Int) { require(capacity >= 0) { "capacity must be non-negative." } } + +/** + * Returns a new read-only map, mapping only the specified key to the + * specified value. + * + * @sample samples.collections.Maps.Instantiation.mapFromPairs + */ +public actual fun mapOf(pair: Pair): Map = hashMapOf(pair) \ No newline at end of file diff --git a/libraries/stdlib/jvm/src/kotlin/collections/CollectionsJVM.kt b/libraries/stdlib/jvm/src/kotlin/collections/CollectionsJVM.kt index 04fff9dc6b0..1276fdfb0d9 100644 --- a/libraries/stdlib/jvm/src/kotlin/collections/CollectionsJVM.kt +++ b/libraries/stdlib/jvm/src/kotlin/collections/CollectionsJVM.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ @@ -13,11 +13,13 @@ import kotlin.internal.InlineOnly import kotlin.internal.apiVersionIsAtLeast /** - * Returns an immutable list containing only the specified object [element]. + * Returns a new read-only list containing only the specified object [element]. + * * The returned list is serializable. + * * @sample samples.collections.Collections.Lists.singletonReadOnlyList */ -public fun listOf(element: T): List = java.util.Collections.singletonList(element) +public actual fun listOf(element: T): List = java.util.Collections.singletonList(element) @PublishedApi @SinceKotlin("1.3") diff --git a/libraries/stdlib/jvm/src/kotlin/collections/MapsJVM.kt b/libraries/stdlib/jvm/src/kotlin/collections/MapsJVM.kt index 0b914252295..c6f32006c69 100644 --- a/libraries/stdlib/jvm/src/kotlin/collections/MapsJVM.kt +++ b/libraries/stdlib/jvm/src/kotlin/collections/MapsJVM.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2018 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ @@ -15,16 +15,15 @@ import java.util.TreeMap import java.util.concurrent.ConcurrentMap import kotlin.collections.builders.MapBuilder - /** - * Returns an immutable map, mapping only the specified key to the + * Returns a new read-only map, mapping only the specified key to the * specified value. * * The returned map is serializable. * * @sample samples.collections.Maps.Instantiation.mapFromPairs */ -public fun mapOf(pair: Pair): Map = java.util.Collections.singletonMap(pair.first, pair.second) +public actual fun mapOf(pair: Pair): Map = java.util.Collections.singletonMap(pair.first, pair.second) @PublishedApi @SinceKotlin("1.3") diff --git a/libraries/stdlib/jvm/src/kotlin/collections/SetsJVM.kt b/libraries/stdlib/jvm/src/kotlin/collections/SetsJVM.kt index f233ad0aaaa..449831614dc 100644 --- a/libraries/stdlib/jvm/src/kotlin/collections/SetsJVM.kt +++ b/libraries/stdlib/jvm/src/kotlin/collections/SetsJVM.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2018 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ @@ -10,12 +10,14 @@ package kotlin.collections import kotlin.collections.builders.SetBuilder - /** - * Returns an immutable set containing only the specified object [element]. + * Returns a new read-only set containing only the specified object [element]. + * * The returned set is serializable. + * + * @sample samples.collections.Collections.Sets.singletonReadOnlySet */ -public fun setOf(element: T): Set = java.util.Collections.singleton(element) +public actual fun setOf(element: T): Set = java.util.Collections.singleton(element) @PublishedApi @SinceKotlin("1.3") diff --git a/libraries/stdlib/jvm/test/collections/CollectionJVMTest.kt b/libraries/stdlib/jvm/test/collections/CollectionJVMTest.kt index 965b5f5ba08..17729aaf5e4 100644 --- a/libraries/stdlib/jvm/test/collections/CollectionJVMTest.kt +++ b/libraries/stdlib/jvm/test/collections/CollectionJVMTest.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ @@ -184,10 +184,14 @@ class CollectionJVMTest { @Test fun emptyMapIsSerializable() = testSingletonSerialization(emptyMap()) - private fun testSingletonSerialization(value: Any) { + private fun checkSerializeAndDeserialize(value: Any): Any { val result = serializeAndDeserialize(value) - assertEquals(value, result) + return result + } + + private fun testSingletonSerialization(value: Any) { + val result = checkSerializeAndDeserialize(value) assertSame(value, result) } @@ -245,7 +249,6 @@ class CollectionJVMTest { testCollectionBuilderSerialization(source) } - private fun testCollectionBuilderSerialization(value: Any) { val result = serializeAndDeserialize(value) assertEquals(value, result) @@ -260,4 +263,14 @@ class CollectionJVMTest { } } + @Test fun singletonListIsSerializable() = testSingletonCollectionSerialization(listOf(42)) + + @Test fun singletonSetIsSerializable() = testSingletonCollectionSerialization(setOf(42)) + + @Test fun singletonMapIsSerializable() = testSingletonCollectionSerialization(mapOf("hello" to "world")) + + private fun testSingletonCollectionSerialization(value: Any) { + val deserialized = checkSerializeAndDeserialize(value) + assertReadOnly(deserialized) + } } diff --git a/libraries/stdlib/native-wasm/src/kotlin/collections/Collections.kt b/libraries/stdlib/native-wasm/src/kotlin/collections/Collections.kt index 3333aba2421..67f1540032d 100644 --- a/libraries/stdlib/native-wasm/src/kotlin/collections/Collections.kt +++ b/libraries/stdlib/native-wasm/src/kotlin/collections/Collections.kt @@ -122,3 +122,11 @@ internal actual inline fun checkCountOverflow(count: Int): Int { } return count } + +/** + * Returns a new read-only list containing only the specified object [element]. + * + * @sample samples.collections.Collections.Lists.singletonReadOnlyList + */ +@SinceKotlin("1.9") +public actual fun listOf(element: T): List = arrayListOf(element) diff --git a/libraries/stdlib/native-wasm/src/kotlin/collections/Maps.kt b/libraries/stdlib/native-wasm/src/kotlin/collections/Maps.kt index f4ba76b9180..0b37b203b6c 100644 --- a/libraries/stdlib/native-wasm/src/kotlin/collections/Maps.kt +++ b/libraries/stdlib/native-wasm/src/kotlin/collections/Maps.kt @@ -34,3 +34,12 @@ internal actual fun Map.toSingletonMap(): Map */ @PublishedApi internal actual fun mapCapacity(expectedSize: Int) = expectedSize + +/** + * Returns a new read-only map, mapping only the specified key to the + * specified value. + * + * @sample samples.collections.Maps.Instantiation.mapFromPairs + */ +@SinceKotlin("1.9") +public actual fun mapOf(pair: Pair): Map = hashMapOf(pair) \ No newline at end of file diff --git a/libraries/stdlib/native-wasm/src/kotlin/collections/Sets.kt b/libraries/stdlib/native-wasm/src/kotlin/collections/Sets.kt index 5c7179c0a52..eaa6c24f50c 100644 --- a/libraries/stdlib/native-wasm/src/kotlin/collections/Sets.kt +++ b/libraries/stdlib/native-wasm/src/kotlin/collections/Sets.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * Copyright 2010-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license * that can be found in the LICENSE file. */ @@ -7,9 +7,11 @@ package kotlin.collections // TODO: Add SingletonSet class /** - * Returns an immutable set containing only the specified object [element]. + * Returns a new read-only set containing only the specified object [element]. + * + * @sample samples.collections.Collections.Sets.singletonReadOnlySet */ -public fun setOf(element: T): Set = hashSetOf(element) +public actual fun setOf(element: T): Set = hashSetOf(element) @PublishedApi @SinceKotlin("1.3") diff --git a/libraries/stdlib/samples/test/samples/collections/collections.kt b/libraries/stdlib/samples/test/samples/collections/collections.kt index c20a7671b95..c7c7848510d 100644 --- a/libraries/stdlib/samples/test/samples/collections/collections.kt +++ b/libraries/stdlib/samples/test/samples/collections/collections.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ @@ -301,6 +301,13 @@ class Collections { assertTrue(set1 == set2) } + @Sample + fun singletonReadOnlySet() { + val set = setOf('a') + assertPrints(set, "[a]") + assertPrints(set.size, "1") + } + @Sample fun emptyMutableSet() { val set = mutableSetOf() diff --git a/libraries/stdlib/src/kotlin/collections/Collections.kt b/libraries/stdlib/src/kotlin/collections/Collections.kt index 50f6ea79fec..f49586206b2 100644 --- a/libraries/stdlib/src/kotlin/collections/Collections.kt +++ b/libraries/stdlib/src/kotlin/collections/Collections.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ @@ -76,6 +76,16 @@ public fun emptyList(): List = EmptyList */ public fun listOf(vararg elements: T): List = if (elements.size > 0) elements.asList() else emptyList() +/** + * Returns a new read-only list containing only the specified object [element]. + * + * The returned list is serializable (JVM). + * + * @sample samples.collections.Collections.Lists.singletonReadOnlyList + */ +@SinceKotlin("1.9") +public expect fun listOf(element: T): List + /** * Returns an empty read-only list. The returned list is serializable (JVM). * @sample samples.collections.Collections.Lists.emptyReadOnlyList diff --git a/libraries/stdlib/src/kotlin/collections/Maps.kt b/libraries/stdlib/src/kotlin/collections/Maps.kt index 483060040c6..721b4045dbf 100644 --- a/libraries/stdlib/src/kotlin/collections/Maps.kt +++ b/libraries/stdlib/src/kotlin/collections/Maps.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ @@ -54,6 +54,17 @@ public fun emptyMap(): Map = @Suppress("UNCHECKED_CAST") (EmptyMap public fun mapOf(vararg pairs: Pair): Map = if (pairs.size > 0) pairs.toMap(LinkedHashMap(mapCapacity(pairs.size))) else emptyMap() +/** + * Returns a new read-only map, mapping only the specified key to the + * specified value. + * + * The returned map is serializable (JVM). + * + * @sample samples.collections.Maps.Instantiation.mapFromPairs + */ +@SinceKotlin("1.9") +public expect fun mapOf(pair: Pair): Map + /** * Returns an empty read-only map. * diff --git a/libraries/stdlib/src/kotlin/collections/Sets.kt b/libraries/stdlib/src/kotlin/collections/Sets.kt index 4b65ddb9f91..342e2a60a0f 100644 --- a/libraries/stdlib/src/kotlin/collections/Sets.kt +++ b/libraries/stdlib/src/kotlin/collections/Sets.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ @@ -43,6 +43,16 @@ public fun emptySet(): Set = EmptySet */ public fun setOf(vararg elements: T): Set = if (elements.size > 0) elements.toSet() else emptySet() +/** + * Returns a new read-only set containing only the specified object [element]. + * + * The returned set is serializable (JVM). + * + * @sample samples.collections.Collections.Sets.singletonReadOnlySet + */ +@SinceKotlin("1.9") +public expect fun setOf(element: T): Set + /** * Returns an empty read-only set. The returned set is serializable (JVM). * @sample samples.collections.Collections.Sets.emptyReadOnlySet