summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMiles Sabin <miles@milessabin.com>2009-09-09 10:07:07 +0000
committerMiles Sabin <miles@milessabin.com>2009-09-09 10:07:07 +0000
commitbc489c725eb256bc39b555cdf7e6966aa8a8b0a3 (patch)
tree84e142021715b1083fa87897376ed12933c73fd4 /src
parentd4716791267b2f39ebb746e142de773f173c7198 (diff)
downloadscala-bc489c725eb256bc39b555cdf7e6966aa8a8b0a3.tar.gz
scala-bc489c725eb256bc39b555cdf7e6966aa8a8b0a3.tar.bz2
scala-bc489c725eb256bc39b555cdf7e6966aa8a8b0a3.zip
Applied patch fixing #2306.
Diffstat (limited to 'src')
-rwxr-xr-xsrc/compiler/scala/tools/nsc/interactive/ContextTrees.scala25
1 files changed, 20 insertions, 5 deletions
diff --git a/src/compiler/scala/tools/nsc/interactive/ContextTrees.scala b/src/compiler/scala/tools/nsc/interactive/ContextTrees.scala
index 30fcccbb56..570958825b 100755
--- a/src/compiler/scala/tools/nsc/interactive/ContextTrees.scala
+++ b/src/compiler/scala/tools/nsc/interactive/ContextTrees.scala
@@ -28,12 +28,27 @@ trait ContextTrees { self: Global =>
/** Optionally returns the smallest context that contains given `pos`, or None if none exists.
*/
def locateContext(contexts: Contexts, pos: Position): Option[Context] = {
+ def locateNearestContextTree(contexts: Contexts, pos: Position, recent: Array[ContextTree]): Option[ContextTree] = {
+ locateContextTree(contexts, pos) match {
+ case Some(x) =>
+ recent(0) = x
+ locateNearestContextTree(x.children, pos, recent)
+ case None => recent(0) match {
+ case null => None
+ case x => Some(x)
+ }
+ }
+ }
+ locateNearestContextTree(contexts, pos, new Array[ContextTree](1)) map (_.context)
+ }
+
+ def locateContextTree(contexts: Contexts, pos: Position): Option[ContextTree] = {
if (contexts.isEmpty) None
else {
val hi = contexts.length - 1
if ((contexts(hi).pos precedes pos) || (pos precedes contexts(0).pos)) None
else {
- def loop(lo: Int, hi: Int): Option[Context] = {
+ def loop(lo: Int, hi: Int): Option[ContextTree] = {
val mid = (lo + hi) / 2
val midpos = contexts(mid).pos
if ((pos precedes midpos) && (mid < hi))
@@ -41,9 +56,9 @@ trait ContextTrees { self: Global =>
else if ((midpos precedes pos) && (lo < mid))
loop(mid, hi)
else if (midpos includes pos)
- Some(contexts(mid).context)
+ Some(contexts(mid))
else if (contexts(mid+1).pos includes pos)
- Some(contexts(mid+1).context)
+ Some(contexts(mid+1))
else None
}
loop(0, hi)
@@ -73,11 +88,11 @@ trait ContextTrees { self: Global =>
else if (contexts.isEmpty) contexts += new ContextTree(cpos, context)
else {
val hi = contexts.length - 1
- if (contexts(hi).pos properlyPrecedes cpos)
+ if (contexts(hi).pos precedes cpos)
contexts += new ContextTree(cpos, context)
else if (contexts(hi).pos properlyIncludes cpos) // fast path w/o search
addContext(contexts(hi).children, context, cpos)
- else if (cpos properlyPrecedes contexts(0).pos)
+ else if (cpos precedes contexts(0).pos)
new ContextTree(cpos, context) +: contexts
else {
def insertAt(idx: Int): Boolean = {