From a3c413084cccde5c7a3dec510971f9ef8fbf628f Mon Sep 17 00:00:00 2001 From: Paul Phillips Date: Mon, 24 May 2010 22:25:31 +0000 Subject: Brought the *Proxy classes more up to date. --- .../scala/collection/IterableProxyLike.scala | 8 +++----- src/library/scala/collection/MapProxyLike.scala | 19 ++++++++----------- src/library/scala/collection/SeqProxyLike.scala | 2 ++ src/library/scala/collection/SetProxyLike.scala | 5 +++-- .../scala/collection/TraversableProxyLike.scala | 22 ++++++---------------- .../scala/collection/immutable/MapProxy.scala | 10 ++++------ .../scala/collection/immutable/SetProxy.scala | 3 +-- .../scala/collection/mutable/MapProxy.scala | 6 +++--- .../scala/collection/mutable/SetProxy.scala | 3 +-- test/files/pos/bug2939.scala | 13 +++++++++++++ 10 files changed, 44 insertions(+), 47 deletions(-) create mode 100644 test/files/pos/bug2939.scala diff --git a/src/library/scala/collection/IterableProxyLike.scala b/src/library/scala/collection/IterableProxyLike.scala index a3166dfe64..6193d30cba 100644 --- a/src/library/scala/collection/IterableProxyLike.scala +++ b/src/library/scala/collection/IterableProxyLike.scala @@ -15,9 +15,8 @@ import mutable.Buffer // Methods could be printed by cat IterableLike.scala | egrep '^ (override )?def' - -/** This trait implements a proxy for iterable objects. It forwards - * all calls to a different iterable object +/** This trait implements a proxy for Iterable objects. It forwards + * all calls to a different Iterable object. * * @author Martin Odersky * @version 2.8 @@ -25,8 +24,7 @@ import mutable.Buffer */ trait IterableProxyLike[+A, +Repr <: IterableLike[A, Repr] with Iterable[A]] extends IterableLike[A, Repr] - with TraversableProxyLike[A, Repr] -{ + with TraversableProxyLike[A, Repr] { override def iterator: Iterator[A] = self.iterator override def grouped(size: Int): Iterator[Repr] = self.grouped(size) override def sliding[B >: A](size: Int): Iterator[Repr] = self.sliding(size) diff --git a/src/library/scala/collection/MapProxyLike.scala b/src/library/scala/collection/MapProxyLike.scala index f269a368dd..7ef1eb68ef 100644 --- a/src/library/scala/collection/MapProxyLike.scala +++ b/src/library/scala/collection/MapProxyLike.scala @@ -12,8 +12,8 @@ import generic._ // Methods could be printed by cat MapLike.scala | egrep '^ (override )?def' -/** This trait implements a proxy for iterable objects. It forwards - * all calls to a different iterable object +/** This trait implements a proxy for Map objects. It forwards + * all calls to a different Map object. * * @author Martin Odersky * @version 2.8 @@ -23,12 +23,10 @@ trait MapProxyLike[A, +B, +This <: MapLike[A, B, This] with Map[A, B]] extends MapLike[A, B, This] with IterableProxyLike[(A, B), This] { - // def empty: This - // def + [B1 >: B] (kv: (A, B1)): Map[A, B1] - // def - (key: A): This - override def get(key: A): Option[B] = self.get(key) override def iterator: Iterator[(A, B)] = self.iterator + override def + [B1 >: B] (kv: (A, B1)): Map[A, B1] = self.+(kv) + override def - (key: A): This = self.-(key) override def isEmpty: Boolean = self.isEmpty override def getOrElse[B1 >: B](key: A, default: => B1): B1 = self.getOrElse(key, default) override def apply(key: A): B = self.apply(key) @@ -42,11 +40,10 @@ trait MapProxyLike[A, +B, +This <: MapLike[A, B, This] with Map[A, B]] override def default(key: A): B = self.default(key) override def filterKeys(p: A => Boolean) = self.filterKeys(p) override def mapValues[C](f: B => C) = self.mapValues(f) - - // override def updated [B1 >: B](key: A, value: B1) = self + ((key, value)) - // override def + [B1 >: B](elem1: (A, B1), elem2: (A, B1), elems: (A, B1) *) = self.+(elem1, elem2, elems: _*) - // override def ++[B1 >: B](elems: Traversable[(A, B1)]) = self.++(elems) - // override def ++[B1 >: B](iter: Iterator[(A, B1)]) = self.++(iter) + override def updated [B1 >: B](key: A, value: B1): Map[A, B1] = self.updated(key, value) + override def + [B1 >: B] (kv1: (A, B1), kv2: (A, B1), kvs: (A, B1) *): Map[A, B1] = self.+(kv1, kv2, kvs: _*) + override def ++[B1 >: B](xs: TraversableOnce[(A, B1)]): Map[A, B1] = self.++(xs) + override def filterNot(p: ((A, B)) => Boolean) = self filterNot p override def addString(b: StringBuilder, start: String, sep: String, end: String): StringBuilder = self.addString(b, start, sep, end) diff --git a/src/library/scala/collection/SeqProxyLike.scala b/src/library/scala/collection/SeqProxyLike.scala index 5e18130501..c3095c8516 100644 --- a/src/library/scala/collection/SeqProxyLike.scala +++ b/src/library/scala/collection/SeqProxyLike.scala @@ -23,6 +23,8 @@ import generic._ * @since 2.8 */ trait SeqProxyLike[+A, +Repr <: SeqLike[A, Repr] with Seq[A]] extends SeqLike[A, Repr] with IterableProxyLike[A, Repr] { + override def size = self.size + override def toSeq: Seq[A] = self.toSeq override def length: Int = self.length override def apply(idx: Int): A = self.apply(idx) override def lengthCompare(len: Int): Int = self.lengthCompare(len) diff --git a/src/library/scala/collection/SetProxyLike.scala b/src/library/scala/collection/SetProxyLike.scala index 76d2c31b99..cf7f3b845c 100644 --- a/src/library/scala/collection/SetProxyLike.scala +++ b/src/library/scala/collection/SetProxyLike.scala @@ -21,10 +21,11 @@ import generic._ */ trait SetProxyLike[A, +This <: SetLike[A, This] with Set[A]] extends SetLike[A, This] with IterableProxyLike[A, This] { + def empty: This // def empty: This - // def + (elem: A): This - // def - (elem: A): This override def contains(elem: A): Boolean = self.contains(elem) + override def + (elem: A) = self.+(elem) + override def - (elem: A) = self.-(elem) override def isEmpty: Boolean = self.isEmpty override def apply(elem: A): Boolean = self.apply(elem) override def intersect(that: Set[A]) = self.intersect(that) diff --git a/src/library/scala/collection/TraversableProxyLike.scala b/src/library/scala/collection/TraversableProxyLike.scala index 198ba6e3fe..5344a01e72 100644 --- a/src/library/scala/collection/TraversableProxyLike.scala +++ b/src/library/scala/collection/TraversableProxyLike.scala @@ -15,9 +15,8 @@ import mutable.{Buffer, StringBuilder} // Methods could be printed by cat TraversableLike.scala | egrep '^ (override )?def' - -/** This trait implements a proxy for traversable objects. It forwards - * all calls to a different traversable object. +/** This trait implements a proxy for Traversable objects. It forwards + * all calls to a different Traversable object. * * @author Martin Odersky * @version 2.8 @@ -82,6 +81,8 @@ trait TraversableProxyLike[+A, +Repr <: TraversableLike[A, Repr] with Traversabl override def toStream: Stream[A] = self.toStream override def toSet[B >: A]: immutable.Set[B] = self.toSet override def toMap[T, U](implicit ev: A <:< (T, U)): immutable.Map[T, U] = self.toMap(ev) + override def toTraversable: Traversable[A] = self.toTraversable + override def toIterator: Iterator[A] = self.toIterator override def mkString(start: String, sep: String, end: String): String = self.mkString(start, sep, end) override def mkString(sep: String): String = self.mkString(sep) override def mkString: String = self.mkString @@ -91,17 +92,6 @@ trait TraversableProxyLike[+A, +Repr <: TraversableLike[A, Repr] with Traversabl override def stringPrefix : String = self.stringPrefix override def view = self.view override def view(from: Int, until: Int): TraversableView[A, Repr] = self.view(from, until) + // This appears difficult to override due to the type of WithFilter. + // override def withFilter(p: A => Boolean): WithFilter = self.withFilter(p) } - -/** Martin to Paul: I'm not sure what the purpose of this class is? I assume it was to make - * sure that TraversableProxyLike has all Traversable methods, but it fails at that - * -private class TraversableProxyLikeConfirmation[+A, +Repr <: TraversableLike[A, Repr] with Traversable[A]] - extends TraversableProxyLike[A, Traversable[A]] - with interfaces.TraversableMethods[A, Traversable[A]] -{ - def self: Repr = repr.asInstanceOf[Repr] - protected[this] def newBuilder = scala.collection.Traversable.newBuilder[A] - // : Builder[A, Repr] -} -*/ diff --git a/src/library/scala/collection/immutable/MapProxy.scala b/src/library/scala/collection/immutable/MapProxy.scala index f2a29906ff..fa0b097070 100644 --- a/src/library/scala/collection/immutable/MapProxy.scala +++ b/src/library/scala/collection/immutable/MapProxy.scala @@ -22,8 +22,7 @@ package immutable * @version 2.0, 31/12/2006 * @since 2.8 */ -trait MapProxy[A, +B] extends Map[A, B] with MapProxyLike[A, B, Map[A, B]] -{ +trait MapProxy[A, +B] extends Map[A, B] with MapProxyLike[A, B, Map[A, B]] { override def repr = this private def newProxy[B1 >: B](newSelf: Map[A, B1]): MapProxy[A, B1] = new MapProxy[A, B1] { val self = newSelf } @@ -31,11 +30,10 @@ trait MapProxy[A, +B] extends Map[A, B] with MapProxyLike[A, B, Map[A, B]] override def empty = newProxy(self.empty) override def updated [B1 >: B](key: A, value: B1) = newProxy(self.updated(key, value)) - override def + [B1 >: B](kv: (A, B1)): Map[A, B1] = newProxy(self + kv) - override def + [B1 >: B](elem1: (A, B1), elem2: (A, B1), elems: (A, B1) *) = - newProxy(self.+(elem1, elem2, elems: _*)) - override def -(key: A) = newProxy(self - key) + override def + [B1 >: B](kv: (A, B1)): Map[A, B1] = newProxy(self + kv) + override def + [B1 >: B](elem1: (A, B1), elem2: (A, B1), elems: (A, B1) *) = newProxy(self.+(elem1, elem2, elems: _*)) + override def ++[B1 >: B](xs: TraversableOnce[(A, B1)]) = newProxy(self ++ xs) override def filterKeys(p: A => Boolean) = self.filterKeys(p) override def mapValues[C](f: B => C) = self.mapValues(f) diff --git a/src/library/scala/collection/immutable/SetProxy.scala b/src/library/scala/collection/immutable/SetProxy.scala index 854178955a..3c285b2c81 100644 --- a/src/library/scala/collection/immutable/SetProxy.scala +++ b/src/library/scala/collection/immutable/SetProxy.scala @@ -21,8 +21,7 @@ package immutable * * @since 2.8 */ -trait SetProxy[A] extends Set[A] with SetProxyLike[A, Set[A]] -{ +trait SetProxy[A] extends Set[A] with SetProxyLike[A, Set[A]] { override def repr = this private def newProxy[B >: A](newSelf: Set[B]): SetProxy[B] = new SetProxy[B] { val self = newSelf } diff --git a/src/library/scala/collection/mutable/MapProxy.scala b/src/library/scala/collection/mutable/MapProxy.scala index c5482db97c..c39d14b52e 100644 --- a/src/library/scala/collection/mutable/MapProxy.scala +++ b/src/library/scala/collection/mutable/MapProxy.scala @@ -22,17 +22,17 @@ package mutable * @version 2.0, 31/12/2006 * @since 1 */ -trait MapProxy[A, B] extends Map[A, B] with MapProxyLike[A, B, Map[A, B]] -{ +trait MapProxy[A, B] extends Map[A, B] with MapProxyLike[A, B, Map[A, B]] { private def newProxy[B1 >: B](newSelf: Map[A, B1]): MapProxy[A, B1] = new MapProxy[A, B1] { val self = newSelf } override def repr = this override def empty: MapProxy[A, B] = new MapProxy[A, B] { val self = MapProxy.this.self.empty } + override def updated [B1 >: B](key: A, value: B1) = newProxy(self.updated(key, value)) override def + [B1 >: B] (kv: (A, B1)): Map[A, B1] = newProxy(self + kv) override def + [B1 >: B] (elem1: (A, B1), elem2: (A, B1), elems: (A, B1) *) = newProxy(self.+(elem1, elem2, elems: _*)) - + override def ++[B1 >: B](xs: TraversableOnce[(A, B1)]) = newProxy(self ++ xs) override def -(key: A) = newProxy(self - key) override def += (kv: (A, B)) = { self += kv ; this } diff --git a/src/library/scala/collection/mutable/SetProxy.scala b/src/library/scala/collection/mutable/SetProxy.scala index 1fb0c18940..b1a6c48ffd 100644 --- a/src/library/scala/collection/mutable/SetProxy.scala +++ b/src/library/scala/collection/mutable/SetProxy.scala @@ -19,8 +19,7 @@ package mutable * @version 1.1, 09/05/2004 * @since 1 */ -trait SetProxy[A] extends Set[A] with SetProxyLike[A, Set[A]] -{ +trait SetProxy[A] extends Set[A] with SetProxyLike[A, Set[A]] { override def repr = this override def empty = new SetProxy[A] { val self = SetProxy.this.self.empty } override def + (elem: A) = { self += elem ; this } diff --git a/test/files/pos/bug2939.scala b/test/files/pos/bug2939.scala new file mode 100644 index 0000000000..3be4d4d561 --- /dev/null +++ b/test/files/pos/bug2939.scala @@ -0,0 +1,13 @@ +import collection._ + +object Proxies { + class C1 extends MapProxy[Int,Int] { def self = Map[Int,Int]() } + class C2 extends mutable.MapProxy[Int,Int] { def self = mutable.Map[Int,Int]() } + class C3 extends immutable.MapProxy[Int,Int] { def self = immutable.Map[Int,Int]() } + + class C4 extends SetProxy[Int] { def self = Set[Int]() } + class C5 extends mutable.SetProxy[Int] { def self = mutable.Set[Int]() } + class C6 extends immutable.SetProxy[Int] { def self = immutable.Set[Int]() } + + class C7 extends SeqProxy[Int] { def self = Seq[Int]() } +} \ No newline at end of file -- cgit v1.2.3