JS: Make StringBuilder implement CharSequence and introduce secondary constructors.

This commit is contained in:
Ilya Gorbunov
2015-10-14 07:40:57 +03:00
parent 935024db4e
commit d860f335a3
3 changed files with 57 additions and 3 deletions
+7 -1
View File
@@ -44,7 +44,10 @@ public interface Appendable {
}
@library
public class StringBuilder(capacity: Int? = null) : Appendable {
public class StringBuilder(content: String = "") : Appendable, CharSequence {
override val length: Int = noImpl
override fun get(index: Int): Char = noImpl
override fun subSequence(start: Int, end: Int): CharSequence = noImpl
override fun append(c: Char): StringBuilder = noImpl
override fun append(csq: CharSequence?): StringBuilder = noImpl
override fun append(csq: CharSequence?, start: Int, end: Int): StringBuilder = noImpl
@@ -52,3 +55,6 @@ public class StringBuilder(capacity: Int? = null) : Appendable {
public fun reverse(): StringBuilder = noImpl
override fun toString(): String = noImpl
}
public inline fun StringBuilder(capacity: Int): StringBuilder = StringBuilder()
public inline fun StringBuilder(content: CharSequence): StringBuilder = StringBuilder(content.toString())
+13 -2
View File
@@ -1029,9 +1029,20 @@
Kotlin.StringBuilder = Kotlin.createClassNow(null,
function () {
this.string = "";
function (content) {
this.string = typeof(content) == "string" ? content : "";
}, {
length: {
get: function() {
return this.string.length;
}
},
substring: function(start, end) {
return this.string.substring(start, end);
},
charAt: function(index) {
return this.string.charAt(index);
},
append: function (obj, from, to) {
if (from == void 0 && to == void 0) {
this.string = this.string + obj.toString();
@@ -25,4 +25,41 @@ class StringBuilderTest {
append("element", 2, 4)
})
}
@test fun asCharSequence() {
val original = "Some test string"
val sb = StringBuilder(original)
val result = sb.toString()
val cs = sb as CharSequence
assertEquals(result.length(), cs.length())
assertEquals(result.length(), sb.length())
for (index in result.indices) {
assertEquals(result[index], sb[index])
assertEquals(result[index], cs[index])
}
assertEquals(result.substring(2, 6), cs.subSequence(2, 6).toString())
}
@test fun constructors() {
StringBuilder().let { sb ->
assertEquals(0, sb.length())
assertEquals("", sb.toString())
}
StringBuilder(16).let { sb ->
assertEquals(0, sb.length())
assertEquals("", sb.toString())
}
StringBuilder("content").let { sb ->
assertEquals(7, sb.length())
assertEquals("content", sb.toString())
}
StringBuilder(StringBuilder("content")).let { sb ->
assertEquals(7, sb.length())
assertEquals("content", sb.toString())
}
}
}