summaryrefslogtreecommitdiff
path: root/src/compiler/scala/tools/nsc/interactive/ContextTrees.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2009-06-02 21:32:36 +0000
committerMartin Odersky <odersky@gmail.com>2009-06-02 21:32:36 +0000
commitcf4c6c334a045b6da6ad9ea0249a6602e9558649 (patch)
tree8f75fb6513f42cfc183709b9609da2c183dc97dc /src/compiler/scala/tools/nsc/interactive/ContextTrees.scala
parent02ec6b9c108283f3657f4d1c3f33827da573dc03 (diff)
downloadscala-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-xsrc/compiler/scala/tools/nsc/interactive/ContextTrees.scala24
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