diff options
author | Jason Zaugg <jzaugg@gmail.com> | 2013-11-23 09:45:19 +0100 |
---|---|---|
committer | Jason Zaugg <jzaugg@gmail.com> | 2013-11-23 09:53:28 +0100 |
commit | 736613ea8a2fb3eede9bc01346a743c70b44eeaa (patch) | |
tree | f5edd5ee810a9a899be25c1412ba96df02a486a6 /src | |
parent | cb37548ef85d471951867b9f8a97cb9b9820fc66 (diff) | |
download | scala-736613ea8a2fb3eede9bc01346a743c70b44eeaa.tar.gz scala-736613ea8a2fb3eede9bc01346a743c70b44eeaa.tar.bz2 scala-736613ea8a2fb3eede9bc01346a743c70b44eeaa.zip |
Substitute new parameter symbols into lambda body
Previously, new synthetic parameter symbols were created for the
apply method parameters, but only used in its `MethodType`. The
`ValDef` trees of the function, along with their symbols, were
used directly as the parameter trees of the apply method.
% cat sandbox/test.scala
object Test {
(x: Int) => {
(y: Int) => ???
}
}
% scalac-hash v2.10.3 -Xprint:typer,uncurry -uniqid ../scala2/sandbox/test.scala | egrep 'syntax|\bx'
[info] v2.10.3 => /Users/jason/usr/scala-v2.10.3-0-g88b5d19
[[syntax trees at end of typer]] // test.scala
((x#12152: Int#351) => x#12152)#12151
[[syntax trees at end of uncurry]] // test.scala
final def apply#15952(x#12152: Int#351): Int#351 = x#12152
This approach dates back a long way: c64152bc3. @odersky tells me it
was most likely due to insufficent substitution/cloning machinery
at the time.
% qbin/scalac -Xprint:typer,uncurry -uniqid ../scala2/sandbox/test.scala | egrep 'syntax|\bx'
[[syntax trees at end of typer]] // test.scala
((x#13685: Int#1760) => x#13685)#13671
[[syntax trees at end of uncurry]] // test.scala
final def apply#13959(x#13960: Int#1760): Int#1760 = x#13960
To make this work, I had to fix a problem in symbol substition; this
was commited in the previous commit. In the enclosed test, at Uncurry,
the symbol of the nested class `N` had a `ClassInfoType`, which listed
as a parent `M[a.C]`. When we substituted the new method parameter
symbol `a` for the eponymous function parameter symbol, this was not
touched.
Diffstat (limited to 'src')
-rw-r--r-- | src/compiler/scala/tools/nsc/transform/UnCurry.scala | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/src/compiler/scala/tools/nsc/transform/UnCurry.scala b/src/compiler/scala/tools/nsc/transform/UnCurry.scala index d1d4759ea5..a851585442 100644 --- a/src/compiler/scala/tools/nsc/transform/UnCurry.scala +++ b/src/compiler/scala/tools/nsc/transform/UnCurry.scala @@ -232,11 +232,11 @@ abstract class UnCurry extends InfoTransform } methSym setInfoAndEnter MethodType(paramSyms, restpe) - fun.vparams foreach (_.symbol.owner = methSym) - fun.body changeOwner (fun.symbol -> methSym) + fun.body changeOwner (fun.symbol -> methSym) + fun.body substituteSymbols (fun.vparams.map(_.symbol), paramSyms) val body = typedFunPos(fun.body) - val methDef = DefDef(methSym, List(fun.vparams), body) + val methDef = DefDef(methSym, body) // Have to repack the type to avoid mismatches when existentials // appear in the result - see SI-4869. |