diff options
author | Iulian Dragos <jaguarul@gmail.com> | 2012-09-04 10:50:21 +0200 |
---|---|---|
committer | Iulian Dragos <jaguarul@gmail.com> | 2012-09-04 10:50:21 +0200 |
commit | 4f932df552fd2a9e1af31bc3b5fbbfeeaa15feed (patch) | |
tree | 2459e2680ec8a879a07a7ea967ed6a02ee91b6e1 | |
parent | 5415272018114bb2e15036c5d6f9ae9c5af625d2 (diff) | |
download | scala-4f932df552fd2a9e1af31bc3b5fbbfeeaa15feed.tar.gz scala-4f932df552fd2a9e1af31bc3b5fbbfeeaa15feed.tar.bz2 scala-4f932df552fd2a9e1af31bc3b5fbbfeeaa15feed.zip |
Allow nested calls to `askForResponse` in the presentation compiler.
Fix #6312.
review by @odersky,@lrytz.
-rw-r--r-- | src/compiler/scala/tools/nsc/interactive/CompilerControl.scala | 16 | ||||
-rw-r--r-- | test/files/presentation/recursive-ask.check | 4 | ||||
-rw-r--r-- | test/files/presentation/recursive-ask/RecursiveAsk.scala | 20 |
3 files changed, 35 insertions, 5 deletions
diff --git a/src/compiler/scala/tools/nsc/interactive/CompilerControl.scala b/src/compiler/scala/tools/nsc/interactive/CompilerControl.scala index 6acd6d2382..3de2359ce3 100644 --- a/src/compiler/scala/tools/nsc/interactive/CompilerControl.scala +++ b/src/compiler/scala/tools/nsc/interactive/CompilerControl.scala @@ -257,12 +257,18 @@ trait CompilerControl { self: Global => */ def askForResponse[A](op: () => A): Response[A] = { val r = new Response[A] - val ir = scheduler askDoQuickly op - ir onComplete { - case Left(result) => r set result - case Right(exc) => r raise exc + if (self.onCompilerThread) { + try { r set op() } + catch { case exc: Throwable => r raise exc } + r + } else { + val ir = scheduler askDoQuickly op + ir onComplete { + case Left(result) => r set result + case Right(exc) => r raise exc + } + r } - r } def onCompilerThread = Thread.currentThread == compileRunner diff --git a/test/files/presentation/recursive-ask.check b/test/files/presentation/recursive-ask.check new file mode 100644 index 0000000000..357d2cf879 --- /dev/null +++ b/test/files/presentation/recursive-ask.check @@ -0,0 +1,4 @@ +[ outer] askForResponse +[nested] askForResponse +passed +done diff --git a/test/files/presentation/recursive-ask/RecursiveAsk.scala b/test/files/presentation/recursive-ask/RecursiveAsk.scala new file mode 100644 index 0000000000..b0e29b3fd3 --- /dev/null +++ b/test/files/presentation/recursive-ask/RecursiveAsk.scala @@ -0,0 +1,20 @@ +import scala.tools.nsc.interactive.tests._ + +object Test extends InteractiveTest { + override def execute(): Unit = recursiveAskForResponse() + + def recursiveAskForResponse() { + val res0 = compiler.askForResponse( () => { + println("[ outer] askForResponse") + val res = compiler.askForResponse( () => { println("[nested] askForResponse") }) + println (res.get(5000) match { + case Some(_) => "passed" + case None => "timeout" + }) + }) + + res0.get + + println("done") + } +} |