summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksandar Pokopec <aleksandar.prokopec@epfl.ch>2011-07-11 15:17:03 +0000
committerAleksandar Pokopec <aleksandar.prokopec@epfl.ch>2011-07-11 15:17:03 +0000
commit74db0a59ad28f49bcf98ef839359697b680289cf (patch)
tree3c840b9a21609cc9d47b163d81232b95ee7d0aa8
parent9e1d24d64283a4caf47cb68c00298538ca0b9999 (diff)
downloadscala-74db0a59ad28f49bcf98ef839359697b680289cf.tar.gz
scala-74db0a59ad28f49bcf98ef839359697b680289cf.tar.bz2
scala-74db0a59ad28f49bcf98ef839359697b680289cf.zip
Fixes #4761.
This changes the signature of flatten - I do not see how to use a @bridge annotation here, since after erasure both the bridge and the original method have the same signature. Review by extempore.
-rw-r--r--src/library/scala/collection/Traversable.scala4
-rw-r--r--src/library/scala/collection/generic/GenericTraversableTemplate.scala14
-rw-r--r--src/library/scala/collection/immutable/Stream.scala4
-rw-r--r--test/files/run/t4761.check4
-rw-r--r--test/files/run/t4761.scala15
5 files changed, 33 insertions, 8 deletions
diff --git a/src/library/scala/collection/Traversable.scala b/src/library/scala/collection/Traversable.scala
index 3cdc4cbf82..3f550adeed 100644
--- a/src/library/scala/collection/Traversable.scala
+++ b/src/library/scala/collection/Traversable.scala
@@ -29,10 +29,10 @@ trait Traversable[+A] extends TraversableLike[A, Traversable[A]]
override def seq: Traversable[A] = this
@bridge
- def flatten[B](implicit asTraversable: A => /*<:<!!!*/ TraversableOnce[B]): Traversable[B] = super.flatten(asTraversable)
+ def flatten[B](implicit asTraversable: A => /*<:<!!!*/ GenTraversableOnce[B]): Traversable[B] = super.flatten(asTraversable)
@bridge
- def transpose[B](implicit asTraversable: A => /*<:<!!!*/ TraversableOnce[B]): Traversable[Traversable[B]] = super.transpose(asTraversable)
+ def transpose[B](implicit asTraversable: A => /*<:<!!!*/ GenTraversableOnce[B]): Traversable[Traversable[B]] = super.transpose(asTraversable)
/* The following methods are inherited from TraversableLike
*
diff --git a/src/library/scala/collection/generic/GenericTraversableTemplate.scala b/src/library/scala/collection/generic/GenericTraversableTemplate.scala
index 805009be77..a1b10dc9e3 100644
--- a/src/library/scala/collection/generic/GenericTraversableTemplate.scala
+++ b/src/library/scala/collection/generic/GenericTraversableTemplate.scala
@@ -13,6 +13,7 @@ package generic
import mutable.Builder
import annotation.migration
+import annotation.bridge
import annotation.unchecked.uncheckedVariance
/** A template class for companion objects of ``regular`` collection classes
@@ -120,17 +121,22 @@ trait GenericTraversableTemplate[+A, +CC[X] <: GenTraversable[X]] extends HasNew
*
* @tparam B the type of the elements of each traversable collection.
* @param asTraversable an implicit conversion which asserts that the element
- * type of this $coll is a `Traversable`.
+ * type of this $coll is a `GenTraversable`.
* @return a new $coll resulting from concatenating all element ${coll}s.
* @usecase def flatten[B]: $Coll[B]
*/
- def flatten[B](implicit asTraversable: A => /*<:<!!!*/ TraversableOnce[B]): CC[B] = {
+ def flatten[B](implicit asTraversable: A => /*<:<!!!*/ GenTraversableOnce[B]): CC[B] = {
val b = genericBuilder[B]
for (xs <- sequential)
- b ++= asTraversable(xs)
+ b ++= asTraversable(xs).seq
b.result
}
+ // cannot have a bridge, because it would have the same signature as the target method after erasure
+ // @bridge
+ // def flatten[B](implicit asTraversable: A => /*<:<!!!*/ TraversableOnce[B]): CC[B] =
+ // flatten[B](asTraversable: A => GenTraversableOnce[B])
+
/** Transposes this $coll of traversable collections into
* a $coll of ${coll}s.
*
@@ -143,7 +149,7 @@ trait GenericTraversableTemplate[+A, +CC[X] <: GenTraversable[X]] extends HasNew
* are not of the same size.
*/
@migration(2, 9, "As of 2.9, transpose throws an exception if collections are not uniformly sized.")
- def transpose[B](implicit asTraversable: A => /*<:<!!!*/ TraversableOnce[B]): CC[CC[B] @uncheckedVariance] = {
+ def transpose[B](implicit asTraversable: A => /*<:<!!!*/ GenTraversableOnce[B]): CC[CC[B] @uncheckedVariance] = {
if (isEmpty)
return genericBuilder[CC[B]].result
diff --git a/src/library/scala/collection/immutable/Stream.scala b/src/library/scala/collection/immutable/Stream.scala
index 5f90202522..a0e5668349 100644
--- a/src/library/scala/collection/immutable/Stream.scala
+++ b/src/library/scala/collection/immutable/Stream.scala
@@ -484,7 +484,7 @@ self =>
result
}
- override def flatten[B](implicit asTraversable: A => /*<:<!!!*/ TraversableOnce[B]): Stream[B] = {
+ override def flatten[B](implicit asTraversable: A => /*<:<!!!*/ GenTraversableOnce[B]): Stream[B] = {
def flatten1(t: Traversable[B]): Stream[B] =
if (!t.isEmpty)
cons(t.head, flatten1(t.tail))
@@ -492,7 +492,7 @@ self =>
tail.flatten
if (isEmpty) Stream.empty
- else flatten1(asTraversable(head).toTraversable)
+ else flatten1(asTraversable(head).seq.toTraversable)
}
override def view = new StreamView[A, Stream[A]] {
diff --git a/test/files/run/t4761.check b/test/files/run/t4761.check
new file mode 100644
index 0000000000..1698a57bfa
--- /dev/null
+++ b/test/files/run/t4761.check
@@ -0,0 +1,4 @@
+Vector(1, 1, 1, 1, 1)
+Vector(Vector(1, 1, 1, 1, 1))
+List(1, 2)
+List(List(1, 2))
diff --git a/test/files/run/t4761.scala b/test/files/run/t4761.scala
new file mode 100644
index 0000000000..205798b00e
--- /dev/null
+++ b/test/files/run/t4761.scala
@@ -0,0 +1,15 @@
+
+
+
+
+object Test {
+ def main(args: Array[String]) {
+ val gs = for (x <- (1 to 5)) yield { if (x % 2 == 0) List(1).seq else List(1).par }
+ println(gs.flatten)
+ println(gs.transpose)
+
+ val s = Stream(Vector(1).par, Vector(2).par)
+ println(s.flatten.toList)
+ println(s.transpose.map(_.toList).toList)
+ }
+}