From b77116fea1ca3071c29e0cdb0a1b1f0eb3d2333a Mon Sep 17 00:00:00 2001 From: Sean McDirmid Date: Tue, 25 Sep 2007 12:50:29 +0000 Subject: Fixing bugs neg/bug432.scala and neg/badtok-1.s... Fixing bugs neg/bug432.scala and neg/badtok-1.scala. Also, removed buggy filtered mutable iterator. Replaced with one that doesn't support remove. --- .../scala/tools/nsc/typechecker/Namers.scala | 2 +- src/library/scala/collection/jcl/Map.scala | 11 ++++- .../scala/collection/jcl/MutableIterable.scala | 9 +++- .../scala/collection/jcl/MutableIterator.scala | 49 +++------------------- src/library/scala/collection/jcl/SortedSet.scala | 7 ++-- test/files/neg/badtok-1.check | 7 +++- 6 files changed, 32 insertions(+), 53 deletions(-) diff --git a/src/compiler/scala/tools/nsc/typechecker/Namers.scala b/src/compiler/scala/tools/nsc/typechecker/Namers.scala index a6409c6398..de832671f8 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Namers.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Namers.scala @@ -131,7 +131,7 @@ trait Namers { self: Analyzer => if ((prev ne null) && prev.owner == context.scope && conflict(sym, prev.sym)) { doubleDefError(sym.pos, prev.sym) if (!inIDE) sym setInfo ErrorType // don't do this in IDE for stability - context.scope unlink prev.sym + if (!inIDE) context.scope unlink prev.sym // let them co-exist... context.scope enter sym } else context.scope enter sym } else context.scope enter sym diff --git a/src/library/scala/collection/jcl/Map.scala b/src/library/scala/collection/jcl/Map.scala index a702fb15f1..2feed2ca82 100644 --- a/src/library/scala/collection/jcl/Map.scala +++ b/src/library/scala/collection/jcl/Map.scala @@ -89,8 +89,15 @@ trait Map[K,E] extends MutableIterable[Tuple2[K,E]] with scala.collection.mutabl override def filterKeys(p : K => Boolean) : Map.Projection[K,E] = new Filter(p); protected class Filter(p : K => Boolean) extends Map.Projection[K,E] { - override def elements = Map.this.elements.filter(e => p(e._1)); - override def removeKey(key : K) = { + override def elements = { + val i = Map.this.elements.filter(e => p(e._1)); + new MutableIterator[(K,E)] { + def next = i.next + def hasNext = i.hasNext + def remove : Unit = throw new Error + } + } + override def removeKey(key : K) = { if (!p(key)) throw new IllegalArgumentException; Map.this.removeKey(key); } diff --git a/src/library/scala/collection/jcl/MutableIterable.scala b/src/library/scala/collection/jcl/MutableIterable.scala index c4a8fb7dda..5683e6bd3e 100644 --- a/src/library/scala/collection/jcl/MutableIterable.scala +++ b/src/library/scala/collection/jcl/MutableIterable.scala @@ -86,7 +86,14 @@ trait MutableIterable[A] extends scala.Collection[A] { } override def filter(p0 : A => Boolean) : MutableIterable.Projection[A] = MutableIterable.this.projection.filter(a => p(a) && p0(a)); - def elements = MutableIterable.this.elements.filter(p); + def elements = { + val i = MutableIterable.this.elements.filter(p); + new MutableIterator[A] { + def next = i.next + def hasNext = i.hasNext + def remove : Unit = throw new Error + } + } def size = size0; } } diff --git a/src/library/scala/collection/jcl/MutableIterator.scala b/src/library/scala/collection/jcl/MutableIterator.scala index d90545c7a2..b887e3c76f 100644 --- a/src/library/scala/collection/jcl/MutableIterator.scala +++ b/src/library/scala/collection/jcl/MutableIterator.scala @@ -27,10 +27,12 @@ object MutableIterator { trait MutableIterator[A] extends Iterator[A] { def remove : Unit; + /* filter doesnt' support remove yet. override def filter(f : A => Boolean) : MutableIterator[A] = { val buffered = this.buffered0; new buffered.Filter(f); } + */ override def map[B](f: A => B) : MutableIterator[B] = new Map(f); /** A type-safe version of contains. @@ -59,51 +61,10 @@ trait MutableIterator[A] extends Iterator[A] { changed; } - private[jcl] def buffered0 : MutableIterator[A]#Buffered = new BufferedImpl; - /** Standard implementation of a mapped iterator. **/ class Map[B](f : A => B) extends MutableIterator[B] { - def hasNext = MutableIterator.this.hasNext; - def next = f(MutableIterator.this.next); - def remove = MutableIterator.this.remove; - } - - private[jcl] trait Buffered extends MutableIterator[A] { - private[jcl] override def buffered0 : this.type = this; - private[jcl] def peekNext : A; - private[jcl] def seekNext(f : A => Boolean) : Option[A] = { - while (hasNext && !f(peekNext)) next; - if (hasNext) Some(peekNext) else None; - } - class Filter(p : A => Boolean) extends MutableIterator[A] { - // XXX: broken - private[jcl] def peekNext = Buffered.this.seekNext(p) match { - case Some(result) => result; - case None => throw new Predef.NoSuchElementException; - } - override def next = { - val ret = peekNext; val ret0 = Buffered.this.next; Predef.assert(ret == ret0); ret; - } - override def hasNext : Boolean = seekNext(p) != None; - override def remove : Unit = Buffered.this.remove; - } - } - - private[jcl] class BufferedImpl extends Buffered { - protected var head : A = _; - protected def underlying = MutableIterator.this; - private[jcl] def peekNext = { - if (head == null) head = underlying.next; - head; - } - override def hasNext = head != null || underlying.hasNext; - override def next = { - val ret = peekNext; head = null.asInstanceOf[A]; ret; - } - override def remove = { - if (head != null) throw new Predef.NoSuchElementException; - underlying.remove; - } - override def toString = "buffered[" + underlying + "]"; + def hasNext = MutableIterator.this.hasNext + def next = f(MutableIterator.this.next) + def remove = MutableIterator.this.remove } } diff --git a/src/library/scala/collection/jcl/SortedSet.scala b/src/library/scala/collection/jcl/SortedSet.scala index 2bb6502f29..d1317096ad 100644 --- a/src/library/scala/collection/jcl/SortedSet.scala +++ b/src/library/scala/collection/jcl/SortedSet.scala @@ -60,8 +60,8 @@ trait SortedSet[A] extends scala.collection.SortedSet[A] with jcl.Set[A] with So if (from == None && until == None) throw new IllegalArgumentException; if (from != None && until != None && !(SortedSet.this.compare(from.get, until.get) < 0)) throw new IllegalArgumentException; - override def elements : MutableIterator[A] = - new RangeIterator(SortedSet.this.elements.buffered0); + //override def elements : MutableIterator[A] = + // new RangeIterator(SortedSet.this.elements.buffered0); private def contains1(key : A) = (from == None || (compare(from.get,key) <= 0)) && (until == None || (compare(key,until.get) < 0)); @@ -73,6 +73,7 @@ trait SortedSet[A] extends scala.collection.SortedSet[A] with jcl.Set[A] with So if (until != None && compare(this.until.get, until.get) < 0) return rangeImpl(from, this.until); SortedSet.this.rangeImpl(from, until); } + /* class RangeIterator(underlying : MutableIterator[A]#Buffered) extends MutableIterator[A] { if (from != None) underlying.seekNext(a => compare(from.get, a) <= 0); @@ -87,6 +88,6 @@ trait SortedSet[A] extends scala.collection.SortedSet[A] with jcl.Set[A] with So case None => throw new NoSuchElementException; } def remove = underlying.remove; - } + }*/ } } diff --git a/test/files/neg/badtok-1.check b/test/files/neg/badtok-1.check index 27c7587828..6523358c79 100644 --- a/test/files/neg/badtok-1.check +++ b/test/files/neg/badtok-1.check @@ -1,4 +1,7 @@ -badtok-1.scala:2: error: unexpected quote after symbol +badtok-1.scala:2: error: expected class or object definition '42' ^ -one error found +badtok-1.scala:2: error: unclosed character literal +'42' + ^ +two errors found -- cgit v1.2.3