@@ -218,32 +218,15 @@ object desugar {
218
218
* def f$default$2[T](x: Int) = x + "m"
219
219
*/
220
220
private def defDef (meth : DefDef , isPrimaryConstructor : Boolean = false )(using Context ): Tree =
221
- addDefaultGetters(elimContextBounds(Nil , meth, isPrimaryConstructor))
221
+ addDefaultGetters(elimContextBounds(meth, isPrimaryConstructor))
222
222
223
- private def defDef (extParamss : List [ParamClause ], meth : DefDef )(using Context ): Tree =
224
- addDefaultGetters(elimContextBounds(extParamss, meth, false ))
225
-
226
- private def elimContextBounds (extParamss : List [ParamClause ], meth : DefDef , isPrimaryConstructor : Boolean )(using Context ): DefDef =
223
+ private def elimContextBounds (meth : DefDef , isPrimaryConstructor : Boolean )(using Context ): DefDef =
227
224
val DefDef (_, paramss, tpt, rhs) = meth
228
-
229
- rhs match
230
- case MacroTree (call) =>
231
- cpy.DefDef (meth)(rhs = call).withMods(meth.mods | Macro | Erased )
232
- case _ =>
233
- cpy.DefDef (meth)(
234
- name = normalizeName(meth, tpt).asTermName,
235
- paramss =
236
- elimContextBounds(extParamss, isPrimaryConstructor, true ) ++
237
- elimContextBounds(paramss, isPrimaryConstructor, false )
238
- )
239
- end elimContextBounds
240
-
241
- private def elimContextBounds (paramss : List [ParamClause ], isPrimaryConstructor : Boolean , ext : Boolean )(using Context ): List [ParamClause ] =
242
225
val evidenceParamBuf = ListBuffer [ValDef ]()
243
226
244
227
def desugarContextBounds (rhs : Tree ): Tree = rhs match
245
228
case ContextBounds (tbounds, cxbounds) =>
246
- val iflag = if ext || sourceVersion.isAtLeast(`future`) then Given else Implicit
229
+ val iflag = if sourceVersion.isAtLeast(`future`) then Given else Implicit
247
230
evidenceParamBuf ++= makeImplicitParameters(
248
231
cxbounds, iflag, forPrimaryConstructor = isPrimaryConstructor)
249
232
tbounds
@@ -257,7 +240,15 @@ object desugar {
257
240
tparam => cpy.TypeDef (tparam)(rhs = desugarContextBounds(tparam.rhs))
258
241
}(identity)
259
242
260
- addEvidenceParams(paramssNoContextBounds, evidenceParamBuf.toList)
243
+ rhs match
244
+ case MacroTree (call) =>
245
+ cpy.DefDef (meth)(rhs = call).withMods(meth.mods | Macro | Erased )
246
+ case _ =>
247
+ addEvidenceParams(
248
+ cpy.DefDef (meth)(
249
+ name = normalizeName(meth, tpt).asTermName,
250
+ paramss = paramssNoContextBounds),
251
+ evidenceParamBuf.toList)
261
252
end elimContextBounds
262
253
263
254
def addDefaultGetters (meth : DefDef )(using Context ): Tree =
@@ -357,22 +348,22 @@ object desugar {
357
348
adaptToExpectedTpt(tree)
358
349
}
359
350
360
- /** Add all evidence parameters in `params` as implicit parameters to `paramss `.
361
- * If the parameters of `paramss ` end in an implicit parameter list or using clause,
351
+ /** Add all evidence parameters in `params` as implicit parameters to `meth `.
352
+ * If the parameters of `meth ` end in an implicit parameter list or using clause,
362
353
* evidence parameters are added in front of that list. Otherwise they are added
363
354
* as a separate parameter clause.
364
355
*/
365
-
366
- private def addEvidenceParams ( paramss : List [ ParamClause ], params : List [ ValDef ])( using Context ) : List [ ParamClause ] =
367
- paramss.reverse match
368
- case ValDefs (vparams @ (vparam :: _)) :: rparamss if vparam.mods.isOneOf( GivenOrImplicit ) =>
369
- ((params ++ vparams) :: rparamss).reverse
370
- case _ =>
371
- params match
372
- case Nil =>
373
- paramss
374
- case evidenceParams =>
375
- paramss :+ evidenceParams
356
+ private def addEvidenceParams ( meth : DefDef , params : List [ ValDef ])( using Context ) : DefDef =
357
+ params match
358
+ case Nil =>
359
+ meth
360
+ case evidenceParams =>
361
+ val paramss1 = meth.paramss.reverse match
362
+ case ValDefs (vparams @ (vparam :: _)) :: rparamss if vparam.mods.isOneOf( GivenOrImplicit ) =>
363
+ ((evidenceParams ++ vparams) :: rparamss).reverse
364
+ case _ =>
365
+ meth.paramss :+ evidenceParams
366
+ cpy. DefDef (meth)( paramss = paramss1)
376
367
377
368
/** The implicit evidence parameters of `meth`, as generated by `desugar.defDef` */
378
369
private def evidenceParams (meth : DefDef )(using Context ): List [ValDef ] =
@@ -496,8 +487,9 @@ object desugar {
496
487
case ddef : DefDef if ddef.name.isConstructorName =>
497
488
decompose(
498
489
defDef(
499
- cpy.DefDef (ddef)(paramss = addEvidenceParams(joinParams(constrTparams, ddef.paramss),
500
- evidenceParams(constr1).map(toDefParam(_, keepAnnotations = false , keepDefault = false ))))))
490
+ addEvidenceParams(
491
+ cpy.DefDef (ddef)(paramss = joinParams(constrTparams, ddef.paramss)),
492
+ evidenceParams(constr1).map(toDefParam(_, keepAnnotations = false , keepDefault = false )))))
501
493
case stat =>
502
494
stat
503
495
}
@@ -907,29 +899,34 @@ object desugar {
907
899
/** Transform extension construct to list of extension methods */
908
900
def extMethods (ext : ExtMethods )(using Context ): Tree = flatTree {
909
901
for mdef <- ext.methods yield
910
- def ret (ess : List [ParamClause ], mss : List [ParamClause ]) =
911
- defDef(
912
- ess,
913
- cpy.DefDef (mdef)(
914
- name = normalizeName(mdef, ext).asTermName,
915
- paramss = mss
916
- ).withMods(mdef.mods | ExtensionMethod )
917
- )
918
- mdef.paramss match
919
- case params1 :: paramss1 if mdef.name.isRightAssocOperatorName =>
920
- def badRightAssoc (problem : String ) =
921
- report.error(i " right-associative extension method $problem" , mdef.srcPos)
922
- ret(ext.paramss, mdef.paramss)
923
- params1 match
924
- case ValDefs (vparam :: Nil ) =>
925
- if ! vparam.mods.is(Given ) then
926
- val (leadingUsing, otherExtParamss) = ext.paramss.span(isUsingOrTypeParamClause)
927
- ret(Nil , leadingUsing ::: params1 :: otherExtParamss ::: paramss1)
928
- else badRightAssoc(" cannot start with using clause" )
902
+ defDef(
903
+ cpy.DefDef (mdef)(
904
+ name = normalizeName(mdef, ext).asTermName,
905
+ paramss = mdef.paramss match
906
+ case params1 :: paramss1 if mdef.name.isRightAssocOperatorName =>
907
+ def badRightAssoc (problem : String ) =
908
+ report.error(i " right-associative extension method $problem" , mdef.srcPos)
909
+ ext.paramss ++ mdef.paramss
910
+ def noVParam = badRightAssoc(" must start with a single parameter" )
911
+ def checkVparam (params : ParamClause ) = params match
912
+ case ValDefs (vparam :: Nil ) =>
913
+ if ! vparam.mods.is(Given ) then
914
+ val (leadingUsing, otherExtParamss) = ext.paramss.span(isUsingOrTypeParamClause)
915
+ leadingUsing ::: params1 :: otherExtParamss ::: paramss1
916
+ else badRightAssoc(" cannot start with using clause" )
917
+ case _ =>
918
+ noVParam
919
+ params1 match
920
+ case TypeDefs (_) => paramss1 match
921
+ case params2 :: _ => checkVparam(params2)
922
+ case _ => noVParam
923
+ case _ =>
924
+ checkVparam(params1)
925
+
929
926
case _ =>
930
- badRightAssoc( " must start with a single parameter " )
931
- case _ =>
932
- ret(ext.paramss, mdef.paramss )
927
+ ext.paramss ++ mdef.paramss
928
+ ).withMods(mdef.mods | ExtensionMethod )
929
+ )
933
930
}
934
931
935
932
/** Transforms
0 commit comments