diff options
author | Martin Odersky <odersky@gmail.com> | 2009-06-02 21:32:36 +0000 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2009-06-02 21:32:36 +0000 |
commit | cf4c6c334a045b6da6ad9ea0249a6602e9558649 (patch) | |
tree | 8f75fb6513f42cfc183709b9609da2c183dc97dc /src/compiler/scala/tools/nsc/interactive/ContextTrees.scala | |
parent | 02ec6b9c108283f3657f4d1c3f33827da573dc03 (diff) | |
download | scala-cf4c6c334a045b6da6ad9ea0249a6602e9558649.tar.gz scala-cf4c6c334a045b6da6ad9ea0249a6602e9558649.tar.bz2 scala-cf4c6c334a045b6da6ad9ea0249a6602e9558649.zip |
fixed some problems with positions.
Diffstat (limited to 'src/compiler/scala/tools/nsc/interactive/ContextTrees.scala')
-rwxr-xr-x | src/compiler/scala/tools/nsc/interactive/ContextTrees.scala | 24 |
1 files changed, 13 insertions, 11 deletions
diff --git a/src/compiler/scala/tools/nsc/interactive/ContextTrees.scala b/src/compiler/scala/tools/nsc/interactive/ContextTrees.scala index 5ed0581bdf..8d188cac62 100755 --- a/src/compiler/scala/tools/nsc/interactive/ContextTrees.scala +++ b/src/compiler/scala/tools/nsc/interactive/ContextTrees.scala @@ -23,7 +23,7 @@ trait ContextTrees { self: Global => override def toString = "ContextTree("+pos+", "+children+")" } - /** Optionally return the smallest context taht contains given `pos`, or None if none exists. + /** Optionally return the smallest context that contains given `pos`, or None if none exists. */ def locateContext(contexts: Contexts, pos: Position): Option[Context] = { if (contexts.isEmpty) None @@ -32,17 +32,17 @@ trait ContextTrees { self: Global => if ((contexts(hi).pos precedes pos) || (pos precedes contexts(0).pos)) None else { def loop(lo: Int, hi: Int): Option[Context] = { - assert(lo <= hi) val mid = (lo + hi) / 2 val midpos = contexts(mid).pos - if (pos precedes midpos) - loop(lo, mid - 1) - else if (midpos precedes pos) - loop(mid + 1, hi) + if ((pos precedes midpos) && (mid < hi)) + loop(lo, mid) + else if ((midpos precedes pos) && (lo < mid)) + loop(mid, hi) else if (midpos includes pos) - locateContext(contexts(mid).children, pos) orElse Some(contexts(mid).context) - else - None + Some(contexts(mid).context) + else if (contexts(mid+1).pos includes pos) + Some(contexts(mid+1).context) + else None } loop(0, hi) } @@ -74,7 +74,7 @@ trait ContextTrees { self: Global => if (contexts(hi).pos properlyPrecedes cpos) contexts += new ContextTree(cpos, context) else if (contexts(hi).pos properlyIncludes cpos) // fast path w/o search - addContext(contexts(hi).children, context) + addContext(contexts(hi).children, context, cpos) else if (cpos properlyPrecedes contexts(0).pos) new ContextTree(cpos, context) +: contexts else { @@ -84,7 +84,7 @@ trait ContextTrees { self: Global => contexts(idx) = new ContextTree(cpos, context, contexts(idx).children) true } else if (oldpos includes cpos) { - addContext(contexts(idx).children, context) + addContext(contexts(idx).children, context, cpos) true } else if (cpos includes oldpos) { val start = contexts.indexWhere(cpos includes _.pos) @@ -116,6 +116,8 @@ trait ContextTrees { self: Global => } } catch { case ex: Throwable => + println(ex) + ex.printStackTrace() println("failure inserting "+cpos+" into "+contexts+"/"+contexts(contexts.length - 1).pos+"/"+ (contexts(contexts.length - 1).pos includes cpos)) throw ex |