From 09ad5ca602d38b06fb8b21f4c00132e405f7b521 Mon Sep 17 00:00:00 2001 From: Abduqodiri Qurbonzoda Date: Fri, 5 Mar 2021 09:57:54 +0300 Subject: [PATCH] Strict version of String.toBoolean() #KT-42071 --- libraries/stdlib/api/js-v1/kotlin.text.kt | 6 ++++ libraries/stdlib/api/js/kotlin.text.kt | 6 ++++ libraries/stdlib/common/src/kotlin/TextH.kt | 2 ++ .../js/src/kotlin/text/numberConversions.kt | 2 ++ .../kotlin/text/StringNumberConversionsJVM.kt | 2 ++ .../samples/test/samples/text/strings.kt | 26 +++++++++++++++ libraries/stdlib/src/kotlin/text/Strings.kt | 32 +++++++++++++++++++ libraries/stdlib/wasm/src/kotlin/Text.kt | 2 ++ .../kotlin-stdlib-runtime-merged.txt | 2 ++ 9 files changed, 80 insertions(+) diff --git a/libraries/stdlib/api/js-v1/kotlin.text.kt b/libraries/stdlib/api/js-v1/kotlin.text.kt index 3c730aa28b3..0ad9e0793e6 100644 --- a/libraries/stdlib/api/js-v1/kotlin.text.kt +++ b/libraries/stdlib/api/js-v1/kotlin.text.kt @@ -943,6 +943,12 @@ public inline fun kotlin.String.toBoolean(): kotlin.Boolean @kotlin.SinceKotlin(version = "1.4") public fun kotlin.String?.toBoolean(): kotlin.Boolean +@kotlin.SinceKotlin(version = "1.5") +public fun kotlin.String.toBooleanStrict(): kotlin.Boolean + +@kotlin.SinceKotlin(version = "1.5") +public fun kotlin.String.toBooleanStrictOrNull(): kotlin.Boolean? + public fun kotlin.String.toByte(): kotlin.Byte public fun kotlin.String.toByte(radix: kotlin.Int): kotlin.Byte diff --git a/libraries/stdlib/api/js/kotlin.text.kt b/libraries/stdlib/api/js/kotlin.text.kt index 3c730aa28b3..0ad9e0793e6 100644 --- a/libraries/stdlib/api/js/kotlin.text.kt +++ b/libraries/stdlib/api/js/kotlin.text.kt @@ -943,6 +943,12 @@ public inline fun kotlin.String.toBoolean(): kotlin.Boolean @kotlin.SinceKotlin(version = "1.4") public fun kotlin.String?.toBoolean(): kotlin.Boolean +@kotlin.SinceKotlin(version = "1.5") +public fun kotlin.String.toBooleanStrict(): kotlin.Boolean + +@kotlin.SinceKotlin(version = "1.5") +public fun kotlin.String.toBooleanStrictOrNull(): kotlin.Boolean? + public fun kotlin.String.toByte(): kotlin.Byte public fun kotlin.String.toByte(radix: kotlin.Int): kotlin.Byte diff --git a/libraries/stdlib/common/src/kotlin/TextH.kt b/libraries/stdlib/common/src/kotlin/TextH.kt index 14f95af7b87..2f2f8e08212 100644 --- a/libraries/stdlib/common/src/kotlin/TextH.kt +++ b/libraries/stdlib/common/src/kotlin/TextH.kt @@ -279,6 +279,8 @@ public expect fun String.toBoolean(): Boolean /** * Returns `true` if this string is not `null` and its content is equal to the word "true", ignoring case, and `false` otherwise. + * + * There are also strict versions of the function available on non-nullable String, [toBooleanStrict] and [toBooleanStrictOrNull]. */ @SinceKotlin("1.4") public expect fun String?.toBoolean(): Boolean diff --git a/libraries/stdlib/js/src/kotlin/text/numberConversions.kt b/libraries/stdlib/js/src/kotlin/text/numberConversions.kt index 9596dfeaa20..bacc3a6169c 100644 --- a/libraries/stdlib/js/src/kotlin/text/numberConversions.kt +++ b/libraries/stdlib/js/src/kotlin/text/numberConversions.kt @@ -16,6 +16,8 @@ public actual inline fun String.toBoolean(): Boolean = this.toBoolean() /** * Returns `true` if this string is not `null` and its content is equal to the word "true", ignoring case, and `false` otherwise. + * + * There are also strict versions of the function available on non-nullable String, [toBooleanStrict] and [toBooleanStrictOrNull]. */ @OptIn(ExperimentalStdlibApi::class) @SinceKotlin("1.4") diff --git a/libraries/stdlib/jvm/src/kotlin/text/StringNumberConversionsJVM.kt b/libraries/stdlib/jvm/src/kotlin/text/StringNumberConversionsJVM.kt index 008a9a9cbd9..d334aa63008 100644 --- a/libraries/stdlib/jvm/src/kotlin/text/StringNumberConversionsJVM.kt +++ b/libraries/stdlib/jvm/src/kotlin/text/StringNumberConversionsJVM.kt @@ -55,6 +55,8 @@ public actual inline fun String.toBoolean(): Boolean = this.toBoolean() /** * Returns `true` if this string is not `null` and its content is equal to the word "true", ignoring case, and `false` otherwise. + * + * There are also strict versions of the function available on non-nullable String, [toBooleanStrict] and [toBooleanStrictOrNull]. */ @JvmName("toBooleanNullable") @SinceKotlin("1.4") diff --git a/libraries/stdlib/samples/test/samples/text/strings.kt b/libraries/stdlib/samples/test/samples/text/strings.kt index f4082610e2b..f89f0d9d015 100644 --- a/libraries/stdlib/samples/test/samples/text/strings.kt +++ b/libraries/stdlib/samples/test/samples/text/strings.kt @@ -467,4 +467,30 @@ class Strings { assertFalse("Kotlin".contentEquals(stringBuilder)) assertTrue("Kotlin".contentEquals(stringBuilder, ignoreCase = true)) } + + @Sample + fun toBooleanStrict() { + assertPrints("true".toBooleanStrict(), "true") + assertFails { "True".toBooleanStrict() } + assertFails { "TRUE".toBooleanStrict() } + + assertPrints("false".toBooleanStrict(), "false") + assertFails { "False".toBooleanStrict() } + assertFails { "FALSE".toBooleanStrict() } + + assertFails { "abc".toBooleanStrict() } + } + + @Sample + fun toBooleanStrictOrNull() { + assertPrints("true".toBooleanStrictOrNull(), "true") + assertPrints("True".toBooleanStrictOrNull(), "null") + assertPrints("TRUE".toBooleanStrictOrNull(), "null") + + assertPrints("false".toBooleanStrictOrNull(), "false") + assertPrints("False".toBooleanStrictOrNull(), "null") + assertPrints("FALSE".toBooleanStrictOrNull(), "null") + + assertPrints("abc".toBooleanStrictOrNull(), "null") + } } diff --git a/libraries/stdlib/src/kotlin/text/Strings.kt b/libraries/stdlib/src/kotlin/text/Strings.kt index 9bb4f58871a..940532c4d96 100644 --- a/libraries/stdlib/src/kotlin/text/Strings.kt +++ b/libraries/stdlib/src/kotlin/text/Strings.kt @@ -1430,4 +1430,36 @@ internal fun CharSequence?.contentEqualsImpl(other: CharSequence?): Boolean { } return true +} + +/** + * Returns `true` if the content of this string is equal to the word "true", `false` if it is equal to "false", + * and throws an exception otherwise. + * + * There is also a lenient version of the function available on nullable String, [String?.toBoolean]. + * Note that this function is case-sensitive. + * + * @sample samples.text.Strings.toBooleanStrict + */ +@SinceKotlin("1.5") +public fun String.toBooleanStrict(): Boolean = when (this) { + "true" -> true + "false" -> false + else -> throw IllegalArgumentException("The string doesn't represent a boolean value: $this") +} + +/** + * Returns `true` if the content of this string is equal to the word "true", `false` if it is equal to "false", + * and `null` otherwise. + * + * There is also a lenient version of the function available on nullable String, [String?.toBoolean]. + * Note that this function is case-sensitive. + * + * @sample samples.text.Strings.toBooleanStrictOrNull + */ +@SinceKotlin("1.5") +public fun String.toBooleanStrictOrNull(): Boolean? = when (this) { + "true" -> true + "false" -> false + else -> null } \ No newline at end of file diff --git a/libraries/stdlib/wasm/src/kotlin/Text.kt b/libraries/stdlib/wasm/src/kotlin/Text.kt index 6f55ded66bd..1363f2cf36a 100644 --- a/libraries/stdlib/wasm/src/kotlin/Text.kt +++ b/libraries/stdlib/wasm/src/kotlin/Text.kt @@ -493,6 +493,8 @@ actual fun String.toBoolean(): Boolean = TODO("Wasm stdlib: Text") /** * Returns `true` if the contents of this string is equal to the word "true", ignoring case, and `false` otherwise. + * + * There are also strict versions of the function available on non-nullable String, [toBooleanStrict] and [toBooleanStrictOrNull]. */ actual fun String?.toBoolean(): Boolean = TODO("Wasm stdlib: Text") 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 9886bcb4a7f..0894e7fb624 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 @@ -5516,6 +5516,8 @@ public final class kotlin/text/StringsKt { public static final fun toBigDecimalOrNull (Ljava/lang/String;Ljava/math/MathContext;)Ljava/math/BigDecimal; public static final fun toBigIntegerOrNull (Ljava/lang/String;)Ljava/math/BigInteger; public static final fun toBigIntegerOrNull (Ljava/lang/String;I)Ljava/math/BigInteger; + public static final fun toBooleanStrict (Ljava/lang/String;)Z + public static final fun toBooleanStrictOrNull (Ljava/lang/String;)Ljava/lang/Boolean; public static final fun toByteOrNull (Ljava/lang/String;)Ljava/lang/Byte; public static final fun toByteOrNull (Ljava/lang/String;I)Ljava/lang/Byte; public static final fun toCharArray (Ljava/lang/String;II)[C