diff options
author | Josh Suereth <Joshua.Suereth@gmail.com> | 2012-06-08 13:23:16 -0700 |
---|---|---|
committer | Josh Suereth <Joshua.Suereth@gmail.com> | 2012-06-08 13:23:16 -0700 |
commit | 8bc3352573bb8cd7e993608697e02f1fefd50ec1 (patch) | |
tree | b7542e51fa406b5b91553b0b85764a662523340f /src | |
parent | 59f0214e5d8603572f50514666ec24e274747369 (diff) | |
parent | 09bf95675b06a0912ab1e3c8cdcab9a19eca48d4 (diff) | |
download | scala-8bc3352573bb8cd7e993608697e02f1fefd50ec1.tar.gz scala-8bc3352573bb8cd7e993608697e02f1fefd50ec1.tar.bz2 scala-8bc3352573bb8cd7e993608697e02f1fefd50ec1.zip |
Merge pull request #660 from retronym/ticket/5167-3
SI-5167 An impl class method should refer to its own parameter symbols.
Diffstat (limited to 'src')
-rw-r--r-- | src/compiler/scala/tools/nsc/transform/AddInterfaces.scala | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/src/compiler/scala/tools/nsc/transform/AddInterfaces.scala b/src/compiler/scala/tools/nsc/transform/AddInterfaces.scala index e5fc98f23c..8c5d25e6c4 100644 --- a/src/compiler/scala/tools/nsc/transform/AddInterfaces.scala +++ b/src/compiler/scala/tools/nsc/transform/AddInterfaces.scala @@ -257,11 +257,21 @@ abstract class AddInterfaces extends InfoTransform { self: Erasure => /** Transforms the member tree containing the implementation * into a member of the impl class. */ - private def implMethodDef(tree: Tree): Tree = ( - implMethodMap get tree.symbol - map (impl => new ChangeOwnerAndReturnTraverser(tree.symbol, impl)(tree setSymbol impl)) - getOrElse abort("implMethod missing for " + tree.symbol) - ) + private def implMethodDef(tree: Tree): Tree = { + val impl = implMethodMap.getOrElse(tree.symbol, abort("implMethod missing for " + tree.symbol)) + + val newTree = if (impl.isErroneous) tree else { // e.g. res/t687 + // SI-5167: Ensure that the tree that we are grafting refers the parameter symbols from the + // new method symbol `impl`, rather than the symbols of the original method signature in + // the trait. `tree setSymbol impl` does *not* suffice! + val DefDef(_, _, _, vparamss, _, _) = tree + val oldSyms = vparamss.flatten.map(_.symbol) + val newSyms = impl.info.paramss.flatten + assert(oldSyms.length == newSyms.length, (oldSyms, impl, impl.info)) + tree.substTreeSyms(oldSyms, newSyms) + } + new ChangeOwnerAndReturnTraverser(newTree.symbol, impl)(newTree setSymbol impl) + } /** Add mixin constructor definition * def $init$(): Unit = () |