diff options
author | Martin Odersky <odersky@gmail.com> | 2015-06-20 00:43:28 +0200 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2015-06-20 00:43:37 +0200 |
commit | c093792189f49c3e72ada99ca0fdb97e4023ef78 (patch) | |
tree | affb7d3f9df4651c1bf52cbe6ec928340026decc /src/dotty/tools/dotc/transform/LambdaLift.scala | |
parent | 9bf44f867c1a9f4625dd7fac9575c3e74373402b (diff) | |
download | dotty-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.scala | 17 |
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)( |