diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/main/scala/scala/async/Async.scala | 5 | ||||
-rw-r--r-- | src/main/scala/scala/async/AsyncUtils.scala | 5 | ||||
-rw-r--r-- | src/main/scala/scala/async/ExprBuilder.scala | 4 | ||||
-rw-r--r-- | src/test/scala/scala/async/TestUtils.scala | 17 | ||||
-rw-r--r-- | src/test/scala/scala/async/neg/NakedAwait.scala | 19 | ||||
-rw-r--r-- | src/test/scala/scala/async/neg/SampleNegSpec.scala | 17 | ||||
-rw-r--r-- | src/test/scala/scala/async/neg/package.scala | 11 |
7 files changed, 46 insertions, 32 deletions
diff --git a/src/main/scala/scala/async/Async.scala b/src/main/scala/scala/async/Async.scala index 0bf4362..d4b950e 100644 --- a/src/main/scala/scala/async/Async.scala +++ b/src/main/scala/scala/async/Async.scala @@ -21,7 +21,9 @@ class FallbackToCpsException extends scala.util.control.ControlThrowable object Async extends AsyncUtils { def async[T](body: T): Future[T] = macro asyncImpl[T] - + + // TODO Replace with `@compileTimeOnly when this is implemented SI-6539 + @deprecated("`await` must be enclosed in an `async` block", "0.1") def await[T](awaitable: Future[T]): T = ??? /* Fall back for `await` when it is called at an unsupported position. @@ -132,5 +134,4 @@ object Async extends AsyncUtils { } } } - } diff --git a/src/main/scala/scala/async/AsyncUtils.scala b/src/main/scala/scala/async/AsyncUtils.scala index 19e9d92..d288d34 100644 --- a/src/main/scala/scala/async/AsyncUtils.scala +++ b/src/main/scala/scala/async/AsyncUtils.scala @@ -28,9 +28,4 @@ trait AsyncUtils { val tpe = asyncMod.moduleClass.asType.toType tpe.member(c.universe.newTermName("awaitCps")) } - - private var cnt = 0 - protected[async] def freshString(prefix: String): String = - prefix + "$async$" + { cnt += 1; cnt } - } diff --git a/src/main/scala/scala/async/ExprBuilder.scala b/src/main/scala/scala/async/ExprBuilder.scala index deb8d28..c5c192d 100644 --- a/src/main/scala/scala/async/ExprBuilder.scala +++ b/src/main/scala/scala/async/ExprBuilder.scala @@ -459,7 +459,7 @@ class ExprBuilder[C <: Context with Singleton](val c: C) extends AsyncUtils { for (stat <- stats) stat match { // the val name = await(..) pattern case ValDef(mods, name, tpt, Apply(fun, args)) if fun.symbol == awaitMethod => - val newName = newTermName(Async.freshString(name.toString())) + val newName = c.fresh(name) toRename += (stat.symbol -> newName) asyncStates += stateBuilder.complete(args(0), newName, tpt, toRename).result // complete with await @@ -473,7 +473,7 @@ class ExprBuilder[C <: Context with Singleton](val c: C) extends AsyncUtils { case ValDef(mods, name, tpt, rhs) => checkForUnsupportedAwait(rhs) - val newName = newTermName(Async.freshString(name.toString())) + val newName = c.fresh(name) toRename += (stat.symbol -> newName) // when adding assignment need to take `toRename` into account stateBuilder.addVarDef(mods, newName, tpt, rhs, toRename) diff --git a/src/test/scala/scala/async/TestUtils.scala b/src/test/scala/scala/async/TestUtils.scala index f4def22..0920659 100644 --- a/src/test/scala/scala/async/TestUtils.scala +++ b/src/test/scala/scala/async/TestUtils.scala @@ -12,9 +12,12 @@ import java.util.concurrent.{TimeoutException, CountDownLatch, TimeUnit} import scala.concurrent.duration.Duration import org.junit.runner.RunWith import org.junit.runners.JUnit4 +import async._ +import tools.reflect.ToolBoxError trait TestUtils { + implicit class objectops(obj: Any) { def mustBe(other: Any) = assert(obj == other, obj + " is not " + other) @@ -35,4 +38,18 @@ trait TestUtils { else t.asInstanceOf[T] } } + + def eval(code: String, compileOptions: String = ""): Any = { + val m = scala.reflect.runtime.currentMirror + import scala.tools.reflect.ToolBox + val tb = m.mkToolBox(options = compileOptions) + val result = tb.eval(tb.parse(code)) + result + } + + def expectError(errorSnippet: String, compileOptions: String = "")(code: String) { + intercept[ToolBoxError] { + eval(code, compileOptions) + }.getMessage mustContain errorSnippet + } } diff --git a/src/test/scala/scala/async/neg/NakedAwait.scala b/src/test/scala/scala/async/neg/NakedAwait.scala new file mode 100644 index 0000000..db67f18 --- /dev/null +++ b/src/test/scala/scala/async/neg/NakedAwait.scala @@ -0,0 +1,19 @@ +package scala.async +package neg + +import org.junit.runner.RunWith +import org.junit.runners.JUnit4 +import org.junit.Test + +@RunWith(classOf[JUnit4]) +class NakedAwait { + @Test + def `await only allowed in async neg`() { + expectError("`await` must be enclosed in an `async` block", "-deprecation -Xfatal-warnings") { + """ + | import _root_.scala.async.Async._ + | await[Any](null) + """.stripMargin + } + } +} diff --git a/src/test/scala/scala/async/neg/SampleNegSpec.scala b/src/test/scala/scala/async/neg/SampleNegSpec.scala index 00daf44..94dbc1d 100644 --- a/src/test/scala/scala/async/neg/SampleNegSpec.scala +++ b/src/test/scala/scala/async/neg/SampleNegSpec.scala @@ -1,25 +1,18 @@ package scala.async package neg -import java.io.File import org.junit.runner.RunWith import org.junit.runners.JUnit4 import org.junit.Test -import tools.reflect.ToolBoxError @RunWith(classOf[JUnit4]) class SampleNegSpec { - val f = new File("/Users/jason/code/scala-async/test/files/run/await0") - @Test def `missing symbol`() { - intercept[ToolBoxError] { - eval { - """ - | kaboom - """.stripMargin - } - }.getMessage mustContain "not found: value kaboom" - + expectError("not found: value kaboom") { + """ + | kaboom + """.stripMargin + } } } diff --git a/src/test/scala/scala/async/neg/package.scala b/src/test/scala/scala/async/neg/package.scala deleted file mode 100644 index 1326394..0000000 --- a/src/test/scala/scala/async/neg/package.scala +++ /dev/null @@ -1,11 +0,0 @@ -package scala.async - -package object neg { - def eval(code: String): Any = { - val m = scala.reflect.runtime.currentMirror - import scala.tools.reflect.ToolBox - val tb = m.mkToolBox() - val result = tb.eval(tb.parse(code)) - result - } -} |