diff options
author | odersky <odersky@gmail.com> | 2017-02-22 16:35:13 +0100 |
---|---|---|
committer | Guillaume Martres <smarter@ubuntu.com> | 2017-02-22 16:35:13 +0100 |
commit | 6eeb06facb4e0afca9b11b7859a929b31fc23f25 (patch) | |
tree | 428c7ecc2f07e85088d9afe615f2a804d487c4f5 | |
parent | 8a826ee3d7a7a7230dea8cc1fa4f87b70e8efe81 (diff) | |
download | dotty-6eeb06facb4e0afca9b11b7859a929b31fc23f25.tar.gz dotty-6eeb06facb4e0afca9b11b7859a929b31fc23f25.tar.bz2 dotty-6eeb06facb4e0afca9b11b7859a929b31fc23f25.zip |
Fix #2009: Fix placeholder params logic for lambdas (#2019)
* Fix #2009: Fix placeholder params logic for lambdas
Logic was missing placeholders in rhs of lambdas.
* Add comment
* Fix typo
-rw-r--r-- | compiler/src/dotty/tools/dotc/parsing/Parsers.scala | 16 | ||||
-rw-r--r-- | tests/pos/i2009.scala | 9 |
2 files changed, 18 insertions, 7 deletions
diff --git a/compiler/src/dotty/tools/dotc/parsing/Parsers.scala b/compiler/src/dotty/tools/dotc/parsing/Parsers.scala index b46bc401d..c14108d2e 100644 --- a/compiler/src/dotty/tools/dotc/parsing/Parsers.scala +++ b/compiler/src/dotty/tools/dotc/parsing/Parsers.scala @@ -993,20 +993,22 @@ object Parsers { else { val saved = placeholderParams placeholderParams = Nil + + def wrapPlaceholders(t: Tree) = try + if (placeholderParams.isEmpty) t + else new WildcardFunction(placeholderParams.reverse, t) + finally placeholderParams = saved + val t = expr1(location) if (in.token == ARROW) { - placeholderParams = saved - closureRest(start, location, convertToParams(t)) + placeholderParams = Nil // don't interpret `_' to the left of `=>` as placeholder + wrapPlaceholders(closureRest(start, location, convertToParams(t))) } else if (isWildcard(t)) { placeholderParams = placeholderParams ::: saved t } - else - try - if (placeholderParams.isEmpty) t - else new WildcardFunction(placeholderParams.reverse, t) - finally placeholderParams = saved + else wrapPlaceholders(t) } } diff --git a/tests/pos/i2009.scala b/tests/pos/i2009.scala new file mode 100644 index 000000000..e2cf47203 --- /dev/null +++ b/tests/pos/i2009.scala @@ -0,0 +1,9 @@ +object Test { + + trait Gen[T] { + def map[U](f: T => U): Gen[U] = ??? + } + + def f[T](implicit g: Gen[T]): Gen[() => T] = + g map ( () => _ ) +} |