aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/ast/Desugar.scala
diff options
context:
space:
mode:
authorDmitry Petrashko <dark@d-d.me>2016-03-02 10:16:05 +0100
committerDmitry Petrashko <dark@d-d.me>2016-03-02 10:16:05 +0100
commitae624660d3cc31e9956d7e537c7a5c7925afda68 (patch)
tree12e28b3db9125c3afbb03c6331326f6fab29ae13 /src/dotty/tools/dotc/ast/Desugar.scala
parent0ae3ef2010b90bf06d76a768b0f0c5aa56c1180a (diff)
parent1d2fe4823bc4c8a69351d49229556ac3a1532778 (diff)
downloaddotty-ae624660d3cc31e9956d7e537c7a5c7925afda68.tar.gz
dotty-ae624660d3cc31e9956d7e537c7a5c7925afda68.tar.bz2
dotty-ae624660d3cc31e9956d7e537c7a5c7925afda68.zip
Merge pull request #1111 from dotty-staging/fix-#1099
Special case pattern matching against abstract types with class tags
Diffstat (limited to 'src/dotty/tools/dotc/ast/Desugar.scala')
-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 e9c641282..8ba155097 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
}