aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main/scala/scala/async/Async.scala5
-rw-r--r--src/main/scala/scala/async/AsyncUtils.scala5
-rw-r--r--src/main/scala/scala/async/ExprBuilder.scala4
-rw-r--r--src/test/scala/scala/async/TestUtils.scala17
-rw-r--r--src/test/scala/scala/async/neg/NakedAwait.scala19
-rw-r--r--src/test/scala/scala/async/neg/SampleNegSpec.scala17
-rw-r--r--src/test/scala/scala/async/neg/package.scala11
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
- }
-}