Skip to content

Commit 7f048c4

Browse files
committed
Fix ViewLike tests to make them Dotty compatible.
Quite a lot of work needed there.
1 parent 80c95de commit 7f048c4

File tree

5 files changed

+141
-140
lines changed

5 files changed

+141
-140
lines changed

src/library/scala/collection/IterableViewLike.scala

Lines changed: 31 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -36,59 +36,59 @@ trait IterableViewLike[+A,
3636
with TraversableViewLike[A, Coll, This]
3737
{ self =>
3838

39-
/** Explicit instantiation of the `Transformed` trait to reduce class file size in subclasses. */
40-
private[collection] abstract class AbstractTransformed[+B] extends Iterable[B] with super[TraversableViewLike].Transformed[B] with Transformed[B]
39+
/** Explicit instantiation of the `TransformedI` trait to reduce class file size in subclasses. */
40+
private[collection] abstract class AbstractTransformedI[+B] extends Iterable[B] with super[TraversableViewLike].TransformedT[B] with TransformedI[B]
4141

42-
trait Transformed[+B] extends IterableView[B, Coll] with super.Transformed[B] {
42+
trait TransformedI[+B] extends IterableView[B, Coll] with super.TransformedT[B] {
4343
def iterator: Iterator[B]
4444
override def foreach[U](f: B => U): Unit = iterator foreach f
4545
override def toString = viewToString
4646
override def isEmpty = !iterator.hasNext
4747
}
4848

49-
trait EmptyView extends Transformed[Nothing] with super.EmptyView {
49+
trait EmptyViewI extends TransformedI[Nothing] with super.EmptyViewT {
5050
final def iterator: Iterator[Nothing] = Iterator.empty
5151
}
5252

53-
trait Forced[B] extends super.Forced[B] with Transformed[B] {
53+
trait ForcedI[B] extends super.ForcedT[B] with TransformedI[B] {
5454
def iterator = forced.iterator
5555
}
5656

57-
trait Sliced extends super.Sliced with Transformed[A] {
57+
trait SlicedI extends super.SlicedT with TransformedI[A] {
5858
def iterator: Iterator[A] = self.iterator.slice(from, until)
5959
}
6060

61-
trait Mapped[B] extends super.Mapped[B] with Transformed[B] {
61+
trait MappedI[B] extends super.MappedT[B] with TransformedI[B] {
6262
def iterator = self.iterator map mapping
6363
}
6464

65-
trait FlatMapped[B] extends super.FlatMapped[B] with Transformed[B] {
65+
trait FlatMappedI[B] extends super.FlatMappedT[B] with TransformedI[B] {
6666
def iterator: Iterator[B] = self.iterator flatMap mapping
6767
}
6868

69-
trait Appended[B >: A] extends super.Appended[B] with Transformed[B] {
69+
trait AppendedI[B >: A] extends super.AppendedT[B] with TransformedI[B] {
7070
def iterator = self.iterator ++ rest
7171
}
7272

73-
trait Filtered extends super.Filtered with Transformed[A] {
73+
trait FilteredI extends super.FilteredT with TransformedI[A] {
7474
def iterator = self.iterator filter pred
7575
}
7676

77-
trait TakenWhile extends super.TakenWhile with Transformed[A] {
77+
trait TakenWhileI extends super.TakenWhileT with TransformedI[A] {
7878
def iterator = self.iterator takeWhile pred
7979
}
8080

81-
trait DroppedWhile extends super.DroppedWhile with Transformed[A] {
81+
trait DroppedWhileI extends super.DroppedWhileT with TransformedI[A] {
8282
def iterator = self.iterator dropWhile pred
8383
}
8484

85-
trait Zipped[B] extends Transformed[(A, B)] {
85+
trait ZippedI[B] extends TransformedI[(A, B)] {
8686
protected[this] val other: GenIterable[B]
8787
def iterator: Iterator[(A, B)] = self.iterator zip other.iterator
8888
final override protected[this] def viewIdentifier = "Z"
8989
}
9090

91-
trait ZippedAll[A1 >: A, B] extends Transformed[(A1, B)] {
91+
trait ZippedAllI[A1 >: A, B] extends TransformedI[(A1, B)] {
9292
protected[this] val other: GenIterable[B]
9393
protected[this] val thisElem: A1
9494
protected[this] val thatElem: B
@@ -97,33 +97,33 @@ trait IterableViewLike[+A,
9797
self.iterator.zipAll(other.iterator, thisElem, thatElem)
9898
}
9999

100-
private[this] implicit def asThis(xs: Transformed[A]): This = xs.asInstanceOf[This]
100+
private[this] implicit def asThis(xs: TransformedI[A]): This = xs.asInstanceOf[This]
101101

102102
/** Boilerplate method, to override in each subclass
103103
* This method could be eliminated if Scala had virtual classes
104104
*/
105-
protected def newZipped[B](that: GenIterable[B]): Transformed[(A, B)] = new { val other = that } with AbstractTransformed[(A, B)] with Zipped[B]
106-
protected def newZippedAll[A1 >: A, B](that: GenIterable[B], _thisElem: A1, _thatElem: B): Transformed[(A1, B)] = new {
107-
val other: GenIterable[B] = that
108-
val thisElem = _thisElem
109-
val thatElem = _thatElem
110-
} with AbstractTransformed[(A1, B)] with ZippedAll[A1, B]
111-
protected override def newForced[B](xs: => GenSeq[B]): Transformed[B] = new { val forced = xs } with AbstractTransformed[B] with Forced[B]
112-
protected override def newAppended[B >: A](that: GenTraversable[B]): Transformed[B] = new { val rest = that } with AbstractTransformed[B] with Appended[B]
113-
protected override def newMapped[B](f: A => B): Transformed[B] = new { val mapping = f } with AbstractTransformed[B] with Mapped[B]
114-
protected override def newFlatMapped[B](f: A => GenTraversableOnce[B]): Transformed[B] = new { val mapping = f } with AbstractTransformed[B] with FlatMapped[B]
115-
protected override def newFiltered(p: A => Boolean): Transformed[A] = new { val pred = p } with AbstractTransformed[A] with Filtered
116-
protected override def newSliced(_endpoints: SliceInterval): Transformed[A] = new { val endpoints = _endpoints } with AbstractTransformed[A] with Sliced
117-
protected override def newDroppedWhile(p: A => Boolean): Transformed[A] = new { val pred = p } with AbstractTransformed[A] with DroppedWhile
118-
protected override def newTakenWhile(p: A => Boolean): Transformed[A] = new { val pred = p } with AbstractTransformed[A] with TakenWhile
105+
protected def newZipped[B](that: GenIterable[B]): TransformedI[(A, B)] = new AbstractTransformedI[(A, B)] with ZippedI[B] { lazy val other = that }
106+
protected def newZippedAll[A1 >: A, B](that: GenIterable[B], _thisElem: A1, _thatElem: B): TransformedI[(A1, B)] = new AbstractTransformedI[(A1, B)] with ZippedAllI[A1, B] {
107+
lazy val other: GenIterable[B] = that
108+
lazy val thisElem = _thisElem
109+
lazy val thatElem = _thatElem
110+
}
111+
protected override def newForced[B](xs: => GenSeq[B]): TransformedI[B] = new AbstractTransformedI[B] with ForcedI[B] { lazy val forced = xs }
112+
protected override def newAppended[B >: A](that: GenTraversable[B]): TransformedI[B] = new AbstractTransformedI[B] with AppendedI[B] { lazy val rest = that }
113+
protected override def newMapped[B](f: A => B): TransformedI[B] = new AbstractTransformedI[B] with MappedI[B] { lazy val mapping = f }
114+
protected override def newFlatMapped[B](f: A => GenTraversableOnce[B]): TransformedI[B] = new AbstractTransformedI[B] with FlatMappedI[B] { lazy val mapping = f }
115+
protected override def newFiltered(p: A => Boolean): TransformedI[A] = new AbstractTransformedI[A] with FilteredI { lazy val pred = p }
116+
protected override def newSliced(_endpoints: SliceInterval): TransformedI[A] = new AbstractTransformedI[A] with SlicedI { lazy val endpoints = _endpoints }
117+
protected override def newDroppedWhile(p: A => Boolean): TransformedI[A] = new AbstractTransformedI[A] with DroppedWhileI { lazy val pred = p }
118+
protected override def newTakenWhile(p: A => Boolean): TransformedI[A] = new AbstractTransformedI[A] with TakenWhileI { lazy val pred = p }
119119

120120
// After adding take and drop overrides to IterableLike, these overrides (which do nothing
121121
// but duplicate the implementation in TraversableViewLike) had to be added to prevent the
122122
// overrides in IterableLike from besting the overrides in TraversableViewLike when mixed
123123
// together in e.g. SeqViewLike. This is a suboptimal situation. Examples of failing tests
124124
// are run/bug2876 and run/viewtest.
125-
protected override def newTaken(n: Int): Transformed[A] = newSliced(SliceInterval(0, n))
126-
protected override def newDropped(n: Int): Transformed[A] = newSliced(SliceInterval(n, Int.MaxValue))
125+
protected override def newTaken(n: Int): TransformedI[A] = newSliced(SliceInterval(0, n))
126+
protected override def newDropped(n: Int): TransformedI[A] = newSliced(SliceInterval(n, Int.MaxValue))
127127
override def drop(n: Int): This = newDropped(n)
128128
override def take(n: Int): This = newTaken(n)
129129

src/library/scala/collection/SeqViewLike.scala

Lines changed: 40 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -34,25 +34,25 @@ trait SeqViewLike[+A,
3434
{ self =>
3535

3636
/** Explicit instantiation of the `Transformed` trait to reduce class file size in subclasses. */
37-
private[collection] abstract class AbstractTransformed[+B] extends Seq[B] with super[IterableViewLike].Transformed[B] with Transformed[B]
37+
private[collection] abstract class AbstractTransformedS[+B] extends Seq[B] with super[IterableViewLike].TransformedI[B] with TransformedS[B]
3838

39-
trait Transformed[+B] extends SeqView[B, Coll] with super.Transformed[B] {
39+
trait TransformedS[+B] extends SeqView[B, Coll] with super.TransformedI[B] {
4040
def length: Int
4141
def apply(idx: Int): B
4242
override def toString = viewToString
4343
}
4444

45-
trait EmptyView extends Transformed[Nothing] with super.EmptyView {
45+
trait EmptyViewS extends TransformedS[Nothing] with super.EmptyViewI {
4646
final override def length = 0
4747
final override def apply(n: Int) = Nil(n)
4848
}
4949

50-
trait Forced[B] extends super.Forced[B] with Transformed[B] {
50+
trait ForcedS[B] extends super.ForcedI[B] with TransformedS[B] {
5151
def length = forced.length
5252
def apply(idx: Int) = forced.apply(idx)
5353
}
5454

55-
trait Sliced extends super.Sliced with Transformed[A] {
55+
trait SlicedS extends super.SlicedI with TransformedS[A] {
5656
def length = iterator.size
5757
def apply(idx: Int): A =
5858
if (idx >= 0 && idx + from < until) self.apply(idx + from)
@@ -62,12 +62,12 @@ trait SeqViewLike[+A,
6262
override def iterator: Iterator[A] = self.iterator drop from take endpoints.width
6363
}
6464

65-
trait Mapped[B] extends super.Mapped[B] with Transformed[B] {
65+
trait MappedS[B] extends super.MappedI[B] with TransformedS[B] {
6666
def length = self.length
6767
def apply(idx: Int): B = mapping(self(idx))
6868
}
6969

70-
trait FlatMapped[B] extends super.FlatMapped[B] with Transformed[B] {
70+
trait FlatMappedS[B] extends super.FlatMappedI[B] with TransformedS[B] {
7171
protected[this] lazy val index = {
7272
val index = new Array[Int](self.length + 1)
7373
index(0) = 0
@@ -89,14 +89,14 @@ trait SeqViewLike[+A,
8989
}
9090
}
9191

92-
trait Appended[B >: A] extends super.Appended[B] with Transformed[B] {
92+
trait AppendedS[B >: A] extends super.AppendedI[B] with TransformedS[B] {
9393
protected[this] lazy val restSeq = rest.toSeq
9494
def length = self.length + restSeq.length
9595
def apply(idx: Int) =
9696
if (idx < self.length) self(idx) else restSeq(idx - self.length)
9797
}
9898

99-
trait Filtered extends super.Filtered with Transformed[A] {
99+
trait FilteredS extends super.FilteredI with TransformedS[A] {
100100
protected[this] lazy val index = {
101101
var len = 0
102102
val arr = new Array[Int](self.length)
@@ -111,38 +111,38 @@ trait SeqViewLike[+A,
111111
def apply(idx: Int) = self(index(idx))
112112
}
113113

114-
trait TakenWhile extends super.TakenWhile with Transformed[A] {
114+
trait TakenWhileS extends super.TakenWhileI with TransformedS[A] {
115115
protected[this] lazy val len = self prefixLength pred
116116
def length = len
117117
def apply(idx: Int) =
118118
if (idx < len) self(idx)
119119
else throw new IndexOutOfBoundsException(idx.toString)
120120
}
121121

122-
trait DroppedWhile extends super.DroppedWhile with Transformed[A] {
122+
trait DroppedWhileS extends super.DroppedWhileI with TransformedS[A] {
123123
protected[this] lazy val start = self prefixLength pred
124124
def length = self.length - start
125125
def apply(idx: Int) =
126126
if (idx >= 0) self(idx + start)
127127
else throw new IndexOutOfBoundsException(idx.toString)
128128
}
129129

130-
trait Zipped[B] extends super.Zipped[B] with Transformed[(A, B)] {
130+
trait ZippedS[B] extends super.ZippedI[B] with TransformedS[(A, B)] {
131131
protected[this] lazy val thatSeq = other.seq.toSeq
132132
/* Have to be careful here - other may be an infinite sequence. */
133133
def length = if ((thatSeq lengthCompare self.length) <= 0) thatSeq.length else self.length
134134
def apply(idx: Int) = (self.apply(idx), thatSeq.apply(idx))
135135
}
136136

137-
trait ZippedAll[A1 >: A, B] extends super.ZippedAll[A1, B] with Transformed[(A1, B)] {
137+
trait ZippedAllS[A1 >: A, B] extends super.ZippedAllI[A1, B] with TransformedS[(A1, B)] {
138138
protected[this] lazy val thatSeq = other.seq.toSeq
139139
def length: Int = self.length max thatSeq.length
140140
def apply(idx: Int) =
141141
(if (idx < self.length) self.apply(idx) else thisElem,
142142
if (idx < thatSeq.length) thatSeq.apply(idx) else thatElem)
143143
}
144144

145-
trait Reversed extends Transformed[A] {
145+
trait ReversedS extends TransformedS[A] {
146146
override def iterator: Iterator[A] = createReversedIterator
147147
def length: Int = self.length
148148
def apply(idx: Int): A = self.apply(length - 1 - idx)
@@ -158,7 +158,7 @@ trait SeqViewLike[+A,
158158
// Note--for this to work, must ensure 0 <= from and 0 <= replaced
159159
// Must also take care to allow patching inside an infinite stream
160160
// (patching in an infinite stream is not okay)
161-
trait Patched[B >: A] extends Transformed[B] {
161+
trait PatchedS[B >: A] extends TransformedS[B] {
162162
protected[this] val from: Int
163163
protected[this] val patch: GenSeq[B]
164164
protected[this] val replaced: Int
@@ -179,7 +179,7 @@ trait SeqViewLike[+A,
179179
final override protected[this] def viewIdentifier = "P"
180180
}
181181

182-
trait Prepended[B >: A] extends Transformed[B] {
182+
trait PrependedS[B >: A] extends TransformedS[B] {
183183
protected[this] val fst: B
184184
override def iterator: Iterator[B] = Iterator.single(fst) ++ self.iterator
185185
def length: Int = 1 + self.length
@@ -192,31 +192,32 @@ trait SeqViewLike[+A,
192192
/** Boilerplate method, to override in each subclass
193193
* This method could be eliminated if Scala had virtual classes
194194
*/
195-
protected override def newForced[B](xs: => GenSeq[B]): Transformed[B] = new { val forced = xs } with AbstractTransformed[B] with Forced[B]
196-
protected override def newAppended[B >: A](that: GenTraversable[B]): Transformed[B] = new { val rest = that } with AbstractTransformed[B] with Appended[B]
197-
protected override def newMapped[B](f: A => B): Transformed[B] = new { val mapping = f } with AbstractTransformed[B] with Mapped[B]
198-
protected override def newFlatMapped[B](f: A => GenTraversableOnce[B]): Transformed[B] = new { val mapping = f } with AbstractTransformed[B] with FlatMapped[B]
199-
protected override def newFiltered(p: A => Boolean): Transformed[A] = new { val pred = p } with AbstractTransformed[A] with Filtered
200-
protected override def newSliced(_endpoints: SliceInterval): Transformed[A] = new { val endpoints = _endpoints } with AbstractTransformed[A] with Sliced
201-
protected override def newDroppedWhile(p: A => Boolean): Transformed[A] = new { val pred = p } with AbstractTransformed[A] with DroppedWhile
202-
protected override def newTakenWhile(p: A => Boolean): Transformed[A] = new { val pred = p } with AbstractTransformed[A] with TakenWhile
203-
protected override def newZipped[B](that: GenIterable[B]): Transformed[(A, B)] = new { val other = that } with AbstractTransformed[(A, B)] with Zipped[B]
204-
protected override def newZippedAll[A1 >: A, B](that: GenIterable[B], _thisElem: A1, _thatElem: B): Transformed[(A1, B)] = new {
205-
val other = that
206-
val thisElem = _thisElem
207-
val thatElem = _thatElem
208-
} with AbstractTransformed[(A1, B)] with ZippedAll[A1, B]
209-
protected def newReversed: Transformed[A] = new AbstractTransformed[A] with Reversed
210-
protected def newPatched[B >: A](_from: Int, _patch: GenSeq[B], _replaced: Int): Transformed[B] = new {
211-
val from = _from
212-
val patch = _patch
213-
val replaced = _replaced
214-
} with AbstractTransformed[B] with Patched[B]
215-
protected def newPrepended[B >: A](elem: B): Transformed[B] = new { protected[this] val fst = elem } with AbstractTransformed[B] with Prepended[B]
195+
protected override def newForced[B](xs: => GenSeq[B]): TransformedS[B] = new AbstractTransformedS[B] with ForcedS[B] { lazy val forced = xs }
196+
protected override def newAppended[B >: A](that: GenTraversable[B]): TransformedS[B] = new AbstractTransformedS[B] with AppendedS[B] { lazy val rest = that }
197+
protected override def newMapped[B](f: A => B): TransformedS[B] = new AbstractTransformedS[B] with MappedS[B] { lazy val mapping = f }
198+
protected override def newFlatMapped[B](f: A => GenTraversableOnce[B]): TransformedS[B] = new AbstractTransformedS[B] with FlatMappedS[B] { lazy val mapping = f }
199+
protected override def newFiltered(p: A => Boolean): TransformedS[A] = new AbstractTransformedS[A] with FilteredS { lazy val pred = p }
200+
protected override def newSliced(_endpoints: SliceInterval): TransformedS[A] = new AbstractTransformedS[A] with SlicedS { lazy val endpoints = _endpoints }
201+
protected override def newDroppedWhile(p: A => Boolean): TransformedS[A] = new AbstractTransformedS[A] with DroppedWhileS { lazy val pred = p }
202+
protected override def newTakenWhile(p: A => Boolean): TransformedS[A] = new AbstractTransformedS[A] with TakenWhileS { lazy val pred = p }
203+
protected override def newZipped[B](that: GenIterable[B]): TransformedS[(A, B)] = new AbstractTransformedS[(A, B)] with ZippedS[B] { lazy val other = that }
204+
protected override def newZippedAll[A1 >: A, B](that: GenIterable[B], _thisElem: A1, _thatElem: B): TransformedS[(A1, B)] = new AbstractTransformedS[(A1, B)] with ZippedAllS[A1, B] {
205+
lazy val other = that
206+
lazy val thisElem = _thisElem
207+
lazy val thatElem = _thatElem
208+
}
209+
protected def newReversed: TransformedS[A] = new AbstractTransformedS[A] with ReversedS
210+
protected def newPatched[B >: A](_from: Int, _patch: GenSeq[B], _replaced: Int): TransformedS[B] = new AbstractTransformedS[B] with PatchedS[B] {
211+
lazy val from = _from
212+
lazy val patch = _patch
213+
lazy val replaced = _replaced
214+
}
215+
216+
protected def newPrepended[B >: A](elem: B): TransformedS[B] = new AbstractTransformedS[B] with PrependedS[B] { lazy protected[this] val fst = elem }
216217

217218
// see comment in IterableViewLike.
218-
protected override def newTaken(n: Int): Transformed[A] = newSliced(SliceInterval(0, n))
219-
protected override def newDropped(n: Int): Transformed[A] = newSliced(SliceInterval(n, Int.MaxValue))
219+
protected override def newTaken(n: Int): TransformedS[A] = newSliced(SliceInterval(0, n))
220+
protected override def newDropped(n: Int): TransformedS[A] = newSliced(SliceInterval(n, Int.MaxValue))
220221

221222
override def reverse: This = newReversed.asInstanceOf[This]
222223

0 commit comments

Comments
 (0)