diff options
author | Aleksandar Pokopec <aleksandar.prokopec@epfl.ch> | 2011-07-11 15:17:03 +0000 |
---|---|---|
committer | Aleksandar Pokopec <aleksandar.prokopec@epfl.ch> | 2011-07-11 15:17:03 +0000 |
commit | 74db0a59ad28f49bcf98ef839359697b680289cf (patch) | |
tree | 3c840b9a21609cc9d47b163d81232b95ee7d0aa8 | |
parent | 9e1d24d64283a4caf47cb68c00298538ca0b9999 (diff) | |
download | scala-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.scala | 4 | ||||
-rw-r--r-- | src/library/scala/collection/generic/GenericTraversableTemplate.scala | 14 | ||||
-rw-r--r-- | src/library/scala/collection/immutable/Stream.scala | 4 | ||||
-rw-r--r-- | test/files/run/t4761.check | 4 | ||||
-rw-r--r-- | test/files/run/t4761.scala | 15 |
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) + } +} |