summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2011-01-28 18:04:34 +0000
committerMartin Odersky <odersky@gmail.com>2011-01-28 18:04:34 +0000
commit43d3c0218579e454826e453d03d17df67b75dc61 (patch)
treea9ec1bacea9cd611d428dc1c4ec76df92b91158a
parentb345da5ef44ee1ae1d57b98430baa59c74bf3700 (diff)
downloadscala-43d3c0218579e454826e453d03d17df67b75dc61.tar.gz
scala-43d3c0218579e454826e453d03d17df67b75dc61.tar.bz2
scala-43d3c0218579e454826e453d03d17df67b75dc61.zip
made askTypeAt work on non-loaded sources.
-rw-r--r--src/compiler/scala/tools/nsc/interactive/CompilerControl.scala15
-rw-r--r--src/compiler/scala/tools/nsc/interactive/Global.scala48
-rw-r--r--src/compiler/scala/tools/nsc/interactive/Picklers.scala7
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
}