From e28832dcda3c3f40425ca71dde8aa9c1a1e424d3 Mon Sep 17 00:00:00 2001 From: Jason Zaugg Date: Mon, 9 Nov 2015 16:43:27 +1000 Subject: Hooks to customize code generation --- src/main/scala/scala/async/internal/AsyncTransform.scala | 2 +- src/main/scala/scala/async/internal/ExprBuilder.scala | 4 ++-- src/main/scala/scala/async/internal/FutureSystem.scala | 2 ++ 3 files changed, 5 insertions(+), 3 deletions(-) (limited to 'src') 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 -- cgit v1.2.3