KT-23356 Cross-platform function to convert CharArray slice to String

Signed-off-by: Valeriy Zhirnov <neonailol@gmail.com>
This commit is contained in:
Neonailol
2018-05-21 17:15:00 +03:00
committed by Ilya Gorbunov
parent 16ebcc6e77
commit ede2e227c2
4 changed files with 56 additions and 2 deletions
@@ -90,6 +90,20 @@ expect fun Char.isLowSurrogate(): Boolean
// From string.kt
/**
* Converts the characters in the specified array to a string.
*/
@SinceKotlin("1.2")
public expect fun String(chars: CharArray): String
/**
* Converts the characters from a portion of the specified array to a string.
*/
@SinceKotlin("1.2")
public expect fun String(chars: CharArray, offset: Int, length: Int): String
internal expect fun String.nativeIndexOf(str: String, fromIndex: Int): Int
internal expect fun String.nativeLastIndexOf(str: String, fromIndex: Int): Int
+18
View File
@@ -7,6 +7,24 @@ package kotlin.text
import kotlin.js.RegExp
/**
* Converts the characters in the specified array to a string.
*/
@SinceKotlin("1.2")
@kotlin.internal.InlineOnly
public actual inline fun String(chars: CharArray): String {
return js("String.fromCharCode").apply(null, chars)
}
/**
* Converts the characters from a portion of the specified array to a string.
*/
@SinceKotlin("1.2")
public actual fun String(chars: CharArray, offset: Int, length: Int): String {
return String(chars.copyOfRange(offset, offset + length))
}
@kotlin.internal.InlineOnly
public actual inline fun String.toUpperCase(): String = asDynamic().toUpperCase()
@@ -260,14 +260,14 @@ public inline fun String(bytes: ByteArray): String =
* Converts the characters in the specified array to a string.
*/
@kotlin.internal.InlineOnly
public inline fun String(chars: CharArray): String =
public actual inline fun String(chars: CharArray): String =
java.lang.String(chars) as String
/**
* Converts the characters from a portion of the specified array to a string.
*/
@kotlin.internal.InlineOnly
public inline fun String(chars: CharArray, offset: Int, length: Int): String =
public actual inline fun String(chars: CharArray, offset: Int, length: Int): String =
java.lang.String(chars, offset, length) as String
/**
+22
View File
@@ -43,6 +43,28 @@ fun Char.isAsciiUpperCase() = this in 'A'..'Z'
class StringTest {
@Test fun stringFromCharArrayFullSlice() {
val chars: CharArray = charArrayOf('K', 'o', 't', 'l', 'i', 'n')
assertEquals("Kotlin", String(chars, 0, chars.size))
}
@Test fun stringFromCharArraySlice() {
val chars: CharArray = charArrayOf('K', 'o', 't', 'l', 'i', 'n', ' ', 'r', 'u', 'l', 'e', 's')
assertEquals("rule", String(chars, 7, 4))
}
@Test fun stringFromCharArray() {
val chars: CharArray = charArrayOf('K', 'o', 't', 'l', 'i', 'n')
assertEquals("Kotlin", String(chars))
}
@Test fun stringFromCharArrayUnicodeSurrogatePairs() {
val chars: CharArray = charArrayOf('Ц', '月', '語', '\u016C', '\u138D', '\uD83C', '\uDC3A')
assertEquals("Ц月語Ŭᎍ🀺", String(chars))
assertEquals("", String(chars, 1, 1))
assertEquals("Ŭᎍ🀺", String(chars, 3, 4))
}
@Test fun isEmptyAndBlank() = withOneCharSequenceArg { arg1 ->
class Case(val value: String?, val isNull: Boolean = false, val isEmpty: Boolean = false, val isBlank: Boolean = false)