diff options
author | Adriaan Moors <adriaan.moors@epfl.ch> | 2012-07-02 02:27:04 -0700 |
---|---|---|
committer | Adriaan Moors <adriaan.moors@epfl.ch> | 2012-07-02 02:27:04 -0700 |
commit | 2d68576e91a0dc5a2a119ef2df68458a0e139ce3 (patch) | |
tree | f171769a264edbc31e752cd6bf81b925c5b5b8a2 /src/compiler/scala/tools/nsc/typechecker/EtaExpansion.scala | |
parent | fd3118c3d2c99f24ae226d50b5487e235bdbd4d1 (diff) | |
parent | d9d5dcd1e21c215826a915db47eaf993621e0441 (diff) | |
download | scala-2d68576e91a0dc5a2a119ef2df68458a0e139ce3.tar.gz scala-2d68576e91a0dc5a2a119ef2df68458a0e139ce3.tar.bz2 scala-2d68576e91a0dc5a2a119ef2df68458a0e139ce3.zip |
Merge pull request #771 from retronym/ticket/4176-2
SI-4176 A repeat dose of repeated parameter type sanitization.
Diffstat (limited to 'src/compiler/scala/tools/nsc/typechecker/EtaExpansion.scala')
-rw-r--r-- | src/compiler/scala/tools/nsc/typechecker/EtaExpansion.scala | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/EtaExpansion.scala b/src/compiler/scala/tools/nsc/typechecker/EtaExpansion.scala index 177d1ddf19..69b27045ab 100644 --- a/src/compiler/scala/tools/nsc/typechecker/EtaExpansion.scala +++ b/src/compiler/scala/tools/nsc/typechecker/EtaExpansion.scala @@ -109,11 +109,20 @@ trait EtaExpansion { self: Analyzer => */ def expand(tree: Tree, tpe: Type): Tree = tpe match { case mt @ MethodType(paramSyms, restpe) if !mt.isImplicit => - val params = paramSyms map (sym => - ValDef(Modifiers(SYNTHETIC | PARAM), - sym.name.toTermName, TypeTree(sym.tpe) , EmptyTree)) + val params: List[(ValDef, Boolean)] = paramSyms.map { + sym => + val origTpe = sym.tpe + val isRepeated = definitions.isRepeatedParamType(origTpe) + // SI-4176 Don't leak A* in eta-expanded function types. See t4176b.scala + val droppedStarTpe = if (settings.etaExpandKeepsStar.value) origTpe else dropRepeatedParamType(origTpe) + val valDef = ValDef(Modifiers(SYNTHETIC | PARAM), sym.name.toTermName, TypeTree(droppedStarTpe), EmptyTree) + (valDef, isRepeated) + } atPos(tree.pos.makeTransparent) { - Function(params, expand(Apply(tree, params map gen.paramToArg), restpe)) + val args = params.map { + case (valDef, isRepeated) => gen.paramToArg(Ident(valDef.name), isRepeated) + } + Function(params.map(_._1), expand(Apply(tree, args), restpe)) } case _ => tree |