diff options
author | Dmitry Petrashko <dark@d-d.me> | 2015-04-01 19:46:37 +0200 |
---|---|---|
committer | Dmitry Petrashko <dark@d-d.me> | 2015-04-01 19:46:37 +0200 |
commit | d6273d66567a48cdc80df4222232a9857072d323 (patch) | |
tree | 59c339d3fe95837c104b3ace5defbb4bbcd7f5f4 /src/dotty/tools/dotc/transform/Erasure.scala | |
parent | 668890cb1b467652cecdb3b44361c32476aa405f (diff) | |
parent | ccf3951b5fa7dde2c5aa08eb192024c740ec9697 (diff) | |
download | dotty-d6273d66567a48cdc80df4222232a9857072d323.tar.gz dotty-d6273d66567a48cdc80df4222232a9857072d323.tar.bz2 dotty-d6273d66567a48cdc80df4222232a9857072d323.zip |
Merge pull request #449 from dotty-staging/fix-context-in-forwarders
Fixes that make bridges smaller.
Diffstat (limited to 'src/dotty/tools/dotc/transform/Erasure.scala')
-rw-r--r-- | src/dotty/tools/dotc/transform/Erasure.scala | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/src/dotty/tools/dotc/transform/Erasure.scala b/src/dotty/tools/dotc/transform/Erasure.scala index 1b5f1ffba..3674f7375 100644 --- a/src/dotty/tools/dotc/transform/Erasure.scala +++ b/src/dotty/tools/dotc/transform/Erasure.scala @@ -504,19 +504,27 @@ object Erasure extends TypeTestsCasts{ } def makeBridgeDef(newDef: tpd.DefDef, parentSym: Symbol)(implicit ctx: Context): tpd.DefDef = { + val newDefSym = newDef.symbol + val currentClass = newDefSym.owner.asClass + def error(reason: String) = { - assert(false, s"failure creating bridge from ${newDef.symbol} to ${parentSym}, reason: $reason") + assert(false, s"failure creating bridge from ${newDefSym} to ${parentSym}, reason: $reason") ??? } - val bridge = ctx.newSymbol(newDef.symbol.owner, - parentSym.name, parentSym.flags | Flags.Bridge, parentSym.info, coord = newDef.symbol.owner.coord).asTerm + val bridge = ctx.newSymbol(currentClass, + parentSym.name, parentSym.flags | Flags.Bridge, parentSym.info, coord = newDefSym.owner.coord).asTerm bridge.enteredAfter(ctx.phase.prev.asInstanceOf[DenotTransformer]) // this should be safe, as we're executing in context of next phase - ctx.debuglog(s"generating bridge from ${newDef.symbol} to $bridge") + ctx.debuglog(s"generating bridge from ${newDefSym} to $bridge") + + val sel: Tree = This(currentClass).select(newDefSym.termRef) - val sel: Tree = This(newDef.symbol.owner.asClass).select(newDef.symbol.termRef) + val resultType = parentSym.info.widen.resultType + + val bridgeCtx = ctx.withOwner(bridge) - val resultType = bridge.info.widen.resultType tpd.DefDef(bridge, { paramss: List[List[tpd.Tree]] => + implicit val ctx: Context = bridgeCtx + val rhs = paramss.foldLeft(sel)((fun, vparams) => fun.tpe.widen match { case MethodType(names, types) => Apply(fun, (vparams, types).zipped.map(adapt(_, _, untpd.EmptyTree))) |