diff --git a/js/js.libraries/src/core/javautilCode.kt b/js/js.libraries/src/core/javautilCode.kt index 80ee60c6c27..634afc4083f 100644 --- a/js/js.libraries/src/core/javautilCode.kt +++ b/js/js.libraries/src/core/javautilCode.kt @@ -22,10 +22,10 @@ public fun HashSet(c: Collection): HashSet public fun LinkedHashSet(c: Collection): HashSet = LinkedHashSet(c.size).apply { addAll(c) } -public fun HashMap(m: Map): HashMap +public fun HashMap(m: Map): HashMap = HashMap(m.size).apply { putAll(m) } -public fun LinkedHashMap(m: Map): LinkedHashMap +public fun LinkedHashMap(m: Map): LinkedHashMap = LinkedHashMap(m.size).apply { putAll(m) } public fun ArrayList(c: Collection): ArrayList diff --git a/libraries/stdlib/src/kotlin/collections/Maps.kt b/libraries/stdlib/src/kotlin/collections/Maps.kt index c4f87e8a7b3..445bd9d6155 100644 --- a/libraries/stdlib/src/kotlin/collections/Maps.kt +++ b/libraries/stdlib/src/kotlin/collections/Maps.kt @@ -404,31 +404,31 @@ public fun > Sequence>.toMap(destina /** * Creates a new read-only map by replacing or adding an entry to this map from a given key-value [pair]. */ -public operator fun Map.plus(pair: Pair): Map +public operator fun Map.plus(pair: Pair): Map = LinkedHashMap(this).apply { put(pair.first, pair.second) } /** * Creates a new read-only map by replacing or adding entries to this map from a given collection of key-value [pairs]. */ -public operator fun Map.plus(pairs: Iterable>): Map +public operator fun Map.plus(pairs: Iterable>): Map = LinkedHashMap(this).apply { putAll(pairs) } /** * Creates a new read-only map by replacing or adding entries to this map from a given array of key-value [pairs]. */ -public operator fun Map.plus(pairs: Array>): Map +public operator fun Map.plus(pairs: Array>): Map = LinkedHashMap(this).apply { putAll(pairs) } /** * Creates a new read-only map by replacing or adding entries to this map from a given sequence of key-value [pairs]. */ -public operator fun Map.plus(pairs: Sequence>): Map +public operator fun Map.plus(pairs: Sequence>): Map = LinkedHashMap(this).apply { putAll(pairs) } /** * Creates a new read-only map by replacing or adding entries to this map from another [map]. */ -public operator fun Map.plus(map: Map): Map +public operator fun Map.plus(map: Map): Map = LinkedHashMap(this).apply { putAll(map) } diff --git a/libraries/stdlib/test/collections/MapTest.kt b/libraries/stdlib/test/collections/MapTest.kt index 9c04ec32b0e..ae233531701 100644 --- a/libraries/stdlib/test/collections/MapTest.kt +++ b/libraries/stdlib/test/collections/MapTest.kt @@ -337,6 +337,22 @@ class MapTest { @test fun plusMap() = testPlus { it + mapOf("C" to 3, "B" to 4) } + @test fun plusAny() { + testPlusAny(emptyMap(), 1 to "A") + testPlusAny(mapOf("A" to null), "A" as CharSequence to 2) + } + + fun testPlusAny(mapObject: Any, pair: Pair) { + val map = mapObject as Map<*, *> + fun assertContains(map: Map<*, *>) = assertEquals(pair.second, map[pair.first]) + + assertContains(map + pair) + assertContains(map + listOf(pair)) + assertContains(map + arrayOf(pair)) + assertContains(map + sequenceOf(pair)) + assertContains(map + mapOf(pair)) + } + fun testIdempotent(operation: (Map) -> Map) {