From 7c18ab3ca8e7861adfa8a5e395a104c1ba8ccae0 Mon Sep 17 00:00:00 2001 From: develar Date: Tue, 6 Aug 2013 17:24:48 +0400 Subject: [PATCH] JS backend: cleanup strings code. Added String.size and String.length(). --- js/js.libraries/src/core/javalang.kt | 6 --- js/js.libraries/src/core/string.kt | 18 ++++++-- js/js.libraries/src/core/stringsCode.kt | 23 ---------- .../k2js/test/semantics/StringTest.java | 4 ++ .../translate/context/StandardClasses.java | 8 ---- .../factories/StringOperationFIF.java | 42 ++++--------------- .../string/cases/extensionMethods.kt | 6 +++ .../cases/simplePropertyWithGetter.kt | 8 ++-- .../testFiles/webDemoExamples2/cases/life.kt | 1 - 9 files changed, 37 insertions(+), 79 deletions(-) create mode 100644 js/js.translator/testFiles/expression/string/cases/extensionMethods.kt diff --git a/js/js.libraries/src/core/javalang.kt b/js/js.libraries/src/core/javalang.kt index dbff2c6f5aa..27a2d3b2f05 100644 --- a/js/js.libraries/src/core/javalang.kt +++ b/js/js.libraries/src/core/javalang.kt @@ -3,12 +3,6 @@ package java.lang import java.io.IOException import js.library -library("splitString") -public fun String.split(regex : String) : Array = js.noImpl - -library("splitString") -public fun String.split(regex : String, limit: Int) : Array = js.noImpl - library open public class Exception(message: String? = null) : Throwable() {} diff --git a/js/js.libraries/src/core/string.kt b/js/js.libraries/src/core/string.kt index 6633024a24c..755ce51079f 100644 --- a/js/js.libraries/src/core/string.kt +++ b/js/js.libraries/src/core/string.kt @@ -1,5 +1,13 @@ package js +native public fun String.startsWith(s: String): Boolean = noImpl +native public fun String.endsWith(s: String): Boolean = noImpl +native public fun String.contains(s: String): Boolean = noImpl + +native public fun String.startsWith(char: Char): Boolean = noImpl +native public fun String.endsWith(char: Char): Boolean = noImpl +native public fun String.contains(char: Char): Boolean = noImpl + native public fun String.toUpperCase() : String = js.noImpl native public fun String.toLowerCase() : String = js.noImpl @@ -10,8 +18,11 @@ native public fun String.indexOf(str : String, fromIndex : Int) : Int = js.noImp native public fun String.lastIndexOf(str: String) : Int = js.noImpl native public fun String.lastIndexOf(str : String, fromIndex : Int) : Int = js.noImpl -// Defined in javalang.kt -//native public fun String.split(regex : String) : Array = js.noImpl +library("splitString") +public fun String.split(regex: String): Array = js.noImpl + +library("splitString") +public fun String.split(regex: String, limit: Int): Array = js.noImpl native public fun String.substring(beginIndex : Int) : String = js.noImpl native public fun String.substring(beginIndex : Int, endIndex : Int) : String = js.noImpl @@ -24,9 +35,10 @@ native public fun String.match(regex : String) : Array = js.noImpl native public fun String.trim() : String = js.noImpl -native public val String.length : Int +public val String.size: Int get() = js.noImpl +public fun String.length(): Int = js.noImpl /* diff --git a/js/js.libraries/src/core/stringsCode.kt b/js/js.libraries/src/core/stringsCode.kt index 0d1fa17c251..ffaa4fb87fb 100644 --- a/js/js.libraries/src/core/stringsCode.kt +++ b/js/js.libraries/src/core/stringsCode.kt @@ -11,29 +11,6 @@ public inline fun String.matches(regex : String) : Boolean { return result != null && result.size > 0 } -public inline fun String.length(): Int = length - -inline val String.size : Int -get() = length - -public inline fun String.startsWith(ch: Char): Boolean { - return if (size > 0) charAt(0) == ch else false -} - -public inline fun String.endsWith(ch: Char): Boolean { - val s = size - return if (s > 0) charAt(s - 1) == ch else false -} - -native -fun String.startsWith(s:String):Boolean = noImpl - -native -fun String.endsWith(s:String):Boolean = noImpl - -native -fun String.contains(s:String):Boolean = noImpl - /** * Returns a copy of this string capitalised if it is not empty or already starting with an uppper case letter, otherwise returns this * 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 66cab1d42f7..c03efcc2229 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 @@ -84,4 +84,8 @@ public final class StringTest extends AbstractExpressionTest { public void testStringSplit() throws Exception { checkFooBoxIsOk(); } + + public void testExtensionMethods() throws Exception { + fooBoxTest(); + } } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/context/StandardClasses.java b/js/js.translator/src/org/jetbrains/k2js/translate/context/StandardClasses.java index dcdef387dc1..4584b4c83e7 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/context/StandardClasses.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/context/StandardClasses.java @@ -61,12 +61,6 @@ public final class StandardClasses { declareKotlinObject(currentFQName, kotlinName); } - @NotNull - public Builder kotlinFunction(@NotNull String kotlinName) { - kotlinTopLevelObject(kotlinName); - return this; - } - @NotNull private Builder constructor() { assert currentFQName != null; @@ -105,8 +99,6 @@ public final class StandardClasses { standardClasses.declare().forFQ("jet.IntProgression").kotlinClass("NumberProgression") .methods("iterator", "contains").properties("start", "end", "increment"); - - standardClasses.declare().forFQ("jet.Any.toString").kotlinFunction("toString"); } 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 88bf4331ccb..23fd169f14f 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 @@ -16,49 +16,23 @@ package org.jetbrains.k2js.translate.intrinsic.functions.factories; -import com.google.dart.compiler.backend.js.ast.JsExpression; -import com.google.dart.compiler.backend.js.ast.JsInvocation; -import com.google.dart.compiler.backend.js.ast.JsNameRef; -import com.google.dart.compiler.util.AstUtil; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.jetbrains.k2js.translate.context.TranslationContext; +import org.jetbrains.k2js.translate.intrinsic.functions.basic.BuiltInFunctionIntrinsic; import org.jetbrains.k2js.translate.intrinsic.functions.basic.BuiltInPropertyIntrinsic; -import org.jetbrains.k2js.translate.intrinsic.functions.basic.FunctionIntrinsic; -import org.jetbrains.k2js.translate.intrinsic.functions.patterns.DescriptorPredicate; - -import java.util.List; import static org.jetbrains.k2js.translate.intrinsic.functions.patterns.PatternBuilder.pattern; -import static org.jetbrains.k2js.translate.utils.JsAstUtils.setQualifier; public final class StringOperationFIF extends CompositeFIF { - - @NotNull - private static final DescriptorPredicate GET_PATTERN = pattern("String.get"); - - @NotNull - private static final FunctionIntrinsic GET_INTRINSIC = new FunctionIntrinsic() { - @NotNull - @Override - public JsExpression apply(@Nullable JsExpression receiver, - @NotNull List arguments, - @NotNull TranslationContext context) { - assert receiver != null; - assert arguments.size() == 1 : "String#get expression must have 1 argument."; - //TODO: provide better way - JsNameRef charAtReference = AstUtil.newQualifiedNameRef("charAt"); - setQualifier(charAtReference, receiver); - return new JsInvocation(charAtReference, arguments); - } - }; - @NotNull public static final FunctionIntrinsicFactory INSTANCE = new StringOperationFIF(); private StringOperationFIF() { - add(GET_PATTERN, GET_INTRINSIC); - add(pattern("String."), new BuiltInPropertyIntrinsic("length")); - add(pattern("CharSequence."), new BuiltInPropertyIntrinsic("length")); + add(pattern("jet", "String", "get"), new BuiltInFunctionIntrinsic("charAt")); + + BuiltInPropertyIntrinsic lengthIntrinsic = new BuiltInPropertyIntrinsic("length"); + add(pattern("jet", "String", ""), lengthIntrinsic); + add(pattern("js", "").receiverExists(true), lengthIntrinsic); + add(pattern("js", "length").receiverExists(true), lengthIntrinsic); + add(pattern("jet", "CharSequence", ""), lengthIntrinsic); } } diff --git a/js/js.translator/testFiles/expression/string/cases/extensionMethods.kt b/js/js.translator/testFiles/expression/string/cases/extensionMethods.kt new file mode 100644 index 00000000000..64ce634e7d6 --- /dev/null +++ b/js/js.translator/testFiles/expression/string/cases/extensionMethods.kt @@ -0,0 +1,6 @@ +package foo + +fun box(): Boolean { + val s = "bar" + return s.size == 3 && s.length() == 3 && s.length == 3 +} diff --git a/js/js.translator/testFiles/extensionProperty/cases/simplePropertyWithGetter.kt b/js/js.translator/testFiles/extensionProperty/cases/simplePropertyWithGetter.kt index f073c5ce546..8fbc52a9e0a 100644 --- a/js/js.translator/testFiles/extensionProperty/cases/simplePropertyWithGetter.kt +++ b/js/js.translator/testFiles/extensionProperty/cases/simplePropertyWithGetter.kt @@ -1,6 +1,6 @@ package foo -val String.size : Int +val String.prop : Int get() = length val Int.quadruple : Int @@ -8,9 +8,9 @@ val Int.quadruple : Int fun box() : Boolean { - if ("1".size != 1) return false; - if ("11".size != 2) return false; - if (("121" + "123").size != 6) return false; + if ("1".prop != 1) return false; + if ("11".prop != 2) return false; + if (("121" + "123").prop != 6) return false; if (1.quadruple != 4) return false; if (0.quadruple != 0) return false; return true; diff --git a/js/js.translator/testFiles/webDemoExamples2/cases/life.kt b/js/js.translator/testFiles/webDemoExamples2/cases/life.kt index 6f1da594f5a..229d64c4db1 100644 --- a/js/js.translator/testFiles/webDemoExamples2/cases/life.kt +++ b/js/js.translator/testFiles/webDemoExamples2/cases/life.kt @@ -4,7 +4,6 @@ */ import java.util.* -import java.lang.split; import js.*; /*