diff options
author | Martin Odersky <odersky@gmail.com> | 2015-12-19 17:28:25 +0100 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2015-12-19 17:30:22 +0100 |
commit | 1de9e43ce85f7ddc93e21c4c7dc2c8b6558e95fb (patch) | |
tree | c7f8a87c4be44e9b571098b196c87b4dd19f9a37 /src | |
parent | 4619393a6c3b52127ceec07e2fc3630d22aef51a (diff) | |
download | dotty-1de9e43ce85f7ddc93e21c4c7dc2c8b6558e95fb.tar.gz dotty-1de9e43ce85f7ddc93e21c4c7dc2c8b6558e95fb.tar.bz2 dotty-1de9e43ce85f7ddc93e21c4c7dc2c8b6558e95fb.zip |
Fix eta lifting for functions with vararg parameters.
Diffstat (limited to 'src')
-rw-r--r-- | src/dotty/tools/dotc/ast/untpd.scala | 9 | ||||
-rw-r--r-- | src/dotty/tools/dotc/typer/EtaExpansion.scala | 4 |
2 files changed, 7 insertions, 6 deletions
diff --git a/src/dotty/tools/dotc/ast/untpd.scala b/src/dotty/tools/dotc/ast/untpd.scala index 28a3cf1ff..85052a4da 100644 --- a/src/dotty/tools/dotc/ast/untpd.scala +++ b/src/dotty/tools/dotc/ast/untpd.scala @@ -234,12 +234,13 @@ object untpd extends Trees.Instance[Untyped] with UntypedTreeInfo { * parameter, the reference will be a repeated argument. */ def refOfDef(tree: MemberDef)(implicit ctx: Context) = tree match { - case ValDef(_, PostfixOp(_, nme.raw.STAR), _) => - Typed(Ident(tree.name), Ident(tpnme.WILDCARD_STAR)) - case _ => - Ident(tree.name) + case ValDef(_, PostfixOp(_, nme.raw.STAR), _) => repeated(Ident(tree.name)) + case _ => Ident(tree.name) } + /** A repeated argument such as `arg: _*` */ + def repeated(arg: Tree)(implicit ctx: Context) = Typed(arg, Ident(tpnme.WILDCARD_STAR)) + // ------- Decorators ------------------------------------------------- implicit class UntypedTreeDecorator(val self: Tree) extends AnyVal { diff --git a/src/dotty/tools/dotc/typer/EtaExpansion.scala b/src/dotty/tools/dotc/typer/EtaExpansion.scala index 89415024e..42fcd94a4 100644 --- a/src/dotty/tools/dotc/typer/EtaExpansion.scala +++ b/src/dotty/tools/dotc/typer/EtaExpansion.scala @@ -141,8 +141,8 @@ object EtaExpansion { else mt.paramTypes map TypeTree val params = (mt.paramNames, paramTypes).zipped.map((name, tpe) => ValDef(name, TypeTree(tpe), EmptyTree).withFlags(Synthetic | Param).withPos(tree.pos)) - val ids = mt.paramNames map (name => - Ident(name).withPos(tree.pos)) + var ids: List[Tree] = mt.paramNames map (name => Ident(name).withPos(tree.pos)) + if (mt.paramTypes.last.isRepeatedParam)ids = ids.init :+ repeated(ids.last) val body = Apply(lifted, ids) val fn = untpd.Function(params, body) if (defs.nonEmpty) untpd.Block(defs.toList map untpd.TypedSplice, fn) else fn |