aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Zaugg <jzaugg@gmail.com>2013-11-13 17:52:22 +0100
committerJason Zaugg <jzaugg@gmail.com>2013-11-13 17:52:22 +0100
commit2eba82f8b7687dd898b89496451ebb3ae9519692 (patch)
tree02741b443294cd48300075263451e63e0cb513b7
parent5ed6a1da1ce8ee073285c8fe1ab63560ce0b6843 (diff)
downloadscala-async-2eba82f8b7687dd898b89496451ebb3ae9519692.tar.gz
scala-async-2eba82f8b7687dd898b89496451ebb3ae9519692.tar.bz2
scala-async-2eba82f8b7687dd898b89496451ebb3ae9519692.zip
Add a hook for post-ANF transformation
For use by custom implementations of the async macro.
-rw-r--r--src/main/scala/scala/async/internal/AsyncTransform.scala4
-rw-r--r--src/main/scala/scala/async/internal/FutureSystem.scala3
2 files changed, 6 insertions, 1 deletions
diff --git a/src/main/scala/scala/async/internal/AsyncTransform.scala b/src/main/scala/scala/async/internal/AsyncTransform.scala
index 9003b0b..043822b 100644
--- a/src/main/scala/scala/async/internal/AsyncTransform.scala
+++ b/src/main/scala/scala/async/internal/AsyncTransform.scala
@@ -20,7 +20,9 @@ trait AsyncTransform {
// Transform to A-normal form:
// - no await calls in qualifiers or arguments,
// - if/match only used in statement position.
- val anfTree: Block = anfTransform(body)
+ val anfTree0: Block = anfTransform(body)
+
+ val anfTree = futureSystemOps.postAnfTransform(anfTree0)
val resumeFunTreeDummyBody = DefDef(Modifiers(), name.resume, Nil, List(Nil), Ident(definitions.UnitClass), Literal(Constant(())))
diff --git a/src/main/scala/scala/async/internal/FutureSystem.scala b/src/main/scala/scala/async/internal/FutureSystem.scala
index 9fe88b4..c064474 100644
--- a/src/main/scala/scala/async/internal/FutureSystem.scala
+++ b/src/main/scala/scala/async/internal/FutureSystem.scala
@@ -51,6 +51,9 @@ trait FutureSystem {
def spawn(tree: Tree, execContext: Tree): Tree =
future(Expr[Unit](tree))(Expr[ExecContext](execContext)).tree
+
+ /** A hook for custom macros to transform the tree post-ANF transform */
+ def postAnfTransform(tree: Block): Block = tree
}
def mkOps(c: SymbolTable): Ops { val universe: c.type }