@@ -218,32 +218,15 @@ object desugar {
218218 * def f$default$2[T](x: Int) = x + "m"
219219 */
220220 private def defDef (meth : DefDef , isPrimaryConstructor : Boolean = false )(using Context ): Tree =
221- addDefaultGetters(elimContextBounds(Nil , meth, isPrimaryConstructor))
221+ addDefaultGetters(elimContextBounds(meth, isPrimaryConstructor))
222222
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 =
227224 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 ] =
242225 val evidenceParamBuf = ListBuffer [ValDef ]()
243226
244227 def desugarContextBounds (rhs : Tree ): Tree = rhs match
245228 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
247230 evidenceParamBuf ++= makeImplicitParameters(
248231 cxbounds, iflag, forPrimaryConstructor = isPrimaryConstructor)
249232 tbounds
@@ -257,7 +240,15 @@ object desugar {
257240 tparam => cpy.TypeDef (tparam)(rhs = desugarContextBounds(tparam.rhs))
258241 }(identity)
259242
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)
261252 end elimContextBounds
262253
263254 def addDefaultGetters (meth : DefDef )(using Context ): Tree =
@@ -357,22 +348,22 @@ object desugar {
357348 adaptToExpectedTpt(tree)
358349 }
359350
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,
362353 * evidence parameters are added in front of that list. Otherwise they are added
363354 * as a separate parameter clause.
364355 */
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)
376367
377368 /** The implicit evidence parameters of `meth`, as generated by `desugar.defDef` */
378369 private def evidenceParams (meth : DefDef )(using Context ): List [ValDef ] =
@@ -496,8 +487,9 @@ object desugar {
496487 case ddef : DefDef if ddef.name.isConstructorName =>
497488 decompose(
498489 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 )))))
501493 case stat =>
502494 stat
503495 }
@@ -907,29 +899,34 @@ object desugar {
907899 /** Transform extension construct to list of extension methods */
908900 def extMethods (ext : ExtMethods )(using Context ): Tree = flatTree {
909901 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+
929926 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+ )
933930 }
934931
935932 /** Transforms
0 commit comments