Fix endsWith in JS always ignored character case, regardless of the ignoreCase parameter value.

startsWith, endsWith again use native implementation when possible.
This commit is contained in:
Ilya Gorbunov
2015-04-01 17:15:01 +03:00
parent 315badd5d1
commit cac058d5a3
3 changed files with 32 additions and 6 deletions
+9
View File
@@ -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<String> = noImpl
+19 -6
View File
@@ -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)
}
+4
View File
@@ -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("", ignoreCase = false))
assertTrue("strö".endsWith("", 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'))
}