summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAntonio Cunei <antonio.cunei@epfl.ch>2011-09-16 13:48:05 +0000
committerAntonio Cunei <antonio.cunei@epfl.ch>2011-09-16 13:48:05 +0000
commitd7a171e06c871012c3ce0bdcf9daf00352a62574 (patch)
tree907eb9ef31d28419f691a2422b5708d3a2dfd701
parentade586e57d57ea214a0ac57dd14bb654753bae8c (diff)
downloadscala-d7a171e06c871012c3ce0bdcf9daf00352a62574.tar.gz
scala-d7a171e06c871012c3ce0bdcf9daf00352a62574.tar.bz2
scala-d7a171e06c871012c3ce0bdcf9daf00352a62574.zip
Backport of r25625 and r25596.
-rw-r--r--src/compiler/scala/tools/nsc/interactive/CompilerControl.scala47
-rw-r--r--src/compiler/scala/tools/nsc/interactive/Global.scala18
2 files changed, 58 insertions, 7 deletions
diff --git a/src/compiler/scala/tools/nsc/interactive/CompilerControl.scala b/src/compiler/scala/tools/nsc/interactive/CompilerControl.scala
index ac31b20aa5..8c1b2b6d33 100644
--- a/src/compiler/scala/tools/nsc/interactive/CompilerControl.scala
+++ b/src/compiler/scala/tools/nsc/interactive/CompilerControl.scala
@@ -261,57 +261,90 @@ trait CompilerControl { self: Global =>
abstract class WorkItem extends (() => Unit) {
val onCompilerThread = self.onCompilerThread
+
+ /** Raise a MissingReponse, if the work item carries a response. */
+ def raiseMissing(): Unit
}
case class ReloadItem(sources: List[SourceFile], response: Response[Unit]) extends WorkItem {
def apply() = reload(sources, response)
override def toString = "reload "+sources
+
+ def raiseMissing() =
+ response raise new MissingResponse
}
case class FilesDeletedItem(sources: List[SourceFile], response: Response[Unit]) extends WorkItem {
def apply() = filesDeleted(sources, response)
override def toString = "files deleted "+sources
+
+ def raiseMissing() =
+ response raise new MissingResponse
}
- class AskTypeAtItem(val pos: Position, response: Response[Tree]) extends WorkItem {
+ case class AskTypeAtItem(val pos: Position, response: Response[Tree]) extends WorkItem {
def apply() = self.getTypedTreeAt(pos, response)
override def toString = "typeat "+pos.source+" "+pos.show
+
+ def raiseMissing() =
+ response raise new MissingResponse
}
- class AskTypeItem(val source: SourceFile, val forceReload: Boolean, response: Response[Tree]) extends WorkItem {
+ case class AskTypeItem(val source: SourceFile, val forceReload: Boolean, response: Response[Tree]) extends WorkItem {
def apply() = self.getTypedTree(source, forceReload, response)
override def toString = "typecheck"
+
+ def raiseMissing() =
+ response raise new MissingResponse
}
- class AskTypeCompletionItem(val pos: Position, response: Response[List[Member]]) extends WorkItem {
+ case 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
+
+ def raiseMissing() =
+ response raise new MissingResponse
}
- class AskScopeCompletionItem(val pos: Position, response: Response[List[Member]]) extends WorkItem {
+ case class AskScopeCompletionItem(val pos: Position, response: Response[List[Member]]) extends WorkItem {
def apply() = self.getScopeCompletion(pos, response)
override def toString = "scope completion "+pos.source+" "+pos.show
+
+ def raiseMissing() =
+ response raise new MissingResponse
}
class AskToDoFirstItem(val source: SourceFile) extends WorkItem {
def apply() = moveToFront(List(source))
override def toString = "dofirst "+source
+
+ def raiseMissing() = ()
}
- class AskLinkPosItem(val sym: Symbol, val source: SourceFile, response: Response[Position]) extends WorkItem {
+ case class AskLinkPosItem(val sym: Symbol, val source: SourceFile, response: Response[Position]) extends WorkItem {
def apply() = self.getLinkPos(sym, source, response)
override def toString = "linkpos "+sym+" in "+source
+
+ def raiseMissing() =
+ response raise new MissingResponse
}
- class AskLoadedTypedItem(val source: SourceFile, response: Response[Tree]) extends WorkItem {
+ case class AskLoadedTypedItem(val source: SourceFile, response: Response[Tree]) extends WorkItem {
def apply() = self.waitLoadedTyped(source, response, this.onCompilerThread)
override def toString = "wait loaded & typed "+source
+
+ def raiseMissing() =
+ response raise new MissingResponse
}
- class AskParsedEnteredItem(val source: SourceFile, val keepLoaded: Boolean, response: Response[Tree]) extends WorkItem {
+ case class AskParsedEnteredItem(val source: SourceFile, val keepLoaded: Boolean, response: Response[Tree]) extends WorkItem {
def apply() = self.getParsedEntered(source, keepLoaded, response, this.onCompilerThread)
override def toString = "getParsedEntered "+source+", keepLoaded = "+keepLoaded
+
+ def raiseMissing() =
+ response raise new MissingResponse
}
+
}
// ---------------- Interpreted exceptions -------------------
diff --git a/src/compiler/scala/tools/nsc/interactive/Global.scala b/src/compiler/scala/tools/nsc/interactive/Global.scala
index 694df32e32..ece336d1f9 100644
--- a/src/compiler/scala/tools/nsc/interactive/Global.scala
+++ b/src/compiler/scala/tools/nsc/interactive/Global.scala
@@ -320,6 +320,22 @@ class Global(settings: Settings, reporter: Reporter, projectName: String = "")
newTyperRun()
minRunId = currentRunId
demandNewCompilerRun()
+
+ case Some(ShutdownReq) =>
+ scheduler.synchronized { // lock the work queue so no more items are posted while we clean it up
+ val units = scheduler.dequeueAll {
+ case item: WorkItem => Some(item.raiseMissing())
+ case _ => Some(())
+ }
+ debugLog("ShutdownReq: cleaning work queue (%d items)".format(units.size))
+ debugLog("Cleanup up responses (%d loadedType pending, %d parsedEntered pending)"
+ .format(waitLoadedTypeResponses.size, getParsedEnteredResponses.size))
+ checkNoResponsesOutstanding()
+
+ log.flush();
+ throw ShutdownReq
+ }
+
case Some(ex: Throwable) => log.flush(); throw ex
case _ =>
}
@@ -835,9 +851,11 @@ class Global(settings: Settings, reporter: Reporter, projectName: String = "")
}
val pre = stabilizedType(tree)
+
val ownerTpe = tree.tpe match {
case analyzer.ImportType(expr) => expr.tpe
case null => pre
+ case MethodType(List(), rtpe) => rtpe
case _ => tree.tpe
}