@@ -309,22 +309,17 @@ abstract class LambdaLift extends InfoTransform {
309
309
afterOwnPhase {
310
310
for ((owner, freeValues) <- free.toList) {
311
311
val newFlags = SYNTHETIC | (
312
- if (owner.isTrait) PARAMACCESSOR | TRANS_FLAG // will need an impl in subclass that mixes in the trait
313
- else if (owner.isClass) PARAMACCESSOR | PrivateLocal
312
+ if (owner.isClass) PARAMACCESSOR | PrivateLocal
314
313
else PARAM )
315
314
316
315
proxies(owner) =
317
316
for (fv <- freeValues.toList) yield {
318
317
val proxyName = proxyNames.getOrElse(fv, fv.name)
319
- println(s " new proxy ${proxyName} in ${owner.fullLocationString}" )
320
- val proxy =
321
- if (owner.isTrait) owner.newMethod(proxyName.toTermName, owner.pos, newFlags.toLong) setInfo MethodType (Nil , fv.info)
322
- else owner.newValue(proxyName.toTermName, owner.pos, newFlags.toLong) setInfo fv.info
318
+ debuglog(s " new proxy ${proxyName} in ${owner.fullLocationString}" )
319
+ val proxy = owner.newValue(proxyName.toTermName, owner.pos, newFlags.toLong) setInfo fv.info
323
320
if (owner.isClass) owner.info.decls enter proxy
324
321
proxy
325
322
}
326
-
327
- proxies(owner.toInterface) = proxies(owner)
328
323
}
329
324
}
330
325
}
@@ -373,11 +368,7 @@ abstract class LambdaLift extends InfoTransform {
373
368
374
369
qual match {
375
370
case EmptyTree => EmptyTree
376
- case qual =>
377
- val sel = Select (qual, sym) setType sym.tpe
378
-
379
- if (sym.isParamAccessor && (sym hasFlag TRANS_FLAG )) Apply (sel, Nil ) setType sym.tpe.finalResultType
380
- else sel
371
+ case qual => Select (qual, sym) setType sym.tpe
381
372
}
382
373
}
383
374
@@ -388,43 +379,19 @@ abstract class LambdaLift extends InfoTransform {
388
379
389
380
def freeArgsOrNil (sym : Symbol ) = free.getOrElse(sym, Nil ).toList
390
381
391
- private def transformApply (tree : Apply ) = {
392
- val Apply (fn, args) = tree
393
- val sym = tree.symbol
394
- val pos = tree.pos
382
+ private def freeArgs (sym : Symbol ): List [Symbol ] =
383
+ freeArgsOrNil(sym)
395
384
396
- if (sym.isMethod && sym.isConstructor && sym.owner.isTrait) {
397
- // TODO: add types / symbols
398
- val inits = freeParams(currentOwner).map { ctorParam =>
399
- ugh, since we just mutate trees without first transforming infos, we can' t get to the symbol
400
- val proxyFieldSym = currentClass.info.decl(ctorParam.name)
401
- val proxyField = gen.mkAttributedSelect(gen.mkAttributedThis(currentClass), proxyFieldSym)
402
-
403
- atPos(currentOwner.pos)(Assign (proxyField, Ident (ctorParam))) setType BoxedUnitTpe
404
- }
405
- Block (inits, tree) setType tree.tpe setPos tree.pos
406
- } else {
407
- val newArgs =
408
- freeArgsOrNil(sym) match {
409
- case Nil => args
410
- case fvs => addFree (sym, free = fvs map (fv => atPos (pos) (proxyRef (fv) ) ), original = args)
411
- }
412
-
413
- treeCopy.Apply (tree, fn, newArgs)
385
+ private def addFreeArgs (pos : Position , sym : Symbol , args : List [Tree ]) =
386
+ freeArgs(sym) match {
387
+ case Nil => args
388
+ case fvs => addFree(sym, free = fvs map (fv => atPos(pos)(proxyRef(fv))), original = args)
414
389
}
415
- }
416
390
417
391
def proxiesOrNil (sym : Symbol ) = proxies.getOrElse(sym, Nil )
418
392
419
- private def mixinProxies (mixin : Symbol ): List [Symbol ] = {
420
- proxiesOrNil(mixin) map (mixedin => mixedin.cloneSymbol setFlag TRANS_FLAG )
421
- }
422
-
423
393
private def freeParams (sym : Symbol ): List [Symbol ] =
424
- if (sym.isMethod && sym.isConstructor && sym.owner.isTrait) Nil
425
- else if (sym.isClass && ! sym.isTrait)
426
- proxiesOrNil(sym) ++ (sym.mixinClasses flatMap mixinProxies)
427
- else proxiesOrNil(sym)
394
+ proxiesOrNil(sym)
428
395
429
396
private def addFreeParams (tree : Tree , sym : Symbol ): Tree =
430
397
tree match {
@@ -440,31 +407,12 @@ abstract class LambdaLift extends InfoTransform {
440
407
copyDefDef(tree)(vparamss = List (addFree(sym, free = paramDefs, original = vparams)))
441
408
}
442
409
443
- case ClassDef (_, _, _, _) if ! sym.isTrait =>
410
+ case ClassDef (_, _, _, _) =>
444
411
val freeParamDefs = freeParams(sym) map (p => ValDef (p) setPos tree.pos setType NoType )
445
412
446
413
if (freeParamDefs isEmpty) tree
447
414
else deriveClassDef(tree)(impl => deriveTemplate(impl)(_ ::: freeParamDefs))
448
415
449
- case ClassDef (_, _, _, _) =>
450
- // SI-2897, SI-6231
451
- // Disabled attempt to to add getters to freeParams
452
- // this does not work yet. Problem is that local symbols need local names
453
- // and references to local symbols need to be transformed into
454
- // method calls to setters.
455
- // def paramGetter(param: Symbol): Tree = {
456
- // val getter = param.newGetter setFlag TRANS_FLAG resetFlag PARAMACCESSOR // mark because we have to add them to interface
457
- // sym.info.decls.enter(getter)
458
- // val rhs = Select(gen.mkAttributedThis(sym), param) setType param.tpe
459
- // DefDef(getter, rhs) setPos tree.pos setType NoType
460
- // }
461
- val ps = freeParams(sym)
462
- if (ps isEmpty) tree
463
- else {
464
- val freeParams = ps map (p => DefDef (p, EmptyTree ) setPos tree.pos setType NoType )
465
- deriveClassDef(tree)(impl => deriveTemplate(impl)(_ ::: freeParams))
466
- }
467
-
468
416
case _ => tree
469
417
}
470
418
@@ -556,7 +504,8 @@ abstract class LambdaLift extends InfoTransform {
556
504
case Return (expr) =>
557
505
assert(sym == currentMethod, sym)
558
506
tree
559
- case tree : Apply => transformApply(tree)
507
+ case Apply (fn, args) =>
508
+ treeCopy.Apply (tree, fn, addFreeArgs(tree.pos, sym, args))
560
509
case Assign (Apply (TypeApply (sel @ Select (qual, _), _), List ()), rhs) =>
561
510
// eliminate casts introduced by selecting a captured variable field
562
511
// on the lhs of an assignment.
0 commit comments