aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2016-02-16 16:11:09 +0100
committerMartin Odersky <odersky@gmail.com>2016-02-16 16:11:09 +0100
commit17296763448bf86c9f95b1458e5722b9829e8b3e (patch)
tree7554d9011d9f9eb140a3e0680265ad3eccb77457
parent06bfbd379fe350a93e3de38940fda0e359a07e1d (diff)
downloaddotty-17296763448bf86c9f95b1458e5722b9829e8b3e.tar.gz
dotty-17296763448bf86c9f95b1458e5722b9829e8b3e.tar.bz2
dotty-17296763448bf86c9f95b1458e5722b9829e8b3e.zip
Untuple using `def` not `val`.
As retronym noted on #897, `val` forces to early.
-rw-r--r--src/dotty/tools/dotc/ast/Desugar.scala9
-rw-r--r--src/dotty/tools/dotc/typer/Typer.scala2
-rw-r--r--tests/run/function-arity.scala8
3 files changed, 14 insertions, 5 deletions
diff --git a/src/dotty/tools/dotc/ast/Desugar.scala b/src/dotty/tools/dotc/ast/Desugar.scala
index c1083d26d..991940f10 100644
--- a/src/dotty/tools/dotc/ast/Desugar.scala
+++ b/src/dotty/tools/dotc/ast/Desugar.scala
@@ -591,18 +591,19 @@ object desugar {
/** Map n-ary function `(p1, ..., pn) => body` where n != 1 to unary function as follows:
*
* x$1 => {
- * val p1 = x$1._1
+ * def p1 = x$1._1
* ...
- * val pn = x$1._n
+ * def pn = x$1._n
* body
* }
*/
- def makeUnaryCaseLambda(params: List[ValDef], body: Tree)(implicit ctx: Context): Tree = {
+ def makeTupledFunction(params: List[ValDef], body: Tree)(implicit ctx: Context): Tree = {
val param = makeSyntheticParameter()
def selector(n: Int) = Select(refOfDef(param), nme.selectorName(n))
val vdefs =
params.zipWithIndex.map{
- case(param, idx) => cpy.ValDef(param)(rhs = selector(idx))
+ case (param, idx) =>
+ DefDef(param.name, Nil, Nil, TypeTree(), selector(idx)).withPos(param.pos)
}
Function(param :: Nil, Block(vdefs, body))
}
diff --git a/src/dotty/tools/dotc/typer/Typer.scala b/src/dotty/tools/dotc/typer/Typer.scala
index f1e1d9286..4d2ab3552 100644
--- a/src/dotty/tools/dotc/typer/Typer.scala
+++ b/src/dotty/tools/dotc/typer/Typer.scala
@@ -624,7 +624,7 @@ class Typer extends Namer with TypeAssigner with Applications with Implicits wit
val desugared =
if (protoFormals.length == 1 && params.length != 1 && ptIsCorrectProduct(protoFormals.head)) {
- desugar.makeUnaryCaseLambda(params, fnBody)
+ desugar.makeTupledFunction(params, fnBody)
}
else {
val inferredParams: List[untpd.ValDef] =
diff --git a/tests/run/function-arity.scala b/tests/run/function-arity.scala
new file mode 100644
index 000000000..6d7e5bce1
--- /dev/null
+++ b/tests/run/function-arity.scala
@@ -0,0 +1,8 @@
+object Test {
+ class T[A] { def foo(f: (=> A) => Int) = f(???) }
+
+ def main(args: Array[String]): Unit = {
+ new T[(Int, Int)].foo((ii) => 0)
+ new T[(Int, Int)].foo((x, y) => 0) // check that this does not run into ???
+ }
+}