aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2016-02-18 17:25:31 +0100
committerMartin Odersky <odersky@gmail.com>2016-02-20 10:19:57 +0100
commit1f58090849a51787a4482a8d016a31f15f3c1b9b (patch)
tree23555e61c84282abcf54afc40f6095748fe8ef47
parent02b545211b3895d18e7e9b45289897a5ae447123 (diff)
downloaddotty-1f58090849a51787a4482a8d016a31f15f3c1b9b.tar.gz
dotty-1f58090849a51787a4482a8d016a31f15f3c1b9b.tar.bz2
dotty-1f58090849a51787a4482a8d016a31f15f3c1b9b.zip
Fix desugaring of classes with context bounds
Context bounds did not make it before into secondary constructors. Now the evidence parameters generated by context bounds get copied into secondary constructors. Without this fix, scala.collection.immutable.PagedSeq fails to compile in new classtag scheme.
-rw-r--r--src/dotty/tools/dotc/ast/Desugar.scala44
1 files changed, 30 insertions, 14 deletions
diff --git a/src/dotty/tools/dotc/ast/Desugar.scala b/src/dotty/tools/dotc/ast/Desugar.scala
index 31ebc4a7d..fcc055fc7 100644
--- a/src/dotty/tools/dotc/ast/Desugar.scala
+++ b/src/dotty/tools/dotc/ast/Desugar.scala
@@ -147,18 +147,7 @@ object desugar {
tparam
}
- val meth1 = epbuf.toList match {
- case Nil =>
- meth
- case evidenceParams =>
- val vparamss1 = vparamss.reverse match {
- case (vparams @ (vparam :: _)) :: rvparamss if vparam.mods is Implicit =>
- ((vparams ++ evidenceParams) :: rvparamss).reverse
- case _ =>
- vparamss :+ evidenceParams
- }
- cpy.DefDef(meth)(tparams = tparams1, vparamss = vparamss1)
- }
+ val meth1 = addEvidenceParams(cpy.DefDef(meth)(tparams = tparams1), epbuf.toList)
/** The longest prefix of parameter lists in vparamss whose total length does not exceed `n` */
def takeUpTo(vparamss: List[List[ValDef]], n: Int): List[List[ValDef]] = vparamss match {
@@ -204,6 +193,30 @@ object desugar {
}
}
+ // Add all evidence parameters in `params` as implicit parameters to `meth` */
+ private def addEvidenceParams(meth: DefDef, params: List[ValDef])(implicit ctx: Context): DefDef =
+ params match {
+ case Nil =>
+ meth
+ case evidenceParams =>
+ val vparamss1 = meth.vparamss.reverse match {
+ case (vparams @ (vparam :: _)) :: rvparamss if vparam.mods is Implicit =>
+ ((vparams ++ evidenceParams) :: rvparamss).reverse
+ case _ =>
+ meth.vparamss :+ evidenceParams
+ }
+ cpy.DefDef(meth)(vparamss = vparamss1)
+ }
+
+ /** The implicit evidence parameters of `meth`, as generated by `desugar.defDef` */
+ private def evidenceParams(meth: DefDef)(implicit ctx: Context): List[ValDef] =
+ meth.vparamss.reverse match {
+ case (vparams @ (vparam :: _)) :: _ if vparam.mods is Implicit =>
+ vparams.dropWhile(!_.name.startsWith(nme.EVIDENCE_PARAM_PREFIX))
+ case _ =>
+ Nil
+ }
+
/** Fill in empty type bounds with Nothing/Any. Expand private local type parameters as follows:
*
* class C[v T]
@@ -256,10 +269,13 @@ object desugar {
else constr1.vparamss.nestedMap(toDefParam)
val constr = cpy.DefDef(constr1)(tparams = constrTparams, vparamss = constrVparamss)
- // Add constructor type parameters to auxiliary constructors
+ // Add constructor type parameters and evidence implicit parameters
+ // to auxiliary constructors
val normalizedBody = impl.body map {
case ddef: DefDef if ddef.name.isConstructorName =>
- cpy.DefDef(ddef)(tparams = constrTparams)
+ addEvidenceParams(
+ cpy.DefDef(ddef)(tparams = constrTparams),
+ evidenceParams(constr1).map(toDefParam))
case stat =>
stat
}