aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/transform/LambdaLift.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2014-10-28 15:20:48 +0100
committerMartin Odersky <odersky@gmail.com>2014-11-09 10:17:33 +0100
commitd2670a7e6ddfc3a71f7b38aefb831b684059d468 (patch)
tree18b2285ec6b28480f69f5f1ecf8ca6b5e5cdc5a2 /src/dotty/tools/dotc/transform/LambdaLift.scala
parent8c73426c1db5e867febf9abf565de4201f78d628 (diff)
downloaddotty-d2670a7e6ddfc3a71f7b38aefb831b684059d468.tar.gz
dotty-d2670a7e6ddfc3a71f7b38aefb831b684059d468.tar.bz2
dotty-d2670a7e6ddfc3a71f7b38aefb831b684059d468.zip
Made LambdaLift capable of having minitransforms run after it.
Some changes needed so that Flatten can run after LambdaLift
Diffstat (limited to 'src/dotty/tools/dotc/transform/LambdaLift.scala')
-rw-r--r--src/dotty/tools/dotc/transform/LambdaLift.scala36
1 files changed, 20 insertions, 16 deletions
diff --git a/src/dotty/tools/dotc/transform/LambdaLift.scala b/src/dotty/tools/dotc/transform/LambdaLift.scala
index 196753e82..051c6065e 100644
--- a/src/dotty/tools/dotc/transform/LambdaLift.scala
+++ b/src/dotty/tools/dotc/transform/LambdaLift.scala
@@ -278,20 +278,20 @@ class LambdaLift extends MiniPhaseTransform with IdentityDenotTransformer { this
}
}
- override def init(implicit ctx: Context, info: TransformerInfo) = {
- free.clear()
- proxyMap.clear()
- called.clear()
- calledFromInner.clear()
- liftedOwner.clear()
- liftedDefs.clear()
- assert(ctx.phase == thisTransform)
- (new CollectDependencies).traverse(NoSymbol, ctx.compilationUnit.tpdTree)
- computeFreeVars()
- computeLiftedOwners()
- generateProxies()(ctx.withPhase(thisTransform.next))
- liftLocals()(ctx.withPhase(thisTransform.next))
- }
+ override def init(implicit ctx: Context, info: TransformerInfo) =
+ ctx.atPhase(thisTransform) { implicit ctx =>
+ free.clear()
+ proxyMap.clear()
+ called.clear()
+ calledFromInner.clear()
+ liftedOwner.clear()
+ liftedDefs.clear()
+ (new CollectDependencies).traverse(NoSymbol, ctx.compilationUnit.tpdTree)
+ computeFreeVars()
+ computeLiftedOwners()
+ generateProxies()(ctx.withPhase(thisTransform.next))
+ liftLocals()(ctx.withPhase(thisTransform.next))
+ }
private def currentEnclosure(implicit ctx: Context) =
ctx.owner.enclosingMethod.skipConstructor
@@ -355,8 +355,12 @@ class LambdaLift extends MiniPhaseTransform with IdentityDenotTransformer { this
}
}
- private def liftDef(tree: MemberDef)(implicit ctx: Context): Tree = {
- liftedDefs(tree.symbol.owner) += rename(tree, tree.symbol.name)
+ 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
+ }
EmptyTree
}