@@ -151,16 +151,21 @@ object LambdaLift {
151
151
if (! enclosure.exists) throw new NoPath
152
152
if (enclosure == sym.enclosure) NoSymbol
153
153
else {
154
+ def nestedInConstructor (sym : Symbol ): Boolean =
155
+ sym.isConstructor ||
156
+ sym.isTerm && nestedInConstructor(sym.enclosure)
154
157
ctx.debuglog(i " mark free: ${sym.showLocated} with owner ${sym.maybeOwner} marked free in $enclosure" )
155
158
val intermediate =
156
159
if (enclosure.is(PackageClass )) enclosure
157
160
else if (enclosure.isConstructor) markFree(sym, enclosure.owner.enclosure)
158
161
else markFree(sym, enclosure.enclosure)
159
162
if (intermediate.exists) narrowLiftedOwner(enclosure, intermediate)
160
- if ( ! intermediate.isRealClass || enclosure.isConstructor)
163
+ if ! intermediate.isRealClass || nestedInConstructor( enclosure) then
161
164
// Constructors and methods nested inside traits get the free variables
162
- // of the enclosing trait or class.
165
+ // of the enclosing trait or class.
163
166
// Conversely, local traits do not get free variables.
167
+ // Methods inside constructors also don't have intermediates,
168
+ // need to get all their free variables passed directly.
164
169
if (! enclosure.is(Trait ))
165
170
if (symSet(free, enclosure).add(sym)) {
166
171
changedFreeVars = true
@@ -301,7 +306,7 @@ object LambdaLift {
301
306
private def generateProxies ()(implicit ctx : Context ): Unit =
302
307
for ((owner, freeValues) <- free.iterator) {
303
308
val newFlags = Synthetic | (if (owner.isClass) ParamAccessor | Private else Param )
304
- ctx.debuglog(i " free var proxy: ${owner.showLocated}, ${freeValues.toList}%, % " )
309
+ ctx.debuglog(i " free var proxy of ${owner.showLocated}: ${freeValues.toList}%, % " )
305
310
proxyMap(owner) = {
306
311
for (fv <- freeValues.toList) yield {
307
312
val proxyName = newName(fv)
0 commit comments