diff options
author | Iulian Dragos <jaguarul@gmail.com> | 2012-09-04 10:50:21 +0200 |
---|---|---|
committer | Iulian Dragos <jaguarul@gmail.com> | 2012-09-05 15:23:30 +0200 |
commit | f2caa7717eb991f9973ec68d47c1cd969db6ea23 (patch) | |
tree | 7e016e15a8703b6449cffe913ec0a04e09a7f324 | |
parent | 0054b6c4677387de712b2612c00bd261f5df0b2d (diff) | |
download | scala-f2caa7717eb991f9973ec68d47c1cd969db6ea23.tar.gz scala-f2caa7717eb991f9973ec68d47c1cd969db6ea23.tar.bz2 scala-f2caa7717eb991f9973ec68d47c1cd969db6ea23.zip |
Allow nested calls to `askForResponse` in the presentation compiler.
Fix #6312.
review by @odersky,@lrytz.(cherry picked from commit 4f932df552fd2a9e1af31bc3b5fbbfeeaa15feed)
-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 0c9a33b8c0..e01fdf7afc 100644 --- a/src/compiler/scala/tools/nsc/interactive/CompilerControl.scala +++ b/src/compiler/scala/tools/nsc/interactive/CompilerControl.scala @@ -256,12 +256,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..c59d6968a4 --- /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 main(args: Array[String]): Unit = { + 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(5000) + + println("done") + compiler.askShutdown() + } +} |