diff options
author | Martin Odersky <odersky@gmail.com> | 2011-01-28 18:04:34 +0000 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2011-01-28 18:04:34 +0000 |
commit | 43d3c0218579e454826e453d03d17df67b75dc61 (patch) | |
tree | a9ec1bacea9cd611d428dc1c4ec76df92b91158a /src | |
parent | b345da5ef44ee1ae1d57b98430baa59c74bf3700 (diff) | |
download | scala-43d3c0218579e454826e453d03d17df67b75dc61.tar.gz scala-43d3c0218579e454826e453d03d17df67b75dc61.tar.bz2 scala-43d3c0218579e454826e453d03d17df67b75dc61.zip |
made askTypeAt work on non-loaded sources.
Diffstat (limited to 'src')
3 files changed, 30 insertions, 40 deletions
diff --git a/src/compiler/scala/tools/nsc/interactive/CompilerControl.scala b/src/compiler/scala/tools/nsc/interactive/CompilerControl.scala index 9d29b781c1..de2e6206d6 100644 --- a/src/compiler/scala/tools/nsc/interactive/CompilerControl.scala +++ b/src/compiler/scala/tools/nsc/interactive/CompilerControl.scala @@ -114,7 +114,7 @@ trait CompilerControl { self: Global => } /** Sets sync var `response` to the smallest fully attributed tree that encloses position `pos`. - * @pre The source file belonging to `pos` needs to be loaded. + * Note: Unlike for most other ask... operations, the source file belonging to `pos` needs not be be loaded. */ def askTypeAt(pos: Position, response: Response[Tree]) = scheduler postWorkItem new AskTypeAtItem(pos, response) @@ -144,20 +144,16 @@ trait CompilerControl { self: Global => def askLinkPos(sym: Symbol, source: SourceFile, response: Response[Position]) = scheduler postWorkItem new AskLinkPosItem(sym, source, response) - /** Sets sync var `response` to the last fully attributed & typechecked tree produced from `source`. - * If no such tree exists yet, do a normal askType(source, false, response) - */ - def askLastType(source: SourceFile, response: Response[Tree]) = - scheduler postWorkItem new AskLastTypeItem(source, response) - /** Sets sync var `response' to list of members that are visible * as members of the tree enclosing `pos`, possibly reachable by an implicit. + * @pre source is loaded */ def askTypeCompletion(pos: Position, response: Response[List[Member]]) = scheduler postWorkItem new AskTypeCompletionItem(pos, response) /** Sets sync var `response' to list of members that are visible * as members of the scope enclosing `pos`. + * @pre source is loaded */ def askScopeCompletion(pos: Position, response: Response[List[Member]]) = scheduler postWorkItem new AskScopeCompletionItem(pos, response) @@ -255,11 +251,6 @@ trait CompilerControl { self: Global => override def toString = "typecheck" } - class AskLastTypeItem(val source: SourceFile, response: Response[Tree]) extends WorkItem { - def apply() = self.getLastTypedTree(source, response) - override def toString = "reconcile" - } - class AskTypeCompletionItem(val pos: Position, response: Response[List[Member]]) extends WorkItem { def apply() = self.getTypeCompletion(pos, response) override def toString = "type completion "+pos.source+" "+pos.show diff --git a/src/compiler/scala/tools/nsc/interactive/Global.scala b/src/compiler/scala/tools/nsc/interactive/Global.scala index 8fc23c68f0..700b2393fe 100644 --- a/src/compiler/scala/tools/nsc/interactive/Global.scala +++ b/src/compiler/scala/tools/nsc/interactive/Global.scala @@ -466,29 +466,33 @@ self => else outOfDate = true // proceed normally and enable new background compile } - /** A fully attributed tree located at position `pos` */ - def typedTreeAt(pos: Position): Tree = { - informIDE("typedTreeAt " + pos) - val tree = locateTree(pos) - debugLog("at pos "+pos+" was found: "+tree.getClass+" "+tree.pos.show) - if (stabilizedType(tree) ne null) { - debugLog("already attributed") - tree - } else { - val unit = getOrCreateUnitOf(pos.source) - unit.targetPos = pos - try { - debugLog("starting targeted type check") - //newTyperRun() // not needed for idempotent type checker phase - typeCheck(unit) - println("tree not found at "+pos) - EmptyTree - } catch { - case ex: TyperResult => new Locator(pos) locateIn ex.tree - } finally { - unit.targetPos = NoPosition + /** A fully attributed tree located at position `pos` */ + def typedTreeAt(pos: Position): Tree = getUnit(pos.source) match { + case None => + reloadSources(List(pos.source)) + val result = typedTreeAt(pos) + removeUnitOf(pos.source) + result + case Some(unit) => + informIDE("typedTreeAt " + pos) + val tree = locateTree(pos) + debugLog("at pos "+pos+" was found: "+tree.getClass+" "+tree.pos.show) + if (stabilizedType(tree) ne null) { + debugLog("already attributed") + tree + } else { + unit.targetPos = pos + try { + debugLog("starting targeted type check") + typeCheck(unit) + println("tree not found at "+pos) + EmptyTree + } catch { + case ex: TyperResult => new Locator(pos) locateIn ex.tree + } finally { + unit.targetPos = NoPosition + } } - } } /** A fully attributed tree corresponding to the entire compilation unit */ diff --git a/src/compiler/scala/tools/nsc/interactive/Picklers.scala b/src/compiler/scala/tools/nsc/interactive/Picklers.scala index 176e6505af..6216aaa1ff 100644 --- a/src/compiler/scala/tools/nsc/interactive/Picklers.scala +++ b/src/compiler/scala/tools/nsc/interactive/Picklers.scala @@ -134,11 +134,6 @@ trait Picklers { self: Global => .wrapped { case source ~ forceReload => new AskTypeItem(source, forceReload, new Response) } { w => w.source ~ w.forceReload } .asClass (classOf[AskTypeItem]) - implicit def askLastTypeItem: CondPickler[AskLastTypeItem] = - pkl[SourceFile] - .wrapped { new AskLastTypeItem(_, new Response) } { _.source } - .asClass (classOf[AskLastTypeItem]) - implicit def askTypeCompletionItem: CondPickler[AskTypeCompletionItem] = pkl[Position] .wrapped { new AskTypeCompletionItem(_, new Response) } { _.pos } @@ -175,6 +170,6 @@ trait Picklers { self: Global => .asClass (classOf[EmptyAction]) implicit def action: Pickler[() => Unit] = - reloadItem | askTypeAtItem | askTypeItem | askLastTypeItem | askTypeCompletionItem | askScopeCompletionItem | + reloadItem | askTypeAtItem | askTypeItem | askTypeCompletionItem | askScopeCompletionItem | askToDoFirstItem | askLinkPosItem | askLoadedTypedItem | askStructureItem | emptyAction } |