summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/compiler/scala/tools/nsc/transform/AddInterfaces.scala20
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 = ()