From 34d3f1cb95b1cc0fba242296026e546366c483d9 Mon Sep 17 00:00:00 2001 From: Paul Phillips Date: Fri, 25 Feb 2011 19:46:52 +0000 Subject: Made mkString work correctly on views. about how to obtain a String and how not to. Closes #4297, no review. --- src/library/scala/collection/TraversableViewLike.scala | 10 ++++++++++ src/library/scala/collection/mutable/StringBuilder.scala | 13 +++++++++++++ src/library/scala/collection/parallel/ParIterableView.scala | 1 - .../scala/collection/parallel/ParIterableViewLike.scala | 1 - test/files/run/bug4297.scala | 7 +++++++ 5 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 test/files/run/bug4297.scala diff --git a/src/library/scala/collection/TraversableViewLike.scala b/src/library/scala/collection/TraversableViewLike.scala index 0c01cb893e..8d94a7f381 100644 --- a/src/library/scala/collection/TraversableViewLike.scala +++ b/src/library/scala/collection/TraversableViewLike.scala @@ -200,9 +200,19 @@ self => buf.result } + // Have to overload all three to work around #4299. The overload + // is because mkString should force a view but toString should not. + override def mkString: String = mkString("") + override def mkString(sep: String): String = mkString("", sep, "") + override def mkString(start: String, sep: String, end: String): String = { + thisSeq.addString(new StringBuilder(), start, sep, end).toString + } + override def addString(b: StringBuilder, start: String, sep: String, end: String): StringBuilder = b append start append "..." append end + override def toString = stringPrefix+"(...)" + override def filter(p: A => Boolean): This = newFiltered(p).asInstanceOf[This] override def withFilter(p: A => Boolean): This = newFiltered(p).asInstanceOf[This] override def partition(p: A => Boolean): (This, This) = (filter(p), filter(!p(_))) diff --git a/src/library/scala/collection/mutable/StringBuilder.scala b/src/library/scala/collection/mutable/StringBuilder.scala index 6c3715e560..73d3778650 100644 --- a/src/library/scala/collection/mutable/StringBuilder.scala +++ b/src/library/scala/collection/mutable/StringBuilder.scala @@ -432,11 +432,24 @@ final class StringBuilder(private val underlying: JavaStringBuilder) /** Returns a new String representing the data in this sequence. * + * @note because toString is inherited from AnyRef and used for + * many purposes, it is better practice to call mkString + * to obtain a StringBuilder result. * @return the current contents of this sequence as a String */ override def toString = underlying.toString + + /** Returns a new String representing the data in this sequence. + * + * @return the current contents of this sequence as a String + */ override def mkString = toString + /** Returns the result of this Builder, which in the case + * of StringBuilders is a StringBuilder (not a String.) + * + * @return this StringBuilder + */ def result(): StringBuilder = this } diff --git a/src/library/scala/collection/parallel/ParIterableView.scala b/src/library/scala/collection/parallel/ParIterableView.scala index 0bcad549a2..f8e0f9909c 100644 --- a/src/library/scala/collection/parallel/ParIterableView.scala +++ b/src/library/scala/collection/parallel/ParIterableView.scala @@ -13,7 +13,6 @@ package scala.collection.parallel import scala.collection.Parallel -import scala.collection.TraversableViewLike import scala.collection.IterableView import scala.collection.generic.CanCombineFrom diff --git a/src/library/scala/collection/parallel/ParIterableViewLike.scala b/src/library/scala/collection/parallel/ParIterableViewLike.scala index d34aa10977..2b7bd03e7a 100644 --- a/src/library/scala/collection/parallel/ParIterableViewLike.scala +++ b/src/library/scala/collection/parallel/ParIterableViewLike.scala @@ -13,7 +13,6 @@ package scala.collection.parallel import scala.collection.Parallel -import scala.collection.TraversableViewLike import scala.collection.IterableView import scala.collection.IterableViewLike import scala.collection.generic.CanBuildFrom diff --git a/test/files/run/bug4297.scala b/test/files/run/bug4297.scala new file mode 100644 index 0000000000..7497dfe4c2 --- /dev/null +++ b/test/files/run/bug4297.scala @@ -0,0 +1,7 @@ +object Test { + def main(args: Array[String]): Unit = { + def f = List(1,2,3).view + assert(f.toString == "SeqView(...)") + assert(f.mkString == "123") + } +} -- cgit v1.2.3