aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/ast/Desugar.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2015-09-12 11:38:00 +0200
committerMartin Odersky <odersky@gmail.com>2015-09-12 12:36:57 +0200
commit5386c88b6e8d2f2ccf68e7d4e14b5fde6faf562f (patch)
treedd65496a2fae68a8efefd9e877c4c356ec2650a5 /src/dotty/tools/dotc/ast/Desugar.scala
parent6fc42dd9ea03e30f475e4eaec3e1bf95c35de0d0 (diff)
downloaddotty-5386c88b6e8d2f2ccf68e7d4e14b5fde6faf562f.tar.gz
dotty-5386c88b6e8d2f2ccf68e7d4e14b5fde6faf562f.tar.bz2
dotty-5386c88b6e8d2f2ccf68e7d4e14b5fde6faf562f.zip
Fix desugaring problem
Desugaring worked incorrectly when both context bounds and default parameters were present.
Diffstat (limited to 'src/dotty/tools/dotc/ast/Desugar.scala')
-rw-r--r--src/dotty/tools/dotc/ast/Desugar.scala17
1 files changed, 11 insertions, 6 deletions
diff --git a/src/dotty/tools/dotc/ast/Desugar.scala b/src/dotty/tools/dotc/ast/Desugar.scala
index 30467f185..b834211ac 100644
--- a/src/dotty/tools/dotc/ast/Desugar.scala
+++ b/src/dotty/tools/dotc/ast/Desugar.scala
@@ -118,11 +118,11 @@ object desugar {
*
* Expand default arguments to default getters. E.g,
*
- * def f(x: Int = 1)(y: String = x + "m") = ...
+ * def f[T: B](x: Int = 1)(y: String = x + "m") = ...
* ==>
- * def f(x: Int)(y: String) = ...
- * def f$default$1 = 1
- * def f$default$2(x: Int) = x + "m"
+ * def f[T](x: Int)(y: String)(implicit evidence$0: B[T]) = ...
+ * def f$default$1[T] = 1
+ * def f$default$2[T](x: Int) = x + "m"
*/
def defDef(meth: DefDef, isPrimaryConstructor: Boolean = false)(implicit ctx: Context): Tree = {
val DefDef(name, tparams, vparamss, tpt, rhs) = meth
@@ -162,15 +162,20 @@ object desugar {
Nil
}
- def normalizedVparamss = vparamss map (_ map (vparam =>
+ def normalizedVparamss = meth1.vparamss map (_ map (vparam =>
cpy.ValDef(vparam)(rhs = EmptyTree)))
+ def dropContextBound(tparam: TypeDef) = tparam.rhs match {
+ case ContextBounds(tbounds, _) => cpy.TypeDef(tparam)(rhs = tbounds)
+ case _ => tparam
+ }
+
def defaultGetters(vparamss: List[List[ValDef]], n: Int): List[DefDef] = vparamss match {
case (vparam :: vparams) :: vparamss1 =>
def defaultGetter: DefDef =
DefDef(
name = meth.name.defaultGetterName(n),
- tparams = meth.tparams map toDefParam,
+ tparams = meth.tparams.map(tparam => dropContextBound(toDefParam(tparam))),
vparamss = takeUpTo(normalizedVparamss, n),
tpt = TypeTree(),
rhs = vparam.rhs