diff --git a/js/js.libraries/src/core/string.kt b/js/js.libraries/src/core/string.kt index 8f889d08437..7c202f42c42 100644 --- a/js/js.libraries/src/core/string.kt +++ b/js/js.libraries/src/core/string.kt @@ -4,12 +4,21 @@ native public fun String.toUpperCase() : String = noImpl native public fun String.toLowerCase() : String = noImpl +// TODO: make internal native("indexOf") public fun String.nativeIndexOf(str : String, fromIndex : Int) : Int = noImpl +// TODO: make internal native("lastIndexOf") public fun String.nativeLastIndexOf(str : String, fromIndex : Int) : Int = noImpl +// TODO: make internal +native("startsWith") +public fun String.nativeStartsWith(s: String, position: Int): Boolean = noImpl +// TODO: make internal +native("endsWith") +public fun String.nativeEndsWith(s: String): Boolean = noImpl + library("splitString") public fun String.splitWithRegex(regex: String): Array = noImpl diff --git a/js/js.libraries/src/core/stringsCode.kt b/js/js.libraries/src/core/stringsCode.kt index eadadd4e1aa..a11da1e350d 100644 --- a/js/js.libraries/src/core/stringsCode.kt +++ b/js/js.libraries/src/core/stringsCode.kt @@ -1,25 +1,38 @@ package kotlin.js +// TODO: make internal public inline fun String.nativeIndexOf(ch : Char, fromIndex : Int) : Int = nativeIndexOf(ch.toString(), fromIndex) public inline fun String.nativeLastIndexOf(ch : Char, fromIndex : Int) : Int = nativeLastIndexOf(ch.toString(), fromIndex) /** * Returns `true` if this string starts with the specified prefix. */ -public fun String.startsWith(prefix: String, ignoreCase: Boolean = false): Boolean = - regionMatches(0, prefix, 0, prefix.length(), ignoreCase) +public fun String.startsWith(prefix: String, ignoreCase: Boolean = false): Boolean { + if (!ignoreCase) + return nativeStartsWith(prefix, 0) + else + return regionMatches(0, prefix, 0, prefix.length(), ignoreCase) +} /** * Returns `true` if a substring of this string starting at the specified offset [thisOffset] starts with the specified prefix. */ -public fun String.startsWith(prefix: String, thisOffset: Int, ignoreCase: Boolean = false): Boolean = - regionMatches(thisOffset, prefix, 0, prefix.length(), ignoreCase) +public fun String.startsWith(prefix: String, thisOffset: Int, ignoreCase: Boolean = false): Boolean { + if (!ignoreCase) + return nativeStartsWith(prefix, thisOffset) + else + return regionMatches(thisOffset, prefix, 0, prefix.length(), ignoreCase) +} /** * Returns `true` if this string ends with the specified suffix. */ -public fun String.endsWith(suffix: String, ignoreCase: Boolean = false): Boolean = - regionMatches(length() - suffix.length(), suffix, 0, suffix.length(), ignoreCase = true) +public fun String.endsWith(suffix: String, ignoreCase: Boolean = false): Boolean { + if (!ignoreCase) + return nativeEndsWith(suffix) + else + return regionMatches(length() - suffix.length(), suffix, 0, suffix.length(), ignoreCase) +} diff --git a/libraries/stdlib/test/text/StringTest.kt b/libraries/stdlib/test/text/StringTest.kt index c4ad0f771be..eda6fa62d3a 100644 --- a/libraries/stdlib/test/text/StringTest.kt +++ b/libraries/stdlib/test/text/StringTest.kt @@ -39,6 +39,7 @@ class StringTest { assertTrue("some".startsWith("")) assertTrue("".startsWith("")) + assertFalse("abcd".startsWith("aB", ignoreCase = false)) assertTrue("abcd".startsWith("aB", ignoreCase = true)) } @@ -46,6 +47,7 @@ class StringTest { assertTrue("abcd".endsWith("d")) assertTrue("abcd".endsWith("abcd")) assertFalse("abcd".endsWith("b")) + assertFalse("strö".endsWith("RÖ", ignoreCase = false)) assertTrue("strö".endsWith("RÖ", ignoreCase = true)) assertFalse("".endsWith("a")) assertTrue("some".endsWith("")) @@ -55,6 +57,7 @@ class StringTest { test fun startsWithChar() { assertTrue("abcd".startsWith('a')) assertFalse("abcd".startsWith('b')) + assertFalse("abcd".startsWith('A', ignoreCase = false)) assertTrue("abcd".startsWith('A', ignoreCase = true)) assertFalse("".startsWith('a')) } @@ -62,6 +65,7 @@ class StringTest { test fun endsWithChar() { assertTrue("abcd".endsWith('d')) assertFalse("abcd".endsWith('b')) + assertFalse("strö".endsWith('Ö', ignoreCase = false)) assertTrue("strö".endsWith('Ö', ignoreCase = true)) assertFalse("".endsWith('a')) }