From f78d8f648e7c5d4bd0102a03be3e6c8479146e39 Mon Sep 17 00:00:00 2001 From: Paul Phillips Date: Wed, 15 Sep 2010 23:13:34 +0000 Subject: 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. --- src/library/scala/Predef.scala | 4 ++-- .../scala/collection/immutable/StringLike.scala | 2 +- .../scala/collection/immutable/StringOps.scala | 2 +- .../scala/collection/immutable/WrappedString.scala | 2 +- .../scala/collection/mutable/StringBuilder.scala | 22 +++++++++++++++++----- test/files/run/stringbuilder-drop.scala | 7 +++++++ 6 files changed, 29 insertions(+), 10 deletions(-) create mode 100644 test/files/run/stringbuilder-drop.scala 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") + } +} + -- cgit v1.2.3