From 5c0eeb59f63f552c719f8372c6e4f562e20411a7 Mon Sep 17 00:00:00 2001 From: Zalim Bashorov Date: Wed, 29 Jan 2014 14:13:24 +0400 Subject: [PATCH] JS backend: dropped unnecessary intrinsics in StringFIF. Added tests for CharSequence.size, CharSequence.length, CharSequence.length() and CharSequence.isEmpty(). --- js/js.libraries/src/core/string.kt | 8 ++-- .../k2js/test/semantics/StringTest.java | 2 +- .../factories/StringOperationFIF.java | 4 -- .../string/cases/extensionMethods.kt | 38 +++++++++++++++++-- .../testFiles/webDemoExamples2/cases/life.kt | 3 -- 5 files changed, 39 insertions(+), 16 deletions(-) diff --git a/js/js.libraries/src/core/string.kt b/js/js.libraries/src/core/string.kt index c54e7d4a8d2..93e880afa83 100644 --- a/js/js.libraries/src/core/string.kt +++ b/js/js.libraries/src/core/string.kt @@ -35,14 +35,14 @@ native public fun String.match(regex : String) : Array = js.noImpl native public fun String.trim() : String = js.noImpl -library -public val String.size: Int = js.noImpl +native("length") +public val CharSequence.size: Int = js.noImpl library -public fun String.length(): Int = js.noImpl +public fun CharSequence.length(): Int = js.noImpl library -public fun String.isEmpty(): Boolean = js.noImpl +public fun CharSequence.isEmpty(): Boolean = js.noImpl /* diff --git a/js/js.tests/test/org/jetbrains/k2js/test/semantics/StringTest.java b/js/js.tests/test/org/jetbrains/k2js/test/semantics/StringTest.java index c03efcc2229..020f62f2fc9 100644 --- a/js/js.tests/test/org/jetbrains/k2js/test/semantics/StringTest.java +++ b/js/js.tests/test/org/jetbrains/k2js/test/semantics/StringTest.java @@ -86,6 +86,6 @@ public final class StringTest extends AbstractExpressionTest { } public void testExtensionMethods() throws Exception { - fooBoxTest(); + checkFooBoxIsOk(); } } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/StringOperationFIF.java b/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/StringOperationFIF.java index cc1b55c961c..8c08c31abc5 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/StringOperationFIF.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/StringOperationFIF.java @@ -27,11 +27,7 @@ public final class StringOperationFIF extends CompositeFIF { private StringOperationFIF() { add(pattern("jet", "String", "get"), new BuiltInFunctionIntrinsic("charAt")); - - add(pattern("jet", "String", ""), LENGTH_PROPERTY_INTRINSIC); - add(pattern("js", "").receiverExists(), LENGTH_PROPERTY_INTRINSIC); add(pattern("js", "length").receiverExists(), LENGTH_PROPERTY_INTRINSIC); - add(pattern("jet", "CharSequence", ""), LENGTH_PROPERTY_INTRINSIC); add(pattern("js", "isEmpty").receiverExists(), IS_EMPTY_INTRINSIC); } } diff --git a/js/js.translator/testFiles/expression/string/cases/extensionMethods.kt b/js/js.translator/testFiles/expression/string/cases/extensionMethods.kt index d4294002a7c..dab8532976d 100644 --- a/js/js.translator/testFiles/expression/string/cases/extensionMethods.kt +++ b/js/js.translator/testFiles/expression/string/cases/extensionMethods.kt @@ -1,6 +1,36 @@ package foo -fun box(): Boolean { - val s = "bar" - return s.size == 3 && s.length() == 3 && s.length == 3 && s.startsWith("b") && s.endsWith("r") && s.contains("a") && !s.isEmpty() -} \ No newline at end of file +val testString = "foobarbaz" +val testStringSize = 9 +val emptyString = "" +val startsWithParam = "foo" +val endsWithParam = "az" +val containsParam = "ar" + +fun assertEquals(actual: Any, expected: Any, s: String, whatTested: String) = + if (expected != actual) "String.$whatTested fails on \"$s\", expected: $expected, actual: $actual" else null + +fun assertEquals(actual: Any, expected: Any, s: CharSequence, whatTested: CharSequence) = + if (expected != actual) "CharSequence.$whatTested fails on \"$s\", expected: $expected, actual: $actual" else null + +fun testString(s: String, expectedSize: Int): String? = + assertEquals(s.size, expectedSize, s, "size") ?: + assertEquals(s.length(), expectedSize, s, "length()") ?: + assertEquals(s.length, expectedSize, s, "length") ?: + assertEquals(s.isEmpty(), expectedSize == 0, s, "isEmpty()") ?: + assertEquals(s.startsWith(startsWithParam), expectedSize != 0, s, "startsWith(\"$startsWithParam\")") ?: + assertEquals(s.endsWith(endsWithParam), expectedSize != 0, s, "endsWith(\"$endsWithParam\")") ?: + assertEquals(s.contains(containsParam), expectedSize != 0, s, "contains(\"$containsParam\")") + +fun testCharSequence(s: CharSequence, expectedSize: Int): String? = + assertEquals(s.size, expectedSize, s, "size") ?: + assertEquals(s.length(), expectedSize, s, "length()") ?: + assertEquals(s.length, expectedSize, s, "length") ?: + assertEquals(s.isEmpty(), expectedSize == 0, s, "isEmpty()") + +fun box(): String = + testString(testString, testStringSize) ?: + testString(emptyString, 0) ?: + testCharSequence(testString, testStringSize) ?: + testCharSequence(emptyString, 0) ?: + "OK" diff --git a/js/js.translator/testFiles/webDemoExamples2/cases/life.kt b/js/js.translator/testFiles/webDemoExamples2/cases/life.kt index cefeaea990b..c683370b23b 100644 --- a/js/js.translator/testFiles/webDemoExamples2/cases/life.kt +++ b/js/js.translator/testFiles/webDemoExamples2/cases/life.kt @@ -123,9 +123,6 @@ fun printField(s : String, steps : Int) { fun Array.toList() : List = this.to(ArrayList()) -val String?.size : Int -get() = if (this != null) this.length else 0; - fun > Array.to(result: C) : C { for (elem in this) result.add(elem)