From 80f2efb625aa7fa4d6fddbaa800f23af8b883969 Mon Sep 17 00:00:00 2001 From: Ilya Gorbunov Date: Thu, 12 Jan 2017 00:55:17 +0300 Subject: [PATCH] joinTo/joinToString: Do not call toString on elements that are already CharSequence or Char. #KT-15557 --- js/js.libraries/src/core/generated/_ArraysJs.kt | 7 ++----- .../src/core/generated/_CollectionsJs.kt | 5 +---- .../src/core/generated/_SequencesJs.kt | 5 +---- libraries/stdlib/common/src/generated/_Arrays.kt | 7 ++----- .../stdlib/common/src/generated/_Collections.kt | 5 +---- .../stdlib/common/src/generated/_Sequences.kt | 5 +---- libraries/stdlib/src/generated/_Arrays.kt | 7 ++----- libraries/stdlib/src/generated/_Collections.kt | 5 +---- libraries/stdlib/src/generated/_Sequences.kt | 5 +---- .../stdlib/src/kotlin/text/StringBuilder.kt | 10 ++++++++++ libraries/stdlib/test/collections/ArraysTest.kt | 16 ++++++++++++++++ .../stdlib/test/collections/CollectionTest.kt | 6 +++--- .../kotlin-stdlib-gen/src/templates/Strings.kt | 9 +++------ 13 files changed, 44 insertions(+), 48 deletions(-) diff --git a/js/js.libraries/src/core/generated/_ArraysJs.kt b/js/js.libraries/src/core/generated/_ArraysJs.kt index 20d7ae04055..7f1f9ca7255 100644 --- a/js/js.libraries/src/core/generated/_ArraysJs.kt +++ b/js/js.libraries/src/core/generated/_ArraysJs.kt @@ -12158,10 +12158,7 @@ public fun Array.joinTo(buffer: A, separator: CharSeq for (element in this) { if (++count > 1) buffer.append(separator) if (limit < 0 || count <= limit) { - if (transform != null) - buffer.append(transform(element)) - else - buffer.append(if (element == null) "null" else element.toString()) + buffer.appendElement(element, transform) } else break } if (limit >= 0 && count > limit) buffer.append(truncated) @@ -12345,7 +12342,7 @@ public fun CharArray.joinTo(buffer: A, separator: CharSequence if (transform != null) buffer.append(transform(element)) else - buffer.append(element.toString()) + buffer.append(element) } else break } if (limit >= 0 && count > limit) buffer.append(truncated) diff --git a/js/js.libraries/src/core/generated/_CollectionsJs.kt b/js/js.libraries/src/core/generated/_CollectionsJs.kt index f2336a83f34..17fa184d739 100644 --- a/js/js.libraries/src/core/generated/_CollectionsJs.kt +++ b/js/js.libraries/src/core/generated/_CollectionsJs.kt @@ -2000,10 +2000,7 @@ public fun Iterable.joinTo(buffer: A, separator: CharSequ for (element in this) { if (++count > 1) buffer.append(separator) if (limit < 0 || count <= limit) { - if (transform != null) - buffer.append(transform(element)) - else - buffer.append(if (element == null) "null" else element.toString()) + buffer.appendElement(element, transform) } else break } if (limit >= 0 && count > limit) buffer.append(truncated) diff --git a/js/js.libraries/src/core/generated/_SequencesJs.kt b/js/js.libraries/src/core/generated/_SequencesJs.kt index 62f49f6ed8b..890faacf2b4 100644 --- a/js/js.libraries/src/core/generated/_SequencesJs.kt +++ b/js/js.libraries/src/core/generated/_SequencesJs.kt @@ -1271,10 +1271,7 @@ public fun Sequence.joinTo(buffer: A, separator: CharSequ for (element in this) { if (++count > 1) buffer.append(separator) if (limit < 0 || count <= limit) { - if (transform != null) - buffer.append(transform(element)) - else - buffer.append(if (element == null) "null" else element.toString()) + buffer.appendElement(element, transform) } else break } if (limit >= 0 && count > limit) buffer.append(truncated) diff --git a/libraries/stdlib/common/src/generated/_Arrays.kt b/libraries/stdlib/common/src/generated/_Arrays.kt index b07d1f6a8e2..f463289f29b 100644 --- a/libraries/stdlib/common/src/generated/_Arrays.kt +++ b/libraries/stdlib/common/src/generated/_Arrays.kt @@ -6812,10 +6812,7 @@ public fun Array.joinTo(buffer: A, separator: CharSeq for (element in this) { if (++count > 1) buffer.append(separator) if (limit < 0 || count <= limit) { - if (transform != null) - buffer.append(transform(element)) - else - buffer.append(if (element == null) "null" else element.toString()) + buffer.appendElement(element, transform) } else break } if (limit >= 0 && count > limit) buffer.append(truncated) @@ -6999,7 +6996,7 @@ public fun CharArray.joinTo(buffer: A, separator: CharSequence if (transform != null) buffer.append(transform(element)) else - buffer.append(element.toString()) + buffer.append(element) } else break } if (limit >= 0 && count > limit) buffer.append(truncated) diff --git a/libraries/stdlib/common/src/generated/_Collections.kt b/libraries/stdlib/common/src/generated/_Collections.kt index eb1c95ed05c..2885009e23f 100644 --- a/libraries/stdlib/common/src/generated/_Collections.kt +++ b/libraries/stdlib/common/src/generated/_Collections.kt @@ -1013,10 +1013,7 @@ public fun Iterable.joinTo(buffer: A, separator: CharSequ for (element in this) { if (++count > 1) buffer.append(separator) if (limit < 0 || count <= limit) { - if (transform != null) - buffer.append(transform(element)) - else - buffer.append(if (element == null) "null" else element.toString()) + buffer.appendElement(element, transform) } else break } if (limit >= 0 && count > limit) buffer.append(truncated) diff --git a/libraries/stdlib/common/src/generated/_Sequences.kt b/libraries/stdlib/common/src/generated/_Sequences.kt index 1ce38dbf106..d54619e90d5 100644 --- a/libraries/stdlib/common/src/generated/_Sequences.kt +++ b/libraries/stdlib/common/src/generated/_Sequences.kt @@ -705,10 +705,7 @@ public fun Sequence.joinTo(buffer: A, separator: CharSequ for (element in this) { if (++count > 1) buffer.append(separator) if (limit < 0 || count <= limit) { - if (transform != null) - buffer.append(transform(element)) - else - buffer.append(if (element == null) "null" else element.toString()) + buffer.appendElement(element, transform) } else break } if (limit >= 0 && count > limit) buffer.append(truncated) diff --git a/libraries/stdlib/src/generated/_Arrays.kt b/libraries/stdlib/src/generated/_Arrays.kt index 6a8a3ebd096..14b90ab8989 100644 --- a/libraries/stdlib/src/generated/_Arrays.kt +++ b/libraries/stdlib/src/generated/_Arrays.kt @@ -12241,10 +12241,7 @@ public fun Array.joinTo(buffer: A, separator: CharSeq for (element in this) { if (++count > 1) buffer.append(separator) if (limit < 0 || count <= limit) { - if (transform != null) - buffer.append(transform(element)) - else - buffer.append(if (element == null) "null" else element.toString()) + buffer.appendElement(element, transform) } else break } if (limit >= 0 && count > limit) buffer.append(truncated) @@ -12428,7 +12425,7 @@ public fun CharArray.joinTo(buffer: A, separator: CharSequence if (transform != null) buffer.append(transform(element)) else - buffer.append(element.toString()) + buffer.append(element) } else break } if (limit >= 0 && count > limit) buffer.append(truncated) diff --git a/libraries/stdlib/src/generated/_Collections.kt b/libraries/stdlib/src/generated/_Collections.kt index 4d619784204..2f77b7cde5c 100644 --- a/libraries/stdlib/src/generated/_Collections.kt +++ b/libraries/stdlib/src/generated/_Collections.kt @@ -2011,10 +2011,7 @@ public fun Iterable.joinTo(buffer: A, separator: CharSequ for (element in this) { if (++count > 1) buffer.append(separator) if (limit < 0 || count <= limit) { - if (transform != null) - buffer.append(transform(element)) - else - buffer.append(if (element == null) "null" else element.toString()) + buffer.appendElement(element, transform) } else break } if (limit >= 0 && count > limit) buffer.append(truncated) diff --git a/libraries/stdlib/src/generated/_Sequences.kt b/libraries/stdlib/src/generated/_Sequences.kt index 6fce4f81202..082875cd3ac 100644 --- a/libraries/stdlib/src/generated/_Sequences.kt +++ b/libraries/stdlib/src/generated/_Sequences.kt @@ -1290,10 +1290,7 @@ public fun Sequence.joinTo(buffer: A, separator: CharSequ for (element in this) { if (++count > 1) buffer.append(separator) if (limit < 0 || count <= limit) { - if (transform != null) - buffer.append(transform(element)) - else - buffer.append(if (element == null) "null" else element.toString()) + buffer.appendElement(element, transform) } else break } if (limit >= 0 && count > limit) buffer.append(truncated) diff --git a/libraries/stdlib/src/kotlin/text/StringBuilder.kt b/libraries/stdlib/src/kotlin/text/StringBuilder.kt index a3bbd6a9d73..0a09255c81f 100644 --- a/libraries/stdlib/src/kotlin/text/StringBuilder.kt +++ b/libraries/stdlib/src/kotlin/text/StringBuilder.kt @@ -53,3 +53,13 @@ public fun StringBuilder.append(vararg value: Any?): StringBuilder { @kotlin.jvm.JvmVersion @kotlin.internal.InlineOnly public inline operator fun StringBuilder.set(index: Int, value: Char): Unit = this.setCharAt(index, value) + + +internal fun Appendable.appendElement(element: T, transform: ((T) -> CharSequence)?) { + when { + transform != null -> append(transform(element)) + element is CharSequence? -> append(element) + element is Char -> append(element) + else -> append(element.toString()) + } +} diff --git a/libraries/stdlib/test/collections/ArraysTest.kt b/libraries/stdlib/test/collections/ArraysTest.kt index ebe5df046bf..7df2e894ecf 100644 --- a/libraries/stdlib/test/collections/ArraysTest.kt +++ b/libraries/stdlib/test/collections/ArraysTest.kt @@ -259,6 +259,22 @@ class ArraysTest { } + @Test fun joinToString() { + val text = arrayOf("foo", "bar").joinToString("-", "<", ">") + assertEquals("", text) + + val text2 = arrayOf('a', "b", StringBuilder("c"), null, "d", 'e', 'f').joinToString(limit = 4, truncated = "*") + assertEquals("a, b, c, null, *", text2) + + val text3 = intArrayOf(1, 2, 5, 8).joinToString("+", "[", "]") + assertEquals("[1+2+5+8]", text3) + + val text4 = charArrayOf('f', 'o', 'o').joinToString() + assertEquals("f, o, o", text4) + } + + + @Test fun min() { expect(null, { arrayOf().min() }) expect(1, { arrayOf(1).min() }) diff --git a/libraries/stdlib/test/collections/CollectionTest.kt b/libraries/stdlib/test/collections/CollectionTest.kt index 0b61a9a83c5..c3df8309e5d 100644 --- a/libraries/stdlib/test/collections/CollectionTest.kt +++ b/libraries/stdlib/test/collections/CollectionTest.kt @@ -42,9 +42,9 @@ class CollectionTest { val text = data.joinToString("-", "<", ">") assertEquals("", text) - val big = listOf("a", "b", "c", "d", "e", "f") - val text2 = big.joinToString(limit = 3, truncated = "*") - assertEquals("a, b, c, *", text2) + val mixed = listOf('a', "b", StringBuilder("c"), null, "d", 'e', 'f') + val text2 = mixed.joinToString(limit = 4, truncated = "*") + assertEquals("a, b, c, null, *", text2) } @Test fun filterNotNull() { diff --git a/libraries/tools/kotlin-stdlib-gen/src/templates/Strings.kt b/libraries/tools/kotlin-stdlib-gen/src/templates/Strings.kt index 1ab836e2232..3df60f1eaaf 100644 --- a/libraries/tools/kotlin-stdlib-gen/src/templates/Strings.kt +++ b/libraries/tools/kotlin-stdlib-gen/src/templates/Strings.kt @@ -23,10 +23,7 @@ fun strings(): List { for (element in this) { if (++count > 1) buffer.append(separator) if (limit < 0 || count <= limit) { - if (transform != null) - buffer.append(transform(element)) - else - buffer.append(if (element == null) "null" else element.toString()) + buffer.appendElement(element, transform) } else break } if (limit >= 0 && count > limit) buffer.append(truncated) @@ -35,7 +32,7 @@ fun strings(): List { """ } exclude(Strings) - body(ArraysOfPrimitives) { + bodyForTypes(ArraysOfPrimitives, *defaultPrimitives.toTypedArray()) { primitive -> """ buffer.append(prefix) var count = 0 @@ -45,7 +42,7 @@ fun strings(): List { if (transform != null) buffer.append(transform(element)) else - buffer.append(element.toString()) + buffer.append(${if (primitive == PrimitiveType.Char) "element" else "element.toString()"}) } else break } if (limit >= 0 && count > limit) buffer.append(truncated)