summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Phillips <paulp@improving.org>2010-05-24 22:25:31 +0000
committerPaul Phillips <paulp@improving.org>2010-05-24 22:25:31 +0000
commita3c413084cccde5c7a3dec510971f9ef8fbf628f (patch)
treeda6fbb5fbffb0842f3ee092abf2f94ccf55ed18a
parent67a650205b9f18f58063883dc6150009f8bdaae3 (diff)
downloadscala-a3c413084cccde5c7a3dec510971f9ef8fbf628f.tar.gz
scala-a3c413084cccde5c7a3dec510971f9ef8fbf628f.tar.bz2
scala-a3c413084cccde5c7a3dec510971f9ef8fbf628f.zip
Brought the *Proxy classes more up to date.
-rw-r--r--src/library/scala/collection/IterableProxyLike.scala8
-rw-r--r--src/library/scala/collection/MapProxyLike.scala19
-rw-r--r--src/library/scala/collection/SeqProxyLike.scala2
-rw-r--r--src/library/scala/collection/SetProxyLike.scala5
-rw-r--r--src/library/scala/collection/TraversableProxyLike.scala22
-rw-r--r--src/library/scala/collection/immutable/MapProxy.scala10
-rw-r--r--src/library/scala/collection/immutable/SetProxy.scala3
-rw-r--r--src/library/scala/collection/mutable/MapProxy.scala6
-rw-r--r--src/library/scala/collection/mutable/SetProxy.scala3
-rw-r--r--test/files/pos/bug2939.scala13
10 files changed, 44 insertions, 47 deletions
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