aboutsummaryrefslogtreecommitdiff
path: root/src/dotty
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2014-10-28 16:21:06 +0100
committerMartin Odersky <odersky@gmail.com>2014-11-09 10:17:34 +0100
commit252b6d9f3a80bdfc789e2f5b463ee7dc7a10b659 (patch)
treeb2a1144c5231c0dc39d1073d536b10c356dd2d11 /src/dotty
parentad45e2e4b72057499b33a1cb4fbf5eb41ab8651c (diff)
downloaddotty-252b6d9f3a80bdfc789e2f5b463ee7dc7a10b659.tar.gz
dotty-252b6d9f3a80bdfc789e2f5b463ee7dc7a10b659.tar.bz2
dotty-252b6d9f3a80bdfc789e2f5b463ee7dc7a10b659.zip
Generalize lift behavior between Flatten and LambdaLift
To be combinable with follow-up mini-phases the lift operation needs to handle Thickets specially. This commit factors out the behavior from LambdaLift, so that Flatten can do the same thing.
Diffstat (limited to 'src/dotty')
-rw-r--r--src/dotty/tools/dotc/ast/Trees.scala7
-rw-r--r--src/dotty/tools/dotc/transform/Flatten.scala2
-rw-r--r--src/dotty/tools/dotc/transform/LambdaLift.scala5
3 files changed, 9 insertions, 5 deletions
diff --git a/src/dotty/tools/dotc/ast/Trees.scala b/src/dotty/tools/dotc/ast/Trees.scala
index 71026a449..648f19a4f 100644
--- a/src/dotty/tools/dotc/ast/Trees.scala
+++ b/src/dotty/tools/dotc/ast/Trees.scala
@@ -347,6 +347,11 @@ object Trees {
s
}
+ /** If this is a thicket, gerform `op` on each of its trees
+ * otherwise, perform `op` ion tree itself.
+ */
+ def foreachInThicket(op: Tree[T] => Unit): Unit = op(this)
+
override def toText(printer: Printer) = printer.toText(this)
override def hashCode(): Int = System.identityHashCode(this)
@@ -809,6 +814,8 @@ object Trees {
val newTrees = trees.map(_.withPos(pos))
new Thicket[T](newTrees).asInstanceOf[this.type]
}
+ override def foreachInThicket(op: Tree[T] => Unit): Unit =
+ trees foreach (_.foreachInThicket(op))
}
class EmptyValDef[T >: Untyped] extends ValDef[T](
diff --git a/src/dotty/tools/dotc/transform/Flatten.scala b/src/dotty/tools/dotc/transform/Flatten.scala
index 769503f9d..dceefc0bc 100644
--- a/src/dotty/tools/dotc/transform/Flatten.scala
+++ b/src/dotty/tools/dotc/transform/Flatten.scala
@@ -32,7 +32,7 @@ class Flatten extends MiniPhaseTransform with SymTransformer { thisTransform =>
private def liftIfNested(tree: Tree)(implicit ctx: Context, info: TransformerInfo) =
if (ctx.owner is Package) tree
else {
- liftedDefs += transformFollowing(tree)
+ transformFollowing(tree).foreachInThicket(liftedDefs += _)
EmptyTree
}
diff --git a/src/dotty/tools/dotc/transform/LambdaLift.scala b/src/dotty/tools/dotc/transform/LambdaLift.scala
index 051c6065e..f36ff6247 100644
--- a/src/dotty/tools/dotc/transform/LambdaLift.scala
+++ b/src/dotty/tools/dotc/transform/LambdaLift.scala
@@ -357,10 +357,7 @@ class LambdaLift extends MiniPhaseTransform with IdentityDenotTransformer { this
private def liftDef(tree: MemberDef)(implicit ctx: Context, info: TransformerInfo): Tree = {
val buf = liftedDefs(tree.symbol.owner)
- transformFollowing(rename(tree, tree.symbol.name)) match {
- case Thicket(trees) => buf ++= trees
- case tree => buf += tree
- }
+ transformFollowing(rename(tree, tree.symbol.name)).foreachInThicket(buf += _)
EmptyTree
}