aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJason Zaugg <jzaugg@gmail.com>2015-11-09 16:43:27 +1000
committerJason Zaugg <jzaugg@gmail.com>2015-11-10 15:05:08 +1000
commite28832dcda3c3f40425ca71dde8aa9c1a1e424d3 (patch)
treeb6c0142c6d58859882182d7aa29bcc75da56606b /src
parent656748c2c3c094c19d28a59c466d67437b7d6f6c (diff)
downloadscala-async-e28832dcda3c3f40425ca71dde8aa9c1a1e424d3.tar.gz
scala-async-e28832dcda3c3f40425ca71dde8aa9c1a1e424d3.tar.bz2
scala-async-e28832dcda3c3f40425ca71dde8aa9c1a1e424d3.zip
Hooks to customize code generation
Diffstat (limited to 'src')
-rw-r--r--src/main/scala/scala/async/internal/AsyncTransform.scala2
-rw-r--r--src/main/scala/scala/async/internal/ExprBuilder.scala4
-rw-r--r--src/main/scala/scala/async/internal/FutureSystem.scala2
3 files changed, 5 insertions, 3 deletions
diff --git a/src/main/scala/scala/async/internal/AsyncTransform.scala b/src/main/scala/scala/async/internal/AsyncTransform.scala
index 2e8dcf9..fa0eec7 100644
--- a/src/main/scala/scala/async/internal/AsyncTransform.scala
+++ b/src/main/scala/scala/async/internal/AsyncTransform.scala
@@ -50,7 +50,7 @@ trait AsyncTransform {
}
val tryToUnit = appliedType(definitions.FunctionClass(1), futureSystemOps.tryType[Any], typeOf[Unit])
- val template = Template(List(tryToUnit, typeOf[() => Unit]).map(TypeTree(_)), emptyValDef, body)
+ val template = Template((futureSystemOps.stateMachineClassParents ::: List(tryToUnit, typeOf[() => Unit])).map(TypeTree(_)), emptyValDef, body)
val t = ClassDef(NoMods, name.stateMachineT, Nil, template)
typecheckClassDef(t)
diff --git a/src/main/scala/scala/async/internal/ExprBuilder.scala b/src/main/scala/scala/async/internal/ExprBuilder.scala
index ce2345d..32f09d8 100644
--- a/src/main/scala/scala/async/internal/ExprBuilder.scala
+++ b/src/main/scala/scala/async/internal/ExprBuilder.scala
@@ -357,8 +357,8 @@ trait ExprBuilder {
val caseForLastState: CaseDef = {
val lastState = asyncStates.last
val lastStateBody = c.Expr[T](lastState.body)
- val rhs = futureSystemOps.completeProm(
- c.Expr[futureSystem.Prom[T]](symLookup.memberRef(name.result)), futureSystemOps.tryySuccess[T](lastStateBody))
+ val rhs = futureSystemOps.completeWithSuccess(
+ c.Expr[futureSystem.Prom[T]](symLookup.memberRef(name.result)), lastStateBody)
mkHandlerCase(lastState.state, Block(rhs.tree, Return(literalUnit)))
}
asyncStates.toList match {
diff --git a/src/main/scala/scala/async/internal/FutureSystem.scala b/src/main/scala/scala/async/internal/FutureSystem.scala
index 6fccfdd..04adafc 100644
--- a/src/main/scala/scala/async/internal/FutureSystem.scala
+++ b/src/main/scala/scala/async/internal/FutureSystem.scala
@@ -33,6 +33,7 @@ trait FutureSystem {
def promType[A: WeakTypeTag]: Type
def tryType[A: WeakTypeTag]: Type
def execContextType: Type
+ def stateMachineClassParents: List[Type] = Nil
/** Create an empty promise */
def createProm[A: WeakTypeTag]: Expr[Prom[A]]
@@ -55,6 +56,7 @@ trait FutureSystem {
/** Complete a promise with a value */
def completeProm[A](prom: Expr[Prom[A]], value: Expr[Tryy[A]]): Expr[Unit]
+ def completeWithSuccess[A: WeakTypeTag](prom: Expr[Prom[A]], value: Expr[A]): Expr[Unit] = completeProm(prom, tryySuccess(value))
def spawn(tree: Tree, execContext: Tree): Tree =
future(c.Expr[Unit](tree))(c.Expr[ExecContext](execContext)).tree