From 106180d020d3436b29432235fffe098d15fa7422 Mon Sep 17 00:00:00 2001 From: Paul Phillips Date: Mon, 7 Nov 2011 18:22:56 +0000 Subject: Third collections commit from Todd Vierling. Misc cleanups associated with the previous commits: limiting overly expanded types, fixing externally visible types for scaladoc, utilizing abstract collection classes where possible, etc. --- src/dbc/scala/dbc/result/Relation.scala | 6 ++++-- src/library/scala/collection/Iterable.scala | 2 +- src/library/scala/collection/Iterator.scala | 7 +++++-- src/library/scala/collection/JavaConversions.scala | 15 +++------------ src/library/scala/collection/MapLike.scala | 4 ++-- src/library/scala/collection/Seq.scala | 2 +- src/library/scala/collection/Traversable.scala | 2 +- src/library/scala/collection/immutable/ListMap.scala | 2 +- src/library/scala/collection/mutable/History.scala | 6 +++++- src/library/scala/io/Source.scala | 2 +- src/library/scala/sys/SystemProperties.scala | 5 ++++- src/library/scala/util/parsing/ast/Binders.scala | 3 ++- src/library/scala/xml/MetaData.scala | 9 +++++++-- src/library/scala/xml/pull/XMLEventReader.scala | 5 ++++- 14 files changed, 41 insertions(+), 29 deletions(-) (limited to 'src') diff --git a/src/dbc/scala/dbc/result/Relation.scala b/src/dbc/scala/dbc/result/Relation.scala index 4897cd1030..98d653d61e 100644 --- a/src/dbc/scala/dbc/result/Relation.scala +++ b/src/dbc/scala/dbc/result/Relation.scala @@ -14,7 +14,9 @@ package result /** An ISO-9075:2003 (SQL) table. This is equivalent to a relation in the * relational model. */ -@deprecated(DbcIsDeprecated, "2.9.0") abstract class Relation extends AnyRef with Iterable[Tuple] { +@deprecated(DbcIsDeprecated, "2.9.0") abstract class Relation +extends collection.AbstractIterable[Tuple] + with Iterable[Tuple] { /** The statement that generated this relation. */ def statement: scala.dbc.statement.Relation @@ -56,7 +58,7 @@ package result *

Caution

A Relation only has one single iterator, due to limitations * in DBMS. This means that if this method is called multiple times, all returned * iterators will share the same state. */ - def iterator: Iterator[Tuple] = new Iterator[Tuple] { + def iterator: Iterator[Tuple] = new collection.AbstractIterator[Tuple] { protected val result: java.sql.ResultSet = Relation.this.sqlResult def hasNext: Boolean = resultNext private var resultNext = result.next() diff --git a/src/library/scala/collection/Iterable.scala b/src/library/scala/collection/Iterable.scala index 50558d5a9f..b1752a5c67 100644 --- a/src/library/scala/collection/Iterable.scala +++ b/src/library/scala/collection/Iterable.scala @@ -51,4 +51,4 @@ object Iterable extends TraversableFactory[Iterable] { } /** Explicit instantiation of the `Iterable` trait to reduce class file size in subclasses. */ -private[scala] abstract class AbstractIterable[+T] extends AbstractTraversable[T] with Iterable[T] +private[scala] abstract class AbstractIterable[+A] extends AbstractTraversable[A] with Iterable[A] diff --git a/src/library/scala/collection/Iterator.scala b/src/library/scala/collection/Iterator.scala index b56a83043d..7b780ba2e4 100644 --- a/src/library/scala/collection/Iterator.scala +++ b/src/library/scala/collection/Iterator.scala @@ -822,7 +822,10 @@ trait Iterator[+A] extends TraversableOnce[A] { * * Typical uses can be achieved via methods `grouped` and `sliding`. */ - class GroupedIterator[B >: A](self: Iterator[A], size: Int, step: Int) extends AbstractIterator[Seq[B]] { + class GroupedIterator[B >: A](self: Iterator[A], size: Int, step: Int) + extends AbstractIterator[Seq[B]] + with Iterator[Seq[B]] { + require(size >= 1 && step >= 1, "size=%d and step=%d, but both must be positive".format(size, step)) private[this] var buffer: ArrayBuffer[B] = ArrayBuffer() // the buffer @@ -1109,4 +1112,4 @@ trait Iterator[+A] extends TraversableOnce[A] { } /** Explicit instantiation of the `Iterator` trait to reduce class file size in subclasses. */ -private[scala] abstract class AbstractIterator[+T] extends Iterator[T] +private[scala] abstract class AbstractIterator[+A] extends Iterator[A] diff --git a/src/library/scala/collection/JavaConversions.scala b/src/library/scala/collection/JavaConversions.scala index d911a16d02..d5011fc6aa 100644 --- a/src/library/scala/collection/JavaConversions.scala +++ b/src/library/scala/collection/JavaConversions.scala @@ -761,10 +761,7 @@ object JavaConversions { } case class JMapWrapper[A, B](val underlying : ju.Map[A, B]) - extends mutable.AbstractMap[A, B] - with mutable.Map[A, B] - with JMapWrapperLike[A, B, JMapWrapper[A, B]] { - + extends mutable.AbstractMap[A, B] with JMapWrapperLike[A, B, JMapWrapper[A, B]] { override def empty = JMapWrapper(new ju.HashMap[A, B]) } @@ -792,11 +789,7 @@ object JavaConversions { } case class JConcurrentMapWrapper[A, B](val underlying: juc.ConcurrentMap[A, B]) - extends mutable.AbstractMap[A, B] - with mutable.Map[A, B] - with JMapWrapperLike[A, B, JConcurrentMapWrapper[A, B]] - with mutable.ConcurrentMap[A, B] { - + extends mutable.AbstractMap[A, B] with JMapWrapperLike[A, B, JConcurrentMapWrapper[A, B]] with mutable.ConcurrentMap[A, B] { override def get(k: A) = { val v = underlying get k if (v != null) Some(v) @@ -850,9 +843,7 @@ object JavaConversions { } case class JDictionaryWrapper[A, B](underlying: ju.Dictionary[A, B]) - extends mutable.AbstractMap[A, B] - with mutable.Map[A, B] { - + extends mutable.AbstractMap[A, B] with mutable.Map[A, B] { override def size: Int = underlying.size def get(k: A) = { diff --git a/src/library/scala/collection/MapLike.scala b/src/library/scala/collection/MapLike.scala index 3485fe1be6..1653a011d6 100644 --- a/src/library/scala/collection/MapLike.scala +++ b/src/library/scala/collection/MapLike.scala @@ -159,7 +159,7 @@ self => /** The implementation class of the set returned by `keySet`. */ - protected class DefaultKeySet extends AbstractSet[A] { + protected class DefaultKeySet extends AbstractSet[A] with Set[A] { def contains(key : A) = self.contains(key) def iterator = keysIterator def + (elem: A): Set[A] = (Set[A]() ++ this + elem).asInstanceOf[Set[A]] // !!! concrete overrides abstract problem @@ -194,7 +194,7 @@ self => /** The implementation class of the iterable returned by `values`. */ - protected class DefaultValuesIterable extends AbstractIterable[B] { + protected class DefaultValuesIterable extends AbstractIterable[B] with Iterable[B] { def iterator = valuesIterator override def size = self.size override def foreach[C](f: B => C) = self.valuesIterator foreach f diff --git a/src/library/scala/collection/Seq.scala b/src/library/scala/collection/Seq.scala index 3be3ca0204..cb3fe5ca71 100644 --- a/src/library/scala/collection/Seq.scala +++ b/src/library/scala/collection/Seq.scala @@ -42,4 +42,4 @@ object Seq extends SeqFactory[Seq] { } /** Explicit instantiation of the `Seq` trait to reduce class file size in subclasses. */ -private[scala] abstract class AbstractSeq[+T] extends AbstractIterable[T] with Seq[T] +private[scala] abstract class AbstractSeq[+A] extends AbstractIterable[A] with Seq[A] diff --git a/src/library/scala/collection/Traversable.scala b/src/library/scala/collection/Traversable.scala index 014586b3af..3fba3dfa79 100644 --- a/src/library/scala/collection/Traversable.scala +++ b/src/library/scala/collection/Traversable.scala @@ -109,4 +109,4 @@ object Traversable extends TraversableFactory[Traversable] { self => } /** Explicit instantiation of the `Traversable` trait to reduce class file size in subclasses. */ -private[scala] abstract class AbstractTraversable[+T] extends Traversable[T] +private[scala] abstract class AbstractTraversable[+A] extends Traversable[A] diff --git a/src/library/scala/collection/immutable/ListMap.scala b/src/library/scala/collection/immutable/ListMap.scala index 3b7da3259e..b2b933c51a 100644 --- a/src/library/scala/collection/immutable/ListMap.scala +++ b/src/library/scala/collection/immutable/ListMap.scala @@ -49,7 +49,7 @@ class ListMap[A, +B] extends AbstractMap[A, B] with Map[A, B] with MapLike[A, B, ListMap[A, B]] - with Serializable { + with Serializable { override def empty = ListMap.empty diff --git a/src/library/scala/collection/mutable/History.scala b/src/library/scala/collection/mutable/History.scala index 0c3b762bd9..c1d94a904c 100644 --- a/src/library/scala/collection/mutable/History.scala +++ b/src/library/scala/collection/mutable/History.scala @@ -25,7 +25,11 @@ package mutable * @tparam Pub Type of publishers. */ @SerialVersionUID(5219213543849892588L) -class History[Evt, Pub] extends AbstractIterable[(Pub, Evt)] with Subscriber[Evt, Pub] with Serializable +class History[Evt, Pub] +extends AbstractIterable[(Pub, Evt)] + with Subscriber[Evt, Pub] + with Iterable[(Pub, Evt)] + with Serializable { protected val log: Queue[(Pub, Evt)] = new Queue val maxHistory: Int = 1000 diff --git a/src/library/scala/io/Source.scala b/src/library/scala/io/Source.scala index e7bcc32558..3cee0ace79 100644 --- a/src/library/scala/io/Source.scala +++ b/src/library/scala/io/Source.scala @@ -190,7 +190,7 @@ abstract class Source extends Iterator[Char] { private def lineNum(line: Int): String = getLines() drop (line - 1) take 1 mkString - class LineIterator() extends AbstractIterator[String] { + class LineIterator extends AbstractIterator[String] with Iterator[String] { private[this] val sb = new StringBuilder lazy val iter: BufferedIterator[Char] = Source.this.iter.buffered diff --git a/src/library/scala/sys/SystemProperties.scala b/src/library/scala/sys/SystemProperties.scala index 25fd6e53a8..52e0ac230b 100644 --- a/src/library/scala/sys/SystemProperties.scala +++ b/src/library/scala/sys/SystemProperties.scala @@ -23,7 +23,10 @@ import java.security.AccessControlException * @version 2.9 * @since 2.9 */ -class SystemProperties extends mutable.Map[String, String] { +class SystemProperties +extends mutable.AbstractMap[String, String] + with mutable.Map[String, String] { + override def empty = new SystemProperties override def default(key: String): String = null diff --git a/src/library/scala/util/parsing/ast/Binders.scala b/src/library/scala/util/parsing/ast/Binders.scala index 8019306524..0646f57064 100644 --- a/src/library/scala/util/parsing/ast/Binders.scala +++ b/src/library/scala/util/parsing/ast/Binders.scala @@ -8,6 +8,7 @@ package scala.util.parsing.ast +import scala.collection.AbstractIterable import scala.collection.mutable //DISCLAIMER: this code is highly experimental! @@ -83,7 +84,7 @@ trait Binders extends AbstractSyntax with Mappable { * For example: `[x, y]!1` represents the scope with `id` `1` and binder elements `x` and `y`. * (`id` is solely used for this textual representation.) */ - class Scope[binderType <: NameElement] extends Iterable[binderType]{ + class Scope[binderType <: NameElement] extends AbstractIterable[binderType] with Iterable[binderType] { private val substitution: mutable.Map[binderType, Element] = new mutable.LinkedHashMap[binderType, Element] // a LinkedHashMap is ordered by insertion order -- important! diff --git a/src/library/scala/xml/MetaData.scala b/src/library/scala/xml/MetaData.scala index 54af0719d4..98e863eb37 100644 --- a/src/library/scala/xml/MetaData.scala +++ b/src/library/scala/xml/MetaData.scala @@ -10,7 +10,7 @@ package scala.xml import Utility.sbToString import annotation.tailrec -import scala.collection.Iterator +import scala.collection.{ AbstractIterable, Iterator } /** * Copyright 2008 Google Inc. All Rights Reserved. @@ -72,7 +72,12 @@ object MetaData { * Copyright 2008 Google Inc. All Rights Reserved. * @author Burak Emir */ -abstract class MetaData extends Iterable[MetaData] with Equality with Serializable { +abstract class MetaData +extends AbstractIterable[MetaData] + with Iterable[MetaData] + with Equality + with Serializable { + /** Updates this MetaData with the MetaData given as argument. All attributes that occur in updates * are part of the resulting MetaData. If an attribute occurs in both this instance and * updates, only the one in updates is part of the result (avoiding duplicates). For prefixed diff --git a/src/library/scala/xml/pull/XMLEventReader.scala b/src/library/scala/xml/pull/XMLEventReader.scala index e22f064d79..f84d91d138 100755 --- a/src/library/scala/xml/pull/XMLEventReader.scala +++ b/src/library/scala/xml/pull/XMLEventReader.scala @@ -23,7 +23,10 @@ import scala.xml.parsing.{ ExternalSources, MarkupHandler, MarkupParser } * @author Burak Emir * @author Paul Phillips */ -class XMLEventReader(src: Source) extends ProducerConsumerIterator[XMLEvent] { +class XMLEventReader(src: Source) +extends collection.AbstractIterator[XMLEvent] + with ProducerConsumerIterator[XMLEvent] { + // We implement a pull parser as an iterator, but since we may be operating on // a stream (e.g. XML over a network) there may be arbitrarily long periods when // the queue is empty. Fortunately the ProducerConsumerIterator is ideally -- cgit v1.2.3