aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/transform/LambdaLift.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2015-06-20 00:43:28 +0200
committerMartin Odersky <odersky@gmail.com>2015-06-20 00:43:37 +0200
commitc093792189f49c3e72ada99ca0fdb97e4023ef78 (patch)
treeaffb7d3f9df4651c1bf52cbe6ec928340026decc /src/dotty/tools/dotc/transform/LambdaLift.scala
parent9bf44f867c1a9f4625dd7fac9575c3e74373402b (diff)
downloaddotty-c093792189f49c3e72ada99ca0fdb97e4023ef78.tar.gz
dotty-c093792189f49c3e72ada99ca0fdb97e4023ef78.tar.bz2
dotty-c093792189f49c3e72ada99ca0fdb97e4023ef78.zip
Map proxy references in constructors to parameters
Proxy references in constructors can't be left as fields because they can happen before the supercall.
Diffstat (limited to 'src/dotty/tools/dotc/transform/LambdaLift.scala')
-rw-r--r--src/dotty/tools/dotc/transform/LambdaLift.scala17
1 files changed, 15 insertions, 2 deletions
diff --git a/src/dotty/tools/dotc/transform/LambdaLift.scala b/src/dotty/tools/dotc/transform/LambdaLift.scala
index 41d6f3c43..2f06190c3 100644
--- a/src/dotty/tools/dotc/transform/LambdaLift.scala
+++ b/src/dotty/tools/dotc/transform/LambdaLift.scala
@@ -391,11 +391,24 @@ class LambdaLift extends MiniPhase with IdentityDenotTransformer { thisTransform
val freeParamDefs = ownProxies.map(proxy =>
transformFollowingDeep(ValDef(proxy.asTerm).withPos(tree.pos)).asInstanceOf[ValDef])
def proxyInit(field: Symbol, param: Symbol) =
- transformFollowingDeep(ref(field).becomes(ref(param)))
+ transformFollowingDeep(memberRef(field).becomes(ref(param)))
+
+ /** Map references to proxy fields `this.proxy` to procy parameers */
+ def mapProxies = new TreeMap {
+ override def transform(tree: Tree)(implicit ctx: Context) = tree match {
+ case Select(This(_), _) if proxies contains tree.symbol =>
+ ref(tree.symbol.subst(proxies, ownProxies))
+ case _ =>
+ super.transform(tree)
+ }
+ }
+
+ /** Initialize proxy fields from proxy parameters and map `rhs` from fields to parameters */
def copyParams(rhs: Tree) = {
ctx.log(i"copy params ${proxies.map(_.showLocated)}%, %, own = ${ownProxies.map(_.showLocated)}%, %")
- seq((proxies, ownProxies).zipped.map(proxyInit), rhs)
+ seq((proxies, ownProxies).zipped.map(proxyInit), mapProxies.transform(rhs))
}
+
tree match {
case tree: DefDef =>
cpy.DefDef(tree)(