@@ -147,18 +147,7 @@ object desugar {
147
147
tparam
148
148
}
149
149
150
- val meth1 = epbuf.toList match {
151
- case Nil =>
152
- meth
153
- case evidenceParams =>
154
- val vparamss1 = vparamss.reverse match {
155
- case (vparams @ (vparam :: _)) :: rvparamss if vparam.mods is Implicit =>
156
- ((vparams ++ evidenceParams) :: rvparamss).reverse
157
- case _ =>
158
- vparamss :+ evidenceParams
159
- }
160
- cpy.DefDef (meth)(tparams = tparams1, vparamss = vparamss1)
161
- }
150
+ val meth1 = addEvidenceParams(cpy.DefDef (meth)(tparams = tparams1), epbuf.toList)
162
151
163
152
/** The longest prefix of parameter lists in vparamss whose total length does not exceed `n` */
164
153
def takeUpTo (vparamss : List [List [ValDef ]], n : Int ): List [List [ValDef ]] = vparamss match {
@@ -204,6 +193,30 @@ object desugar {
204
193
}
205
194
}
206
195
196
+ // Add all evidence parameters in `params` as implicit parameters to `meth` */
197
+ private def addEvidenceParams (meth : DefDef , params : List [ValDef ])(implicit ctx : Context ): DefDef =
198
+ params match {
199
+ case Nil =>
200
+ meth
201
+ case evidenceParams =>
202
+ val vparamss1 = meth.vparamss.reverse match {
203
+ case (vparams @ (vparam :: _)) :: rvparamss if vparam.mods is Implicit =>
204
+ ((vparams ++ evidenceParams) :: rvparamss).reverse
205
+ case _ =>
206
+ meth.vparamss :+ evidenceParams
207
+ }
208
+ cpy.DefDef (meth)(vparamss = vparamss1)
209
+ }
210
+
211
+ /** The implicit evidence parameters of `meth`, as generated by `desugar.defDef` */
212
+ private def evidenceParams (meth : DefDef )(implicit ctx : Context ): List [ValDef ] =
213
+ meth.vparamss.reverse match {
214
+ case (vparams @ (vparam :: _)) :: _ if vparam.mods is Implicit =>
215
+ vparams.dropWhile(! _.name.startsWith(nme.EVIDENCE_PARAM_PREFIX ))
216
+ case _ =>
217
+ Nil
218
+ }
219
+
207
220
/** Fill in empty type bounds with Nothing/Any. Expand private local type parameters as follows:
208
221
*
209
222
* class C[v T]
@@ -255,10 +268,13 @@ object desugar {
255
268
else constr1.vparamss.nestedMap(toDefParam)
256
269
val constr = cpy.DefDef (constr1)(tparams = constrTparams, vparamss = constrVparamss)
257
270
258
- // Add constructor type parameters to auxiliary constructors
271
+ // Add constructor type parameters and evidence implicit parameters
272
+ // to auxiliary constructors
259
273
val normalizedBody = impl.body map {
260
274
case ddef : DefDef if ddef.name.isConstructorName =>
261
- cpy.DefDef (ddef)(tparams = constrTparams)
275
+ addEvidenceParams(
276
+ cpy.DefDef (ddef)(tparams = constrTparams),
277
+ evidenceParams(constr1).map(toDefParam))
262
278
case stat =>
263
279
stat
264
280
}
0 commit comments