diff --git a/libraries/stdlib/src/kotlin/text/CharJVM.kt b/libraries/stdlib/src/kotlin/text/CharJVM.kt index 37d7004d53a..a81d6bb404a 100644 --- a/libraries/stdlib/src/kotlin/text/CharJVM.kt +++ b/libraries/stdlib/src/kotlin/text/CharJVM.kt @@ -141,3 +141,18 @@ public inline fun Char.isLowSurrogate(): Boolean = Character.isLowSurrogate(this // * Returns the Unicode name of this character, or `null` if the code point of this character is unassigned. // */ //public fun Char.name(): String? = Character.getName(this.toInt()) + + + +internal fun digitOf(char: Char, radix: Int): Int = Character.digit(char.toInt(), radix) + +/** + * Checks whether the given [radix] is valid radix for string to number and number to string conversion. + */ +@PublishedApi +internal fun checkRadix(radix: Int): Int { + if(radix !in Character.MIN_RADIX..Character.MAX_RADIX) { + throw IllegalArgumentException("radix $radix was not in valid range ${Character.MIN_RADIX..Character.MAX_RADIX}") + } + return radix +} \ No newline at end of file diff --git a/libraries/stdlib/src/kotlin/text/StringNumberConversions.kt b/libraries/stdlib/src/kotlin/text/StringNumberConversions.kt index d09edcb404d..b28c0992866 100644 --- a/libraries/stdlib/src/kotlin/text/StringNumberConversions.kt +++ b/libraries/stdlib/src/kotlin/text/StringNumberConversions.kt @@ -10,29 +10,28 @@ package kotlin.text */ @SinceKotlin("1.1") @kotlin.internal.InlineOnly -public inline fun Byte.toString(radix: Int): String = this.toInt().toString(radix) +public inline fun Byte.toString(radix: Int): String = this.toInt().toString(checkRadix(radix)) /** * Returns a string representation of this [Short] value in the specified [radix]. */ @SinceKotlin("1.1") @kotlin.internal.InlineOnly -public inline fun Short.toString(radix: Int): String = this.toInt().toString(radix) +public inline fun Short.toString(radix: Int): String = this.toInt().toString(checkRadix(radix)) /** * Returns a string representation of this [Int] value in the specified [radix]. */ @SinceKotlin("1.1") @kotlin.internal.InlineOnly -// TODO: use checkRadix(radix) when PublishedApi is available -public inline fun Int.toString(radix: Int): String = java.lang.Integer.toString(this, radix) +public inline fun Int.toString(radix: Int): String = java.lang.Integer.toString(this, checkRadix(radix)) /** * Returns a string representation of this [Long] value in the specified [radix]. */ @SinceKotlin("1.1") @kotlin.internal.InlineOnly -public inline fun Long.toString(radix: Int): String = java.lang.Long.toString(this, radix) +public inline fun Long.toString(radix: Int): String = java.lang.Long.toString(this, checkRadix(radix)) /** * Returns `true` if the contents of this string is equal to the word "true", ignoring case, and `false` otherwise. @@ -53,8 +52,7 @@ public inline fun String.toByte(): Byte = java.lang.Byte.parseByte(this) */ @SinceKotlin("1.1") @kotlin.internal.InlineOnly -// TODO: use checkRadix(radix) when PublishedApi is available -public inline fun String.toByte(radix: Int): Byte = java.lang.Byte.parseByte(this, radix) +public inline fun String.toByte(radix: Int): Byte = java.lang.Byte.parseByte(this, checkRadix(radix)) /** @@ -70,7 +68,7 @@ public inline fun String.toShort(): Short = java.lang.Short.parseShort(this) */ @SinceKotlin("1.1") @kotlin.internal.InlineOnly -public inline fun String.toShort(radix: Int): Short = java.lang.Short.parseShort(this, radix) +public inline fun String.toShort(radix: Int): Short = java.lang.Short.parseShort(this, checkRadix(radix)) /** * Parses the string as an [Int] number and returns the result. @@ -85,7 +83,7 @@ public inline fun String.toInt(): Int = java.lang.Integer.parseInt(this) */ @SinceKotlin("1.1") @kotlin.internal.InlineOnly -public inline fun String.toInt(radix: Int): Int = java.lang.Integer.parseInt(this, radix) +public inline fun String.toInt(radix: Int): Int = java.lang.Integer.parseInt(this, checkRadix(radix)) /** * Parses the string as a [Long] number and returns the result. @@ -100,7 +98,7 @@ public inline fun String.toLong(): Long = java.lang.Long.parseLong(this) */ @SinceKotlin("1.1") @kotlin.internal.InlineOnly -public inline fun String.toLong(radix: Int): Long = java.lang.Long.parseLong(this, radix) +public inline fun String.toLong(radix: Int): Long = java.lang.Long.parseLong(this, checkRadix(radix)) /** * Parses the string as a [Float] number and returns the result. @@ -322,13 +320,3 @@ private inline fun screenFloatValue(str: String, parse: (String) -> T): T? { null } } - -internal fun digitOf(char: Char, radix: Int): Int = Character.digit(char.toInt(), radix) - -// TODO: @PublishedApi -internal fun checkRadix(radix: Int): Int { - if(radix !in Character.MIN_RADIX..Character.MAX_RADIX) { - throw IllegalArgumentException("radix $radix was not in valid range ${Character.MIN_RADIX..Character.MAX_RADIX}") - } - return radix -} \ No newline at end of file diff --git a/libraries/stdlib/test/text/StringNumberConversionTest.kt b/libraries/stdlib/test/text/StringNumberConversionTest.kt index e8ac4175ff4..4e5cb7a8362 100644 --- a/libraries/stdlib/test/text/StringNumberConversionTest.kt +++ b/libraries/stdlib/test/text/StringNumberConversionTest.kt @@ -161,7 +161,9 @@ class StringNumberConversionTest { assertEquals("-80", Byte.MIN_VALUE.toString(radix = 16)) assertEquals("3v", Byte.MAX_VALUE.toString(radix = 32)) assertEquals("-40", Byte.MIN_VALUE.toString(radix = 32)) - // TODO: IllegalArgumentException on incorrect radix + + assertFailsWith("Expected to fail with radix 37") { 37.toByte().toString(radix = 37) } + assertFailsWith("Expected to fail with radix 1") { 1.toByte().toString(radix = 1) } } @Test fun shortToStringWithRadix() { @@ -169,14 +171,16 @@ class StringNumberConversionTest { assertEquals("-8000", (-0x8000).toShort().toString(radix = 16)) assertEquals("-sfs", (-29180).toShort().toString(radix = 32)) - // TODO: IllegalArgumentException on incorrect radix + assertFailsWith("Expected to fail with radix 37") { 37.toShort().toString(radix = 37) } + assertFailsWith("Expected to fail with radix 1") { 1.toShort().toString(radix = 1) } } @Test fun intToStringWithRadix() { assertEquals("-ff", (-255).toString(radix = 16)) assertEquals("1100110", 102.toString(radix = 2)) assertEquals("kona", 411787.toString(radix = 27)) - // TODO: IllegalArgumentException on incorrect radix + assertFailsWith("Expected to fail with radix 37") { 37.toString(radix = 37) } + assertFailsWith("Expected to fail with radix 1") { 1.toString(radix = 1) } } @@ -185,9 +189,8 @@ class StringNumberConversionTest { assertEquals("hazelnut", 1356099454469L.toString(radix = 36)) assertEquals("-8000000000000000", Long.MIN_VALUE.toString(radix = 16)) - // TODO: IllegalArgumentException on incorrect radix -// assertFailsWith("Expected to fail with radix 37") { 37.toString(radix = 37) } -// assertFailsWith("Expected to fail with radix 1") { 1.toString(radix = 1) } + assertFailsWith("Expected to fail with radix 37") { 37L.toString(radix = 37) } + assertFailsWith("Expected to fail with radix 1") { 1L.toString(radix = 1) } } } diff --git a/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-stdlib.txt b/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-stdlib.txt index db7717c59b0..1dcef5ab367 100644 --- a/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-stdlib.txt +++ b/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-stdlib.txt @@ -2195,6 +2195,7 @@ public final class kotlin/text/CharDirectionality$Companion { } public final class kotlin/text/CharsKt { + public static final fun checkRadix (I)I public static final fun equals (CCZ)Z public static synthetic fun equals$default (CCZILjava/lang/Object;)Z public static final fun getCategory (C)Lkotlin/text/CharCategory;