summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Phillips <paulp@improving.org>2010-09-15 23:13:34 +0000
committerPaul Phillips <paulp@improving.org>2010-09-15 23:13:34 +0000
commitf78d8f648e7c5d4bd0102a03be3e6c8479146e39 (patch)
tree1e0c01165a9d8ca243d050e2fc056847e0b6cce6
parentedf94d0bafbbe0783e2d5e7b2cd91e03447d572e (diff)
downloadscala-f78d8f648e7c5d4bd0102a03be3e6c8479146e39.tar.gz
scala-f78d8f648e7c5d4bd0102a03be3e6c8479146e39.tar.bz2
scala-f78d8f648e7c5d4bd0102a03be3e6c8479146e39.zip
Gave StringBuilder a StringLike parent as endor...
Gave StringBuilder a StringLike parent as endorsed by martin in http://www.scala-lang.org/node/6893 . Review by odersky.
-rw-r--r--src/library/scala/Predef.scala4
-rw-r--r--src/library/scala/collection/immutable/StringLike.scala2
-rw-r--r--src/library/scala/collection/immutable/StringOps.scala2
-rw-r--r--src/library/scala/collection/immutable/WrappedString.scala2
-rw-r--r--src/library/scala/collection/mutable/StringBuilder.scala22
-rw-r--r--test/files/run/stringbuilder-drop.scala7
6 files changed, 29 insertions, 10 deletions
diff --git a/src/library/scala/Predef.scala b/src/library/scala/Predef.scala
index 3c44a1f992..820d1bb20f 100644
--- a/src/library/scala/Predef.scala
+++ b/src/library/scala/Predef.scala
@@ -289,8 +289,8 @@ object Predef extends LowPriorityImplicits {
implicit def stringCanBuildFrom: CanBuildFrom[String, Char, String] =
new CanBuildFrom[String, Char, String] {
- def apply(from: String) = new scala.collection.mutable.StringBuilder
- def apply() = new scala.collection.mutable.StringBuilder
+ def apply(from: String) = apply()
+ def apply() = scala.collection.mutable.StringBuilder.newBuilder
}
implicit def seqToCharSequence(xs: collection.IndexedSeq[Char]): CharSequence = new CharSequence {
diff --git a/src/library/scala/collection/immutable/StringLike.scala b/src/library/scala/collection/immutable/StringLike.scala
index 6fe6b4555d..9c137810ac 100644
--- a/src/library/scala/collection/immutable/StringLike.scala
+++ b/src/library/scala/collection/immutable/StringLike.scala
@@ -42,7 +42,7 @@ import StringLike._
* @define mayNotTerminateInf
* @define willNotTerminateInf
*/
-trait StringLike[+Repr] extends IndexedSeqOptimized[Char, Repr] with Ordered[String] {
+trait StringLike[+Repr] extends collection.IndexedSeqOptimized[Char, Repr] with Ordered[String] {
self =>
/** Creates a string builder buffer as builder for this class */
diff --git a/src/library/scala/collection/immutable/StringOps.scala b/src/library/scala/collection/immutable/StringOps.scala
index 0d8f5f6b83..a18a30db01 100644
--- a/src/library/scala/collection/immutable/StringOps.scala
+++ b/src/library/scala/collection/immutable/StringOps.scala
@@ -34,7 +34,7 @@ final class StringOps(override val repr: String) extends StringLike[String] {
override protected[this] def toCollection(repr: String): WrappedString = new WrappedString(repr)
/** Creates a string builder buffer as builder for this class */
- override protected[this] def newBuilder = new StringBuilder
+ override protected[this] def newBuilder = StringBuilder.newBuilder
override def slice(from: Int, until: Int): String = {
/** Slice must be forgiving on all out of bounds indices and
diff --git a/src/library/scala/collection/immutable/WrappedString.scala b/src/library/scala/collection/immutable/WrappedString.scala
index 8fe3a2bc5c..62a39213d5 100644
--- a/src/library/scala/collection/immutable/WrappedString.scala
+++ b/src/library/scala/collection/immutable/WrappedString.scala
@@ -46,5 +46,5 @@ class WrappedString(override val self: String) extends IndexedSeq[Char] with Str
* @since 2.8
*/
object WrappedString {
- def newBuilder: Builder[Char, WrappedString] = new StringBuilder() mapResult (new WrappedString(_))
+ def newBuilder: Builder[Char, WrappedString] = StringBuilder.newBuilder mapResult (x => new WrappedString(x))
}
diff --git a/src/library/scala/collection/mutable/StringBuilder.scala b/src/library/scala/collection/mutable/StringBuilder.scala
index e9258c9730..f78131111a 100644
--- a/src/library/scala/collection/mutable/StringBuilder.scala
+++ b/src/library/scala/collection/mutable/StringBuilder.scala
@@ -11,6 +11,7 @@ package mutable
import java.lang.{ StringBuilder => JavaStringBuilder }
import annotation.migration
+import immutable.StringLike
/** A builder for mutable sequence of characters. This class provides an API
* mostly compatible with java.lang.StringBuilder, except where there are conflicts
@@ -24,10 +25,16 @@ import annotation.migration
@serializable
@SerialVersionUID(0 - 8525408645367278351L)
final class StringBuilder(private val underlying: JavaStringBuilder)
- extends Builder[Char, String]
+ extends Builder[Char, StringBuilder]
with java.lang.CharSequence
with IndexedSeq[Char]
- with IndexedSeqOptimized[Char, IndexedSeq[Char]] {
+ with StringLike[StringBuilder] {
+
+ override protected[this] def thisCollection: StringBuilder = this
+ override protected[this] def toCollection(repr: StringBuilder): StringBuilder = repr
+
+ /** Creates a string builder buffer as builder for this class */
+ override protected[this] def newBuilder = new StringBuilder
/** Constructs a string builder initialized with String initValue
* and with additional Char capacity initCapacity.
@@ -59,7 +66,7 @@ final class StringBuilder(private val underlying: JavaStringBuilder)
arr
}
- def length: Int = underlying.length()
+ override def length: Int = underlying.length()
def length_=(n: Int) { underlying.setLength(n) }
/** Clears the builder contents.
@@ -105,7 +112,7 @@ final class StringBuilder(private val underlying: JavaStringBuilder)
/** Equivalent to charAt.
*/
- def apply(index: Int): Char = underlying charAt index
+ override def apply(index: Int): Char = underlying charAt index
/** Removes the Char at the specified index. The sequence is
* shortened by one.
@@ -428,6 +435,11 @@ final class StringBuilder(private val underlying: JavaStringBuilder)
* @return the current contents of this sequence as a String
*/
override def toString = underlying.toString
+ override def mkString = toString
- def result(): String = toString
+ def result(): StringBuilder = this
}
+
+object StringBuilder {
+ def newBuilder = new StringBuilder mapResult (_.toString)
+} \ No newline at end of file
diff --git a/test/files/run/stringbuilder-drop.scala b/test/files/run/stringbuilder-drop.scala
new file mode 100644
index 0000000000..a9e5a71762
--- /dev/null
+++ b/test/files/run/stringbuilder-drop.scala
@@ -0,0 +1,7 @@
+object Test {
+ def main(args: Array[String]): Unit = {
+ val s = (new StringBuilder ++= "hello world") dropRight 1 toString;
+ assert(s == "hello worl")
+ }
+}
+