JS backend: cleanup strings code.

Added String.size and String.length().
This commit is contained in:
develar
2013-08-06 17:24:48 +04:00
committed by Zalim Bashorov
parent 678f6601dd
commit 7c18ab3ca8
9 changed files with 37 additions and 79 deletions
-6
View File
@@ -3,12 +3,6 @@ package java.lang
import java.io.IOException
import js.library
library("splitString")
public fun String.split(regex : String) : Array<String> = js.noImpl
library("splitString")
public fun String.split(regex : String, limit: Int) : Array<String> = js.noImpl
library
open public class Exception(message: String? = null) : Throwable() {}
+15 -3
View File
@@ -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<String> = js.noImpl
library("splitString")
public fun String.split(regex: String): Array<String> = js.noImpl
library("splitString")
public fun String.split(regex: String, limit: Int): Array<String> = 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<String> = 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
/*
-23
View File
@@ -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
*
@@ -84,4 +84,8 @@ public final class StringTest extends AbstractExpressionTest {
public void testStringSplit() throws Exception {
checkFooBoxIsOk();
}
public void testExtensionMethods() throws Exception {
fooBoxTest();
}
}
@@ -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");
}
@@ -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<JsExpression> 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.<get-length>"), new BuiltInPropertyIntrinsic("length"));
add(pattern("CharSequence.<get-length>"), new BuiltInPropertyIntrinsic("length"));
add(pattern("jet", "String", "get"), new BuiltInFunctionIntrinsic("charAt"));
BuiltInPropertyIntrinsic lengthIntrinsic = new BuiltInPropertyIntrinsic("length");
add(pattern("jet", "String", "<get-length>"), lengthIntrinsic);
add(pattern("js", "<get-size>").receiverExists(true), lengthIntrinsic);
add(pattern("js", "length").receiverExists(true), lengthIntrinsic);
add(pattern("jet", "CharSequence", "<get-length>"), lengthIntrinsic);
}
}
@@ -0,0 +1,6 @@
package foo
fun box(): Boolean {
val s = "bar"
return s.size == 3 && s.length() == 3 && s.length == 3
}
@@ -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;
@@ -4,7 +4,6 @@
*/
import java.util.*
import java.lang.split;
import js.*;
/*