diff options
author | Antonio Cunei <antonio.cunei@epfl.ch> | 2011-09-16 13:48:05 +0000 |
---|---|---|
committer | Antonio Cunei <antonio.cunei@epfl.ch> | 2011-09-16 13:48:05 +0000 |
commit | d7a171e06c871012c3ce0bdcf9daf00352a62574 (patch) | |
tree | 907eb9ef31d28419f691a2422b5708d3a2dfd701 | |
parent | ade586e57d57ea214a0ac57dd14bb654753bae8c (diff) | |
download | scala-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.scala | 47 | ||||
-rw-r--r-- | src/compiler/scala/tools/nsc/interactive/Global.scala | 18 |
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 } |