diff --git a/libraries/stdlib/js/src/kotlin/text/StringBuilderJs.kt b/libraries/stdlib/js/src/kotlin/text/StringBuilderJs.kt index 91c6559804b..88d74f2f956 100644 --- a/libraries/stdlib/js/src/kotlin/text/StringBuilderJs.kt +++ b/libraries/stdlib/js/src/kotlin/text/StringBuilderJs.kt @@ -46,8 +46,8 @@ public actual class StringBuilder actual constructor(content: String) : Appendab return this } - @OptIn(ExperimentalStdlibApi::class) - actual override fun append(value: CharSequence?, startIndex: Int, endIndex: Int): StringBuilder = this.appendRange(value, startIndex, endIndex) + actual override fun append(value: CharSequence?, startIndex: Int, endIndex: Int): StringBuilder = + this.appendRange(value ?: "null", startIndex, endIndex) /** * Reverses the contents of this string builder and returns this instance. @@ -96,7 +96,6 @@ public actual class StringBuilder actual constructor(content: String) : Appendab * and then that string was appended to this string builder. */ @SinceKotlin("1.3") -// @ExperimentalStdlibApi actual fun append(value: Boolean): StringBuilder { string += value return this @@ -107,9 +106,10 @@ public actual class StringBuilder actual constructor(content: String) : Appendab * * Characters are appended in order, starting at the index 0. */ - @SinceKotlin("1.3") - @ExperimentalStdlibApi + @SinceKotlin("1.4") + @WasExperimental(ExperimentalStdlibApi::class) actual fun append(value: CharArray): StringBuilder { + @OptIn(ExperimentalStdlibApi::class) string += value.concatToString() return this } @@ -118,7 +118,6 @@ public actual class StringBuilder actual constructor(content: String) : Appendab * Appends the specified string [value] to this string builder and returns this instance. */ @SinceKotlin("1.3") -// @ExperimentalStdlibApi actual fun append(value: String): StringBuilder { this.string += value return this @@ -131,8 +130,8 @@ public actual class StringBuilder actual constructor(content: String) : Appendab * * In Kotlin/JS implementation of StringBuilder the value returned from this method may not indicate the actual size of the backing storage. */ - @SinceKotlin("1.3") - @ExperimentalStdlibApi + @SinceKotlin("1.4") + @WasExperimental(ExperimentalStdlibApi::class) actual fun capacity(): Int = if (this.asDynamic()._capacity !== undefined) maxOf(this.asDynamic()._capacity, length) else length /** @@ -144,8 +143,8 @@ public actual class StringBuilder actual constructor(content: String) : Appendab * In Kotlin/JS implementation of StringBuilder the size of the backing storage is not extended to comply the given [minimumCapacity], * thus calling this method has no effect on the further performance of operations. */ - @SinceKotlin("1.3") - @ExperimentalStdlibApi + @SinceKotlin("1.4") + @WasExperimental(ExperimentalStdlibApi::class) actual fun ensureCapacity(minimumCapacity: Int) { if (minimumCapacity > capacity()) { this.asDynamic()._capacity = minimumCapacity @@ -157,8 +156,8 @@ public actual class StringBuilder actual constructor(content: String) : Appendab * * Returns `-1` if the specified [string] does not occur in this string builder. */ - @SinceKotlin("1.3") - @ExperimentalStdlibApi + @SinceKotlin("1.4") + @WasExperimental(ExperimentalStdlibApi::class) actual fun indexOf(string: String): Int = this.string.asDynamic().indexOf(string) /** @@ -167,8 +166,8 @@ public actual class StringBuilder actual constructor(content: String) : Appendab * * Returns `-1` if the specified [string] does not occur in this string builder starting at the specified [startIndex]. */ - @SinceKotlin("1.3") - @ExperimentalStdlibApi + @SinceKotlin("1.4") + @WasExperimental(ExperimentalStdlibApi::class) actual fun indexOf(string: String, startIndex: Int): Int = this.string.asDynamic().indexOf(string, startIndex) /** @@ -177,8 +176,8 @@ public actual class StringBuilder actual constructor(content: String) : Appendab * * Returns `-1` if the specified [string] does not occur in this string builder. */ - @SinceKotlin("1.3") - @ExperimentalStdlibApi + @SinceKotlin("1.4") + @WasExperimental(ExperimentalStdlibApi::class) actual fun lastIndexOf(string: String): Int = this.string.asDynamic().lastIndexOf(string) /** @@ -187,8 +186,8 @@ public actual class StringBuilder actual constructor(content: String) : Appendab * * Returns `-1` if the specified [string] does not occur in this string builder starting at the specified [startIndex]. */ - @SinceKotlin("1.3") - @ExperimentalStdlibApi + @SinceKotlin("1.4") + @WasExperimental(ExperimentalStdlibApi::class) actual fun lastIndexOf(string: String, startIndex: Int): Int { if (string.isEmpty() && startIndex < 0) return -1 return this.string.asDynamic().lastIndexOf(string, startIndex) @@ -202,8 +201,8 @@ public actual class StringBuilder actual constructor(content: String) : Appendab * * @throws IndexOutOfBoundsException if [index] is less than zero or greater than the length of this string builder. */ - @SinceKotlin("1.3") - @ExperimentalStdlibApi + @SinceKotlin("1.4") + @WasExperimental(ExperimentalStdlibApi::class) actual fun insert(index: Int, value: Boolean): StringBuilder { AbstractList.checkPositionIndex(index, length) @@ -216,8 +215,8 @@ public actual class StringBuilder actual constructor(content: String) : Appendab * * @throws IndexOutOfBoundsException if [index] is less than zero or greater than the length of this string builder. */ - @SinceKotlin("1.3") - @ExperimentalStdlibApi + @SinceKotlin("1.4") + @WasExperimental(ExperimentalStdlibApi::class) actual fun insert(index: Int, value: Char): StringBuilder { AbstractList.checkPositionIndex(index, length) @@ -232,11 +231,12 @@ public actual class StringBuilder actual constructor(content: String) : Appendab * * @throws IndexOutOfBoundsException if [index] is less than zero or greater than the length of this string builder. */ - @SinceKotlin("1.3") - @ExperimentalStdlibApi + @SinceKotlin("1.4") + @WasExperimental(ExperimentalStdlibApi::class) actual fun insert(index: Int, value: CharArray): StringBuilder { AbstractList.checkPositionIndex(index, length) + @OptIn(ExperimentalStdlibApi::class) string = string.substring(0, index) + value.concatToString() + string.substring(index) return this } @@ -251,8 +251,8 @@ public actual class StringBuilder actual constructor(content: String) : Appendab * * @throws IndexOutOfBoundsException if [index] is less than zero or greater than the length of this string builder. */ - @SinceKotlin("1.3") - @ExperimentalStdlibApi + @SinceKotlin("1.4") + @WasExperimental(ExperimentalStdlibApi::class) actual fun insert(index: Int, value: CharSequence?): StringBuilder { AbstractList.checkPositionIndex(index, length) @@ -268,8 +268,8 @@ public actual class StringBuilder actual constructor(content: String) : Appendab * * @throws IndexOutOfBoundsException if [index] is less than zero or greater than the length of this string builder. */ - @SinceKotlin("1.3") - @ExperimentalStdlibApi + @SinceKotlin("1.4") + @WasExperimental(ExperimentalStdlibApi::class) actual fun insert(index: Int, value: Any?): StringBuilder { AbstractList.checkPositionIndex(index, length) @@ -282,8 +282,8 @@ public actual class StringBuilder actual constructor(content: String) : Appendab * * @throws IndexOutOfBoundsException if [index] is less than zero or greater than the length of this string builder. */ - @SinceKotlin("1.3") - @ExperimentalStdlibApi + @SinceKotlin("1.4") + @WasExperimental(ExperimentalStdlibApi::class) actual fun insert(index: Int, value: String): StringBuilder { AbstractList.checkPositionIndex(index, length) @@ -302,8 +302,8 @@ public actual class StringBuilder actual constructor(content: String) : Appendab * * @throws IndexOutOfBoundsException or [IllegalArgumentException] if [newLength] is less than zero. */ - @SinceKotlin("1.3") - @ExperimentalStdlibApi + @SinceKotlin("1.4") + @WasExperimental(ExperimentalStdlibApi::class) actual fun setLength(newLength: Int) { if (newLength < 0) { throw IllegalArgumentException("Negative new length: $newLength.") @@ -323,8 +323,8 @@ public actual class StringBuilder actual constructor(content: String) : Appendab * * @throws IndexOutOfBoundsException if [startIndex] is less than zero or greater than the length of this string builder. */ - @SinceKotlin("1.3") - @ExperimentalStdlibApi + @SinceKotlin("1.4") + @WasExperimental(ExperimentalStdlibApi::class) actual fun substring(startIndex: Int): String { AbstractList.checkPositionIndex(startIndex, length) @@ -336,8 +336,8 @@ public actual class StringBuilder actual constructor(content: String) : Appendab * * @throws IndexOutOfBoundsException or [IllegalArgumentException] when [startIndex] or [endIndex] is out of range of this string builder indices or when `startIndex > endIndex`. */ - @SinceKotlin("1.3") - @ExperimentalStdlibApi + @SinceKotlin("1.4") + @WasExperimental(ExperimentalStdlibApi::class) actual fun substring(startIndex: Int, endIndex: Int): String { AbstractList.checkBoundsIndexes(startIndex, endIndex, length) @@ -353,8 +353,8 @@ public actual class StringBuilder actual constructor(content: String) : Appendab * * In Kotlin/JS implementation of StringBuilder the size of the backing storage is always equal to the length of the string builder. */ - @SinceKotlin("1.3") - @ExperimentalStdlibApi + @SinceKotlin("1.4") + @WasExperimental(ExperimentalStdlibApi::class) actual fun trimToSize() { if (this.asDynamic()._capacity !== undefined) { this.asDynamic()._capacity = length @@ -379,8 +379,8 @@ public actual class StringBuilder actual constructor(content: String) : Appendab * * @throws IndexOutOfBoundsException if [index] is out of bounds of this string builder. */ - @SinceKotlin("1.3") - @ExperimentalStdlibApi + @SinceKotlin("1.4") + @WasExperimental(ExperimentalStdlibApi::class) public operator fun set(index: Int, value: Char) { AbstractList.checkElementIndex(index, length) @@ -396,8 +396,8 @@ public actual class StringBuilder actual constructor(content: String) : Appendab * * @throws IndexOutOfBoundsException or [IllegalArgumentException] if [startIndex] is less than zero, greater than the length of this string builder, or `startIndex > endIndex`. */ - @SinceKotlin("1.3") - @ExperimentalStdlibApi + @SinceKotlin("1.4") + @WasExperimental(ExperimentalStdlibApi::class) public fun setRange(startIndex: Int, endIndex: Int, value: String): StringBuilder { checkReplaceRange(startIndex, endIndex, length) @@ -423,8 +423,8 @@ public actual class StringBuilder actual constructor(content: String) : Appendab * * @throws IndexOutOfBoundsException if [index] is out of bounds of this string builder. */ - @SinceKotlin("1.3") - @ExperimentalStdlibApi + @SinceKotlin("1.4") + @WasExperimental(ExperimentalStdlibApi::class) public fun deleteAt(index: Int): StringBuilder { AbstractList.checkElementIndex(index, length) @@ -440,8 +440,8 @@ public actual class StringBuilder actual constructor(content: String) : Appendab * * @throws IndexOutOfBoundsException or [IllegalArgumentException] when [startIndex] is out of range of this string builder indices or when `startIndex > endIndex`. */ - @SinceKotlin("1.3") - @ExperimentalStdlibApi + @SinceKotlin("1.4") + @WasExperimental(ExperimentalStdlibApi::class) public fun deleteRange(startIndex: Int, endIndex: Int): StringBuilder { checkReplaceRange(startIndex, endIndex, length) @@ -461,8 +461,8 @@ public actual class StringBuilder actual constructor(content: String) : Appendab * @throws IndexOutOfBoundsException when the subrange doesn't fit into the [destination] array starting at the specified [destinationOffset], * or when that index is out of the [destination] array indices range. */ - @SinceKotlin("1.3") - @ExperimentalStdlibApi + @SinceKotlin("1.4") + @WasExperimental(ExperimentalStdlibApi::class) public fun toCharArray(destination: CharArray, destinationOffset: Int = 0, startIndex: Int = 0, endIndex: Int = this.length) { AbstractList.checkBoundsIndexes(startIndex, endIndex, length) AbstractList.checkBoundsIndexes(destinationOffset, destinationOffset + endIndex - startIndex, destination.size) @@ -484,9 +484,10 @@ public actual class StringBuilder actual constructor(content: String) : Appendab * * @throws IndexOutOfBoundsException or [IllegalArgumentException] when [startIndex] or [endIndex] is out of range of the [value] array indices or when `startIndex > endIndex`. */ - @SinceKotlin("1.3") - @ExperimentalStdlibApi + @SinceKotlin("1.4") + @WasExperimental(ExperimentalStdlibApi::class) public fun appendRange(value: CharArray, startIndex: Int, endIndex: Int): StringBuilder { + @OptIn(ExperimentalStdlibApi::class) string += value.concatToString(startIndex, endIndex) return this } @@ -494,16 +495,15 @@ public actual class StringBuilder actual constructor(content: String) : Appendab /** * Appends a subsequence of the specified character sequence [value] to this string builder and returns this instance. * - * @param value the character sequence from which a subsequence is appended. If [value] is `null`, - * then characters are appended as if [value] contained the four characters `"null"`. + * @param value the character sequence from which a subsequence is appended. * @param startIndex the beginning (inclusive) of the subsequence to append. * @param endIndex the end (exclusive) of the subsequence to append. * * @throws IndexOutOfBoundsException or [IllegalArgumentException] when [startIndex] or [endIndex] is out of range of the [value] character sequence indices or when `startIndex > endIndex`. */ - @SinceKotlin("1.3") - @ExperimentalStdlibApi - public fun appendRange(value: CharSequence?, startIndex: Int, endIndex: Int): StringBuilder { + @SinceKotlin("1.4") + @WasExperimental(ExperimentalStdlibApi::class) + public fun appendRange(value: CharSequence, startIndex: Int, endIndex: Int): StringBuilder { val stringCsq = value.toString() AbstractList.checkBoundsIndexes(startIndex, endIndex, stringCsq.length) @@ -524,11 +524,12 @@ public actual class StringBuilder actual constructor(content: String) : Appendab * @throws IndexOutOfBoundsException or [IllegalArgumentException] when [startIndex] or [endIndex] is out of range of the [value] array indices or when `startIndex > endIndex`. * @throws IndexOutOfBoundsException if [index] is less than zero or greater than the length of this string builder. */ - @SinceKotlin("1.3") - @ExperimentalStdlibApi + @SinceKotlin("1.4") + @WasExperimental(ExperimentalStdlibApi::class) public fun insertRange(index: Int, value: CharArray, startIndex: Int, endIndex: Int): StringBuilder { AbstractList.checkPositionIndex(index, this.length) + @OptIn(ExperimentalStdlibApi::class) string = string.substring(0, index) + value.concatToString(startIndex, endIndex) + string.substring(index) return this } @@ -539,17 +540,16 @@ public actual class StringBuilder actual constructor(content: String) : Appendab * The inserted characters go in the same order as in the [value] character sequence, starting at [index]. * * @param index the position in this string builder to insert at. - * @param value the character sequence from which a subsequence is inserted. If [value] is `null`, - * then characters will be inserted as if [value] contained the four characters `"null"`. + * @param value the character sequence from which a subsequence is inserted. * @param startIndex the beginning (inclusive) of the subsequence to insert. * @param endIndex the end (exclusive) of the subsequence to insert. * * @throws IndexOutOfBoundsException or [IllegalArgumentException] when [startIndex] or [endIndex] is out of range of the [value] character sequence indices or when `startIndex > endIndex`. * @throws IndexOutOfBoundsException if [index] is less than zero or greater than the length of this string builder. */ - @SinceKotlin("1.3") - @ExperimentalStdlibApi - public fun insertRange(index: Int, value: CharSequence?, startIndex: Int, endIndex: Int): StringBuilder { + @SinceKotlin("1.4") + @WasExperimental(ExperimentalStdlibApi::class) + public fun insertRange(index: Int, value: CharSequence, startIndex: Int, endIndex: Int): StringBuilder { AbstractList.checkPositionIndex(index, length) val stringCsq = value.toString() @@ -575,8 +575,8 @@ public actual inline fun StringBuilder.clear(): StringBuilder = this.clear() * * @throws IndexOutOfBoundsException if [index] is out of bounds of this string builder. */ -@SinceKotlin("1.3") -@ExperimentalStdlibApi +@SinceKotlin("1.4") +@WasExperimental(ExperimentalStdlibApi::class) @Suppress("EXTENSION_SHADOWED_BY_MEMBER", "NOTHING_TO_INLINE") public actual inline operator fun StringBuilder.set(index: Int, value: Char) = this.set(index, value) @@ -589,8 +589,8 @@ public actual inline operator fun StringBuilder.set(index: Int, value: Char) = t * * @throws IndexOutOfBoundsException or [IllegalArgumentException] if [startIndex] is less than zero, greater than the length of this string builder, or `startIndex > endIndex`. */ -@SinceKotlin("1.3") -@ExperimentalStdlibApi +@SinceKotlin("1.4") +@WasExperimental(ExperimentalStdlibApi::class) @Suppress("EXTENSION_SHADOWED_BY_MEMBER", "NOTHING_TO_INLINE") public actual inline fun StringBuilder.setRange(startIndex: Int, endIndex: Int, value: String): StringBuilder = this.setRange(startIndex, endIndex, value) @@ -604,8 +604,8 @@ public actual inline fun StringBuilder.setRange(startIndex: Int, endIndex: Int, * * @throws IndexOutOfBoundsException if [index] is out of bounds of this string builder. */ -@SinceKotlin("1.3") -@ExperimentalStdlibApi +@SinceKotlin("1.4") +@WasExperimental(ExperimentalStdlibApi::class) @Suppress("EXTENSION_SHADOWED_BY_MEMBER", "NOTHING_TO_INLINE") public actual inline fun StringBuilder.deleteAt(index: Int): StringBuilder = this.deleteAt(index) @@ -617,8 +617,8 @@ public actual inline fun StringBuilder.deleteAt(index: Int): StringBuilder = thi * * @throws IndexOutOfBoundsException or [IllegalArgumentException] when [startIndex] is out of range of this string builder indices or when `startIndex > endIndex`. */ -@SinceKotlin("1.3") -@ExperimentalStdlibApi +@SinceKotlin("1.4") +@WasExperimental(ExperimentalStdlibApi::class) @Suppress("EXTENSION_SHADOWED_BY_MEMBER", "NOTHING_TO_INLINE") public actual inline fun StringBuilder.deleteRange(startIndex: Int, endIndex: Int): StringBuilder = this.deleteRange(startIndex, endIndex) @@ -634,8 +634,8 @@ public actual inline fun StringBuilder.deleteRange(startIndex: Int, endIndex: In * @throws IndexOutOfBoundsException when the subrange doesn't fit into the [destination] array starting at the specified [destinationOffset], * or when that index is out of the [destination] array indices range. */ -@SinceKotlin("1.3") -@ExperimentalStdlibApi +@SinceKotlin("1.4") +@WasExperimental(ExperimentalStdlibApi::class) @Suppress("EXTENSION_SHADOWED_BY_MEMBER", "NOTHING_TO_INLINE", "ACTUAL_FUNCTION_WITH_DEFAULT_ARGUMENTS") public actual inline fun StringBuilder.toCharArray(destination: CharArray, destinationOffset: Int = 0, startIndex: Int = 0, endIndex: Int = this.length) = this.toCharArray(destination, destinationOffset, startIndex, endIndex) @@ -651,8 +651,8 @@ public actual inline fun StringBuilder.toCharArray(destination: CharArray, desti * * @throws IndexOutOfBoundsException or [IllegalArgumentException] when [startIndex] or [endIndex] is out of range of the [value] array indices or when `startIndex > endIndex`. */ -@SinceKotlin("1.3") -@ExperimentalStdlibApi +@SinceKotlin("1.4") +@WasExperimental(ExperimentalStdlibApi::class) @Suppress("EXTENSION_SHADOWED_BY_MEMBER", "NOTHING_TO_INLINE") public actual inline fun StringBuilder.appendRange(value: CharArray, startIndex: Int, endIndex: Int): StringBuilder = this.appendRange(value, startIndex, endIndex) @@ -660,17 +660,16 @@ public actual inline fun StringBuilder.appendRange(value: CharArray, startIndex: /** * Appends a subsequence of the specified character sequence [value] to this string builder and returns this instance. * - * @param value the character sequence from which a subsequence is appended. If [value] is `null`, - * then characters are appended as if [value] contained the four characters `"null"`. + * @param value the character sequence from which a subsequence is appended. * @param startIndex the beginning (inclusive) of the subsequence to append. * @param endIndex the end (exclusive) of the subsequence to append. * * @throws IndexOutOfBoundsException or [IllegalArgumentException] when [startIndex] or [endIndex] is out of range of the [value] character sequence indices or when `startIndex > endIndex`. */ -@SinceKotlin("1.3") -@ExperimentalStdlibApi +@SinceKotlin("1.4") +@WasExperimental(ExperimentalStdlibApi::class) @Suppress("EXTENSION_SHADOWED_BY_MEMBER", "NOTHING_TO_INLINE") -public actual inline fun StringBuilder.appendRange(value: CharSequence?, startIndex: Int, endIndex: Int): StringBuilder = +public actual inline fun StringBuilder.appendRange(value: CharSequence, startIndex: Int, endIndex: Int): StringBuilder = this.appendRange(value, startIndex, endIndex) /** @@ -686,8 +685,8 @@ public actual inline fun StringBuilder.appendRange(value: CharSequence?, startIn * @throws IndexOutOfBoundsException or [IllegalArgumentException] when [startIndex] or [endIndex] is out of range of the [value] array indices or when `startIndex > endIndex`. * @throws IndexOutOfBoundsException if [index] is less than zero or greater than the length of this string builder. */ -@SinceKotlin("1.3") -@ExperimentalStdlibApi +@SinceKotlin("1.4") +@WasExperimental(ExperimentalStdlibApi::class) @Suppress("EXTENSION_SHADOWED_BY_MEMBER", "NOTHING_TO_INLINE") public actual inline fun StringBuilder.insertRange(index: Int, value: CharArray, startIndex: Int, endIndex: Int): StringBuilder = this.insertRange(index, value, startIndex, endIndex) @@ -698,16 +697,15 @@ public actual inline fun StringBuilder.insertRange(index: Int, value: CharArray, * The inserted characters go in the same order as in the [value] character sequence, starting at [index]. * * @param index the position in this string builder to insert at. - * @param value the character sequence from which a subsequence is inserted. If [value] is `null`, - * then characters will be inserted as if [value] contained the four characters `"null"`. + * @param value the character sequence from which a subsequence is inserted. * @param startIndex the beginning (inclusive) of the subsequence to insert. * @param endIndex the end (exclusive) of the subsequence to insert. * * @throws IndexOutOfBoundsException or [IllegalArgumentException] when [startIndex] or [endIndex] is out of range of the [value] character sequence indices or when `startIndex > endIndex`. * @throws IndexOutOfBoundsException if [index] is less than zero or greater than the length of this string builder. */ -@SinceKotlin("1.3") -@ExperimentalStdlibApi +@SinceKotlin("1.4") +@WasExperimental(ExperimentalStdlibApi::class) @Suppress("EXTENSION_SHADOWED_BY_MEMBER", "NOTHING_TO_INLINE") -public actual inline fun StringBuilder.insertRange(index: Int, value: CharSequence?, startIndex: Int, endIndex: Int): StringBuilder = +public actual inline fun StringBuilder.insertRange(index: Int, value: CharSequence, startIndex: Int, endIndex: Int): StringBuilder = this.insertRange(index, value, startIndex, endIndex) diff --git a/libraries/stdlib/jvm/src/kotlin/text/StringBuilderJVM.kt b/libraries/stdlib/jvm/src/kotlin/text/StringBuilderJVM.kt index bc6602f4d0f..25668bc7be6 100644 --- a/libraries/stdlib/jvm/src/kotlin/text/StringBuilderJVM.kt +++ b/libraries/stdlib/jvm/src/kotlin/text/StringBuilderJVM.kt @@ -33,8 +33,8 @@ public actual inline operator fun StringBuilder.set(index: Int, value: Char): Un * * @throws IndexOutOfBoundsException or [IllegalArgumentException] if [startIndex] is less than zero, greater than the length of this string builder, or `startIndex > endIndex`. */ -@SinceKotlin("1.3") -@ExperimentalStdlibApi +@SinceKotlin("1.4") +@WasExperimental(ExperimentalStdlibApi::class) @kotlin.internal.InlineOnly public actual inline fun StringBuilder.setRange(startIndex: Int, endIndex: Int, value: String): StringBuilder = this.replace(startIndex, endIndex, value) @@ -48,8 +48,8 @@ public actual inline fun StringBuilder.setRange(startIndex: Int, endIndex: Int, * * @throws IndexOutOfBoundsException if [index] is out of bounds of this string builder. */ -@SinceKotlin("1.3") -@ExperimentalStdlibApi +@SinceKotlin("1.4") +@WasExperimental(ExperimentalStdlibApi::class) @kotlin.internal.InlineOnly public actual inline fun StringBuilder.deleteAt(index: Int): StringBuilder = this.deleteCharAt(index) @@ -61,8 +61,8 @@ public actual inline fun StringBuilder.deleteAt(index: Int): StringBuilder = thi * * @throws IndexOutOfBoundsException or [IllegalArgumentException] when [startIndex] is out of range of this string builder indices or when `startIndex > endIndex`. */ -@SinceKotlin("1.3") -@ExperimentalStdlibApi +@SinceKotlin("1.4") +@WasExperimental(ExperimentalStdlibApi::class) @kotlin.internal.InlineOnly public actual inline fun StringBuilder.deleteRange(startIndex: Int, endIndex: Int): StringBuilder = this.delete(startIndex, endIndex) @@ -78,8 +78,8 @@ public actual inline fun StringBuilder.deleteRange(startIndex: Int, endIndex: In * @throws IndexOutOfBoundsException when the subrange doesn't fit into the [destination] array starting at the specified [destinationOffset], * or when that index is out of the [destination] array indices range. */ -@SinceKotlin("1.3") -@ExperimentalStdlibApi +@SinceKotlin("1.4") +@WasExperimental(ExperimentalStdlibApi::class) @kotlin.internal.InlineOnly @Suppress("ACTUAL_FUNCTION_WITH_DEFAULT_ARGUMENTS") public actual inline fun StringBuilder.toCharArray(destination: CharArray, destinationOffset: Int = 0, startIndex: Int = 0, endIndex: Int = this.length) = @@ -96,8 +96,8 @@ public actual inline fun StringBuilder.toCharArray(destination: CharArray, desti * * @throws IndexOutOfBoundsException or [IllegalArgumentException] when [startIndex] or [endIndex] is out of range of the [value] array indices or when `startIndex > endIndex`. */ -@SinceKotlin("1.3") -@ExperimentalStdlibApi +@SinceKotlin("1.4") +@WasExperimental(ExperimentalStdlibApi::class) @kotlin.internal.InlineOnly public actual inline fun StringBuilder.appendRange(value: CharArray, startIndex: Int, endIndex: Int): StringBuilder = this.append(value, startIndex, endIndex - startIndex) @@ -105,17 +105,16 @@ public actual inline fun StringBuilder.appendRange(value: CharArray, startIndex: /** * Appends a subsequence of the specified character sequence [value] to this string builder and returns this instance. * - * @param value the character sequence from which a subsequence is appended. If [value] is `null`, - * then characters are appended as if [value] contained the four characters `"null"`. + * @param value the character sequence from which a subsequence is appended. * @param startIndex the beginning (inclusive) of the subsequence to append. * @param endIndex the end (exclusive) of the subsequence to append. * * @throws IndexOutOfBoundsException or [IllegalArgumentException] when [startIndex] or [endIndex] is out of range of the [value] character sequence indices or when `startIndex > endIndex`. */ -@SinceKotlin("1.3") -@ExperimentalStdlibApi +@SinceKotlin("1.4") +@WasExperimental(ExperimentalStdlibApi::class) @kotlin.internal.InlineOnly -public actual inline fun StringBuilder.appendRange(value: CharSequence?, startIndex: Int, endIndex: Int): StringBuilder = +public actual inline fun StringBuilder.appendRange(value: CharSequence, startIndex: Int, endIndex: Int): StringBuilder = this.append(value, startIndex, endIndex) /** @@ -131,8 +130,8 @@ public actual inline fun StringBuilder.appendRange(value: CharSequence?, startIn * @throws IndexOutOfBoundsException or [IllegalArgumentException] when [startIndex] or [endIndex] is out of range of the [value] array indices or when `startIndex > endIndex`. * @throws IndexOutOfBoundsException if [index] is less than zero or greater than the length of this string builder. */ -@SinceKotlin("1.3") -@ExperimentalStdlibApi +@SinceKotlin("1.4") +@WasExperimental(ExperimentalStdlibApi::class) @kotlin.internal.InlineOnly public actual inline fun StringBuilder.insertRange(index: Int, value: CharArray, startIndex: Int, endIndex: Int): StringBuilder = this.insert(index, value, startIndex, endIndex - startIndex) @@ -143,18 +142,17 @@ public actual inline fun StringBuilder.insertRange(index: Int, value: CharArray, * The inserted characters go in the same order as in the [value] character sequence, starting at [index]. * * @param index the position in this string builder to insert at. - * @param value the character sequence from which a subsequence is inserted. If [value] is `null`, - * then characters will be inserted as if [value] contained the four characters `"null"`. + * @param value the character sequence from which a subsequence is inserted. * @param startIndex the beginning (inclusive) of the subsequence to insert. * @param endIndex the end (exclusive) of the subsequence to insert. * * @throws IndexOutOfBoundsException or [IllegalArgumentException] when [startIndex] or [endIndex] is out of range of the [value] character sequence indices or when `startIndex > endIndex`. * @throws IndexOutOfBoundsException if [index] is less than zero or greater than the length of this string builder. */ -@SinceKotlin("1.3") -@ExperimentalStdlibApi +@SinceKotlin("1.4") +@WasExperimental(ExperimentalStdlibApi::class) @kotlin.internal.InlineOnly -public actual inline fun StringBuilder.insertRange(index: Int, value: CharSequence?, startIndex: Int, endIndex: Int): StringBuilder = +public actual inline fun StringBuilder.insertRange(index: Int, value: CharSequence, startIndex: Int, endIndex: Int): StringBuilder = this.insert(index, value, startIndex, endIndex) diff --git a/libraries/stdlib/src/kotlin/text/Appendable.kt b/libraries/stdlib/src/kotlin/text/Appendable.kt index cabb8699a78..8a396d2bb65 100644 --- a/libraries/stdlib/src/kotlin/text/Appendable.kt +++ b/libraries/stdlib/src/kotlin/text/Appendable.kt @@ -42,16 +42,15 @@ expect interface Appendable { /** * Appends a subsequence of the specified character sequence [value] to this Appendable and returns this instance. * - * @param value the character sequence from which a subsequence is appended. If [value] is `null`, - * then characters are appended as if [value] contained the four characters `"null"`. + * @param value the character sequence from which a subsequence is appended. * @param startIndex the beginning (inclusive) of the subsequence to append. * @param endIndex the end (exclusive) of the subsequence to append. * * @throws IndexOutOfBoundsException or [IllegalArgumentException] when [startIndex] or [endIndex] is out of range of the [value] character sequence indices or when `startIndex > endIndex`. */ -@SinceKotlin("1.3") -@ExperimentalStdlibApi -public fun T.appendRange(value: CharSequence?, startIndex: Int, endIndex: Int): T { +@SinceKotlin("1.4") +@WasExperimental(ExperimentalStdlibApi::class) +public fun T.appendRange(value: CharSequence, startIndex: Int, endIndex: Int): T { @Suppress("UNCHECKED_CAST") return append(value, startIndex, endIndex) as T } diff --git a/libraries/stdlib/src/kotlin/text/StringBuilder.kt b/libraries/stdlib/src/kotlin/text/StringBuilder.kt index 9c16f87f87a..f9388f9dc16 100644 --- a/libraries/stdlib/src/kotlin/text/StringBuilder.kt +++ b/libraries/stdlib/src/kotlin/text/StringBuilder.kt @@ -64,7 +64,6 @@ expect class StringBuilder : Appendable, CharSequence { * and then that string was appended to this string builder. */ @SinceKotlin("1.3") -// @ExperimentalStdlibApi fun append(value: Boolean): StringBuilder /** @@ -72,15 +71,14 @@ expect class StringBuilder : Appendable, CharSequence { * * Characters are appended in order, starting at the index 0. */ - @SinceKotlin("1.3") - @ExperimentalStdlibApi + @SinceKotlin("1.4") + @WasExperimental(ExperimentalStdlibApi::class) fun append(value: CharArray): StringBuilder /** * Appends the specified string [value] to this string builder and returns this instance. */ @SinceKotlin("1.3") -// @ExperimentalStdlibApi fun append(value: String): StringBuilder /** @@ -88,8 +86,8 @@ expect class StringBuilder : Appendable, CharSequence { * * The capacity is the maximum length this string builder can have before an allocation occurs. */ - @SinceKotlin("1.3") - @ExperimentalStdlibApi + @SinceKotlin("1.4") + @WasExperimental(ExperimentalStdlibApi::class) fun capacity(): Int /** @@ -98,8 +96,8 @@ expect class StringBuilder : Appendable, CharSequence { * If the current capacity is less than the [minimumCapacity], a new backing storage is allocated with greater capacity. * Otherwise, this method takes no action and simply returns. */ - @SinceKotlin("1.3") - @ExperimentalStdlibApi + @SinceKotlin("1.4") + @WasExperimental(ExperimentalStdlibApi::class) fun ensureCapacity(minimumCapacity: Int) /** @@ -107,8 +105,8 @@ expect class StringBuilder : Appendable, CharSequence { * * Returns `-1` if the specified [string] does not occur in this string builder. */ - @SinceKotlin("1.3") - @ExperimentalStdlibApi + @SinceKotlin("1.4") + @WasExperimental(ExperimentalStdlibApi::class) fun indexOf(string: String): Int /** @@ -117,8 +115,8 @@ expect class StringBuilder : Appendable, CharSequence { * * Returns `-1` if the specified [string] does not occur in this string builder starting at the specified [startIndex]. */ - @SinceKotlin("1.3") - @ExperimentalStdlibApi + @SinceKotlin("1.4") + @WasExperimental(ExperimentalStdlibApi::class) fun indexOf(string: String, startIndex: Int): Int /** @@ -127,8 +125,8 @@ expect class StringBuilder : Appendable, CharSequence { * * Returns `-1` if the specified [string] does not occur in this string builder. */ - @SinceKotlin("1.3") - @ExperimentalStdlibApi + @SinceKotlin("1.4") + @WasExperimental(ExperimentalStdlibApi::class) fun lastIndexOf(string: String): Int /** @@ -137,8 +135,8 @@ expect class StringBuilder : Appendable, CharSequence { * * Returns `-1` if the specified [string] does not occur in this string builder starting at the specified [startIndex]. */ - @SinceKotlin("1.3") - @ExperimentalStdlibApi + @SinceKotlin("1.4") + @WasExperimental(ExperimentalStdlibApi::class) fun lastIndexOf(string: String, startIndex: Int): Int /** @@ -149,8 +147,8 @@ expect class StringBuilder : Appendable, CharSequence { * * @throws IndexOutOfBoundsException if [index] is less than zero or greater than the length of this string builder. */ - @SinceKotlin("1.3") - @ExperimentalStdlibApi + @SinceKotlin("1.4") + @WasExperimental(ExperimentalStdlibApi::class) fun insert(index: Int, value: Boolean): StringBuilder /** @@ -158,8 +156,8 @@ expect class StringBuilder : Appendable, CharSequence { * * @throws IndexOutOfBoundsException if [index] is less than zero or greater than the length of this string builder. */ - @SinceKotlin("1.3") - @ExperimentalStdlibApi + @SinceKotlin("1.4") + @WasExperimental(ExperimentalStdlibApi::class) fun insert(index: Int, value: Char): StringBuilder /** @@ -169,8 +167,8 @@ expect class StringBuilder : Appendable, CharSequence { * * @throws IndexOutOfBoundsException if [index] is less than zero or greater than the length of this string builder. */ - @SinceKotlin("1.3") - @ExperimentalStdlibApi + @SinceKotlin("1.4") + @WasExperimental(ExperimentalStdlibApi::class) fun insert(index: Int, value: CharArray): StringBuilder /** @@ -183,8 +181,8 @@ expect class StringBuilder : Appendable, CharSequence { * * @throws IndexOutOfBoundsException if [index] is less than zero or greater than the length of this string builder. */ - @SinceKotlin("1.3") - @ExperimentalStdlibApi + @SinceKotlin("1.4") + @WasExperimental(ExperimentalStdlibApi::class) fun insert(index: Int, value: CharSequence?): StringBuilder /** @@ -195,8 +193,8 @@ expect class StringBuilder : Appendable, CharSequence { * * @throws IndexOutOfBoundsException if [index] is less than zero or greater than the length of this string builder. */ - @SinceKotlin("1.3") - @ExperimentalStdlibApi + @SinceKotlin("1.4") + @WasExperimental(ExperimentalStdlibApi::class) fun insert(index: Int, value: Any?): StringBuilder /** @@ -204,8 +202,8 @@ expect class StringBuilder : Appendable, CharSequence { * * @throws IndexOutOfBoundsException if [index] is less than zero or greater than the length of this string builder. */ - @SinceKotlin("1.3") - @ExperimentalStdlibApi + @SinceKotlin("1.4") + @WasExperimental(ExperimentalStdlibApi::class) fun insert(index: Int, value: String): StringBuilder /** @@ -219,8 +217,8 @@ expect class StringBuilder : Appendable, CharSequence { * * @throws IndexOutOfBoundsException or [IllegalArgumentException] if [newLength] is less than zero. */ - @SinceKotlin("1.3") - @ExperimentalStdlibApi + @SinceKotlin("1.4") + @WasExperimental(ExperimentalStdlibApi::class) fun setLength(newLength: Int) /** @@ -228,8 +226,8 @@ expect class StringBuilder : Appendable, CharSequence { * * @throws IndexOutOfBoundsException if [startIndex] is less than zero or greater than the length of this string builder. */ - @SinceKotlin("1.3") - @ExperimentalStdlibApi + @SinceKotlin("1.4") + @WasExperimental(ExperimentalStdlibApi::class) fun substring(startIndex: Int): String /** @@ -237,8 +235,8 @@ expect class StringBuilder : Appendable, CharSequence { * * @throws IndexOutOfBoundsException or [IllegalArgumentException] when [startIndex] or [endIndex] is out of range of this string builder indices or when `startIndex > endIndex`. */ - @SinceKotlin("1.3") - @ExperimentalStdlibApi + @SinceKotlin("1.4") + @WasExperimental(ExperimentalStdlibApi::class) fun substring(startIndex: Int, endIndex: Int): String /** @@ -248,8 +246,8 @@ expect class StringBuilder : Appendable, CharSequence { * then it may be resized to become more space efficient. * Calling this method may, but is not required to, affect the value of the [capacity] property. */ - @SinceKotlin("1.3") - @ExperimentalStdlibApi + @SinceKotlin("1.4") + @WasExperimental(ExperimentalStdlibApi::class) fun trimToSize() } @@ -267,8 +265,8 @@ public expect fun StringBuilder.clear(): StringBuilder * * @throws IndexOutOfBoundsException if [index] is out of bounds of this string builder. */ -@SinceKotlin("1.3") -@ExperimentalStdlibApi +@SinceKotlin("1.4") +@WasExperimental(ExperimentalStdlibApi::class) public expect operator fun StringBuilder.set(index: Int, value: Char) /** @@ -280,8 +278,8 @@ public expect operator fun StringBuilder.set(index: Int, value: Char) * * @throws IndexOutOfBoundsException or [IllegalArgumentException] if [startIndex] is less than zero, greater than the length of this string builder, or `startIndex > endIndex`. */ -@SinceKotlin("1.3") -@ExperimentalStdlibApi +@SinceKotlin("1.4") +@WasExperimental(ExperimentalStdlibApi::class) public expect fun StringBuilder.setRange(startIndex: Int, endIndex: Int, value: String): StringBuilder /** @@ -293,8 +291,8 @@ public expect fun StringBuilder.setRange(startIndex: Int, endIndex: Int, value: * * @throws IndexOutOfBoundsException if [index] is out of bounds of this string builder. */ -@SinceKotlin("1.3") -@ExperimentalStdlibApi +@SinceKotlin("1.4") +@WasExperimental(ExperimentalStdlibApi::class) public expect fun StringBuilder.deleteAt(index: Int): StringBuilder /** @@ -305,8 +303,8 @@ public expect fun StringBuilder.deleteAt(index: Int): StringBuilder * * @throws IndexOutOfBoundsException or [IllegalArgumentException] when [startIndex] is out of range of this string builder indices or when `startIndex > endIndex`. */ -@SinceKotlin("1.3") -@ExperimentalStdlibApi +@SinceKotlin("1.4") +@WasExperimental(ExperimentalStdlibApi::class) public expect fun StringBuilder.deleteRange(startIndex: Int, endIndex: Int): StringBuilder /** @@ -321,8 +319,8 @@ public expect fun StringBuilder.deleteRange(startIndex: Int, endIndex: Int): Str * @throws IndexOutOfBoundsException when the subrange doesn't fit into the [destination] array starting at the specified [destinationOffset], * or when that index is out of the [destination] array indices range. */ -@SinceKotlin("1.3") -@ExperimentalStdlibApi +@SinceKotlin("1.4") +@WasExperimental(ExperimentalStdlibApi::class) public expect fun StringBuilder.toCharArray(destination: CharArray, destinationOffset: Int = 0, startIndex: Int = 0, endIndex: Int = this.length) /** @@ -336,23 +334,22 @@ public expect fun StringBuilder.toCharArray(destination: CharArray, destinationO * * @throws IndexOutOfBoundsException or [IllegalArgumentException] when [startIndex] or [endIndex] is out of range of the [value] array indices or when `startIndex > endIndex`. */ -@SinceKotlin("1.3") -@ExperimentalStdlibApi +@SinceKotlin("1.4") +@WasExperimental(ExperimentalStdlibApi::class) public expect fun StringBuilder.appendRange(value: CharArray, startIndex: Int, endIndex: Int): StringBuilder /** * Appends a subsequence of the specified character sequence [value] to this string builder and returns this instance. * - * @param value the character sequence from which a subsequence is appended. If [value] is `null`, - * then characters are appended as if [value] contained the four characters `"null"`. + * @param value the character sequence from which a subsequence is appended. * @param startIndex the beginning (inclusive) of the subsequence to append. * @param endIndex the end (exclusive) of the subsequence to append. * * @throws IndexOutOfBoundsException or [IllegalArgumentException] when [startIndex] or [endIndex] is out of range of the [value] character sequence indices or when `startIndex > endIndex`. */ -@SinceKotlin("1.3") -@ExperimentalStdlibApi -public expect fun StringBuilder.appendRange(value: CharSequence?, startIndex: Int, endIndex: Int): StringBuilder +@SinceKotlin("1.4") +@WasExperimental(ExperimentalStdlibApi::class) +public expect fun StringBuilder.appendRange(value: CharSequence, startIndex: Int, endIndex: Int): StringBuilder /** * Inserts characters in a subarray of the specified character array [value] into this string builder at the specified [index] and returns this instance. @@ -367,8 +364,8 @@ public expect fun StringBuilder.appendRange(value: CharSequence?, startIndex: In * @throws IndexOutOfBoundsException or [IllegalArgumentException] when [startIndex] or [endIndex] is out of range of the [value] array indices or when `startIndex > endIndex`. * @throws IndexOutOfBoundsException if [index] is less than zero or greater than the length of this string builder. */ -@SinceKotlin("1.3") -@ExperimentalStdlibApi +@SinceKotlin("1.4") +@WasExperimental(ExperimentalStdlibApi::class) public expect fun StringBuilder.insertRange(index: Int, value: CharArray, startIndex: Int, endIndex: Int): StringBuilder /** @@ -377,17 +374,16 @@ public expect fun StringBuilder.insertRange(index: Int, value: CharArray, startI * The inserted characters go in the same order as in the [value] character sequence, starting at [index]. * * @param index the position in this string builder to insert at. - * @param value the character sequence from which a subsequence is inserted. If [value] is `null`, - * then characters will be inserted as if [value] contained the four characters `"null"`. + * @param value the character sequence from which a subsequence is inserted. * @param startIndex the beginning (inclusive) of the subsequence to insert. * @param endIndex the end (exclusive) of the subsequence to insert. * * @throws IndexOutOfBoundsException or [IllegalArgumentException] when [startIndex] or [endIndex] is out of range of the [value] character sequence indices or when `startIndex > endIndex`. * @throws IndexOutOfBoundsException if [index] is less than zero or greater than the length of this string builder. */ -@SinceKotlin("1.3") -@ExperimentalStdlibApi -public expect fun StringBuilder.insertRange(index: Int, value: CharSequence?, startIndex: Int, endIndex: Int): StringBuilder +@SinceKotlin("1.4") +@WasExperimental(ExperimentalStdlibApi::class) +public expect fun StringBuilder.insertRange(index: Int, value: CharSequence, startIndex: Int, endIndex: Int): StringBuilder @Suppress("EXTENSION_SHADOWED_BY_MEMBER") @Deprecated("Use append(value: Any?) instead", ReplaceWith("append(value = obj)"), DeprecationLevel.WARNING) @@ -450,7 +446,6 @@ public inline fun StringBuilder.appendLine(value: String?): StringBuilder = appe public inline fun StringBuilder.appendLine(value: Any?): StringBuilder = append(value).appendLine() /** Appends [value] to this [StringBuilder], followed by a line feed character (`\n`). */ -@OptIn(ExperimentalStdlibApi::class) @SinceKotlin("1.4") @kotlin.internal.InlineOnly public inline fun StringBuilder.appendLine(value: CharArray): StringBuilder = append(value).appendLine() diff --git a/libraries/stdlib/test/text/StringBuilderTest.kt b/libraries/stdlib/test/text/StringBuilderTest.kt index 0341c7ac791..f237f61b1bd 100644 --- a/libraries/stdlib/test/text/StringBuilderTest.kt +++ b/libraries/stdlib/test/text/StringBuilderTest.kt @@ -351,14 +351,14 @@ class StringBuilderTest { assertEquals("MMMmy insertT CharSequence test", sb.toString()) sb.insertRange(31, "_*#", 0, 1) assertEquals("MMMmy insertT CharSequence test_", sb.toString()) - sb.insertRange(0, null as CharSequence?, 0, 2) + sb.insertRange(0, "null" as CharSequence, 0, 2) assertEquals("nuMMMmy insertT CharSequence test_", sb.toString()) assertFailsWith { sb.insert(-1, "_" as CharSequence) } assertFailsWith { sb.insert(sb.length + 1, StringBuilder("_")) } - assertFails { sb.insertRange(0, null as CharSequence?, -1, 0) } - assertFails { sb.insertRange(0, null as CharSequence?, 0, 5) } - assertFails { sb.insertRange(0, null as CharSequence?, 2, 1) } + assertFails { sb.insertRange(0, "null" as CharSequence, -1, 0) } + assertFails { sb.insertRange(0, "null" as CharSequence, 0, 5) } + assertFails { sb.insertRange(0, "null" as CharSequence, 2, 1) } } }