From 329fd609f31339f11340a18aa6c7f225f7c7cdae Mon Sep 17 00:00:00 2001 From: Martin Odersky Date: Tue, 5 Apr 2011 16:22:21 +0000 Subject: better handling of on-same-thread calls. --- .../scala/tools/nsc/interactive/CompilerControl.scala | 14 ++++++++------ src/compiler/scala/tools/nsc/interactive/Picklers.scala | 8 ++++---- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/compiler/scala/tools/nsc/interactive/CompilerControl.scala b/src/compiler/scala/tools/nsc/interactive/CompilerControl.scala index bcc8f46b19..373db5cdc3 100644 --- a/src/compiler/scala/tools/nsc/interactive/CompilerControl.scala +++ b/src/compiler/scala/tools/nsc/interactive/CompilerControl.scala @@ -176,7 +176,8 @@ trait CompilerControl { self: Global => * the a NoSuchUnitError is raised in the response. */ def askLoadedTyped(source: SourceFile, response: Response[Tree]) = - postWorkItem(new AskLoadedTypedItem(source, response, onCompilerThread)) + if (onCompilerThread) waitLoadedTyped(source, response, onSameThread = true) + else postWorkItem(new AskLoadedTypedItem(source, response)) /** If source if not yet loaded, get an outline view with askParseEntered. * If source is loaded, wait for it to be typechecked. @@ -197,7 +198,8 @@ trait CompilerControl { self: Global => * @param response The response. */ def askParsedEntered(source: SourceFile, keepLoaded: Boolean, response: Response[Tree]) = - postWorkItem(new AskParsedEnteredItem(source, keepLoaded, response, onCompilerThread)) + if (onCompilerThread) getParsedEntered(source, keepLoaded, response, onSameThread = true) + else postWorkItem(new AskParsedEnteredItem(source, keepLoaded, response)) /** Cancels current compiler run and start a fresh one where everything will be re-typechecked * (but not re-loaded). @@ -290,13 +292,13 @@ trait CompilerControl { self: Global => override def toString = "linkpos "+sym+" in "+source } - class AskLoadedTypedItem(val source: SourceFile, response: Response[Tree], val onSameThread: Boolean) extends WorkItem { - def apply() = self.waitLoadedTyped(source, response, onSameThread) + class AskLoadedTypedItem(val source: SourceFile, response: Response[Tree]) extends WorkItem { + def apply() = self.waitLoadedTyped(source, response, onSameThread = false) override def toString = "wait loaded & typed "+source } - class AskParsedEnteredItem(val source: SourceFile, val keepLoaded: Boolean, response: Response[Tree], val onSameThread: Boolean) extends WorkItem { - def apply() = self.getParsedEntered(source, keepLoaded, response, onSameThread) + class AskParsedEnteredItem(val source: SourceFile, val keepLoaded: Boolean, response: Response[Tree]) extends WorkItem { + def apply() = self.getParsedEntered(source, keepLoaded, response, onSameThread = false) override def toString = "getParsedEntered "+source+", keepLoaded = "+keepLoaded } } diff --git a/src/compiler/scala/tools/nsc/interactive/Picklers.scala b/src/compiler/scala/tools/nsc/interactive/Picklers.scala index 4591cf2522..53ef20507f 100644 --- a/src/compiler/scala/tools/nsc/interactive/Picklers.scala +++ b/src/compiler/scala/tools/nsc/interactive/Picklers.scala @@ -159,13 +159,13 @@ trait Picklers { self: Global => .asClass (classOf[AskLinkPosItem]) implicit def askLoadedTypedItem: CondPickler[AskLoadedTypedItem] = - (pkl[SourceFile] ~ pkl[Boolean]) - .wrapped { case source ~ onSameThread => new AskLoadedTypedItem(source, new Response, onSameThread) } { w => w.source ~ w.onSameThread } + pkl[SourceFile] + .wrapped { source => new AskLoadedTypedItem(source, new Response) } { _.source } .asClass (classOf[AskLoadedTypedItem]) implicit def askParsedEnteredItem: CondPickler[AskParsedEnteredItem] = - (pkl[SourceFile] ~ pkl[Boolean] ~ pkl[Boolean]) - .wrapped { case source ~ keepLoaded ~ onSameThread => new AskParsedEnteredItem(source, keepLoaded, new Response, onSameThread) } { w => w.source ~ w.keepLoaded ~ w.onSameThread } + (pkl[SourceFile] ~ pkl[Boolean]) + .wrapped { case source ~ keepLoaded => new AskParsedEnteredItem(source, keepLoaded, new Response) } { w => w.source ~ w.keepLoaded } .asClass (classOf[AskParsedEnteredItem]) implicit def emptyAction: CondPickler[EmptyAction] = -- cgit v1.2.3