aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/transform/MacroTransform.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2014-06-27 12:36:18 +0200
committerMartin Odersky <odersky@gmail.com>2014-07-17 11:01:59 +0200
commit8b93f7b4339abb4e376860770eb5b7ca271de71b (patch)
treef08ba12f5de638e7f02373b8c4f1fcf12cf88e23 /src/dotty/tools/dotc/transform/MacroTransform.scala
parent65eb50f096506e8ae279f480d8f6c9dc0b95f5e4 (diff)
downloaddotty-8b93f7b4339abb4e376860770eb5b7ca271de71b.tar.gz
dotty-8b93f7b4339abb4e376860770eb5b7ca271de71b.tar.bz2
dotty-8b93f7b4339abb4e376860770eb5b7ca271de71b.zip
Added MacroTransform as a transformer template for macro phases.
Diffstat (limited to 'src/dotty/tools/dotc/transform/MacroTransform.scala')
-rw-r--r--src/dotty/tools/dotc/transform/MacroTransform.scala54
1 files changed, 54 insertions, 0 deletions
diff --git a/src/dotty/tools/dotc/transform/MacroTransform.scala b/src/dotty/tools/dotc/transform/MacroTransform.scala
new file mode 100644
index 000000000..4113b2d8e
--- /dev/null
+++ b/src/dotty/tools/dotc/transform/MacroTransform.scala
@@ -0,0 +1,54 @@
+package dotty.tools.dotc
+package transform
+
+import core._
+import typer._
+import Phases._
+import ast.Trees._
+import Contexts._
+import Symbols._
+import Decorators._
+
+/** A base class for transforms.
+ * A transform contains a compiler phase which applies a tree transformer.
+ */
+abstract class MacroTransform extends Phase {
+
+ import ast.tpd._
+
+ override def run(implicit ctx: Context): Unit = {
+ val unit = ctx.compilationUnit
+ unit.tpdTree = newTransformer.transform(unit.tpdTree)
+ }
+
+ def newTransformer: TransformerMap
+
+ class TransformerMap extends TreeMap {
+
+ def transformStats(trees: List[Tree], exprOwner: Symbol)(implicit ctx: Context): List[Tree] = {
+ val exprCtx = ctx.withOwner(exprOwner)
+ def transformStat(stat: Tree): Tree = stat match {
+ case _: Import | _: DefTree => transform(stat)
+ case Thicket(stats) => cpy.Thicket(stat, stats mapConserve transformStat)
+ case _ => transform(stat)(exprCtx)
+ }
+ flatten(trees.mapconserve(transformStat(_)))
+ }
+
+ override def transform(tree: Tree)(implicit ctx: Context): Tree = {
+ def localCtx = ctx.fresh.setTree(tree).setOwner(tree.symbol)
+ tree match {
+ case _: PackageDef | _: MemberDef =>
+ super.transform(tree)(localCtx)
+ case Template(constr, parents, self, body) =>
+ cpy.Template(tree,
+ transformSub(constr),
+ transform(parents),
+ transformSub(self),
+ transformStats(body, tree.symbol))
+ case _ =>
+ super.transform(tree)
+ }
+ }
+ }
+}