@@ -902,28 +902,37 @@ object desugar {
902
902
defDef(
903
903
cpy.DefDef (mdef)(
904
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 (pre : List [ParamClause ], params : ParamClause , paramss : List [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 ::: pre ::: params :: otherExtParamss ::: paramss
916
- else badRightAssoc(" cannot start with using clause" )
905
+ paramss =
906
+ if mdef.name.isRightAssocOperatorName then
907
+ val (typaramss, paramss) = mdef.paramss.span(isTypeParamClause) // first extract type parameters
908
+
909
+ paramss match
910
+ case params :: paramss1 => // `params` must have a single parameter and without `given` flag
911
+
912
+ def badRightAssoc (problem : String ) =
913
+ report.error(i " right-associative extension method $problem" , mdef.srcPos)
914
+ ext.paramss ++ mdef.paramss
915
+
916
+ params match
917
+ case ValDefs (vparam :: Nil ) =>
918
+ if ! vparam.mods.is(Given ) then
919
+ // we merge the extension parameters with the method parameters,
920
+ // swapping the operator arguments:
921
+ // e.g.
922
+ // extension [A](using B)(c: C)(using D)
923
+ // def %:[E](f: F)(g: G)(using H): Res = ???
924
+ // will be encoded as
925
+ // def %:[A](using B)[E](f: F)(c: C)(using D)(g: G)(using H): Res = ???
926
+ val (leadingUsing, otherExtParamss) = ext.paramss.span(isUsingOrTypeParamClause)
927
+ leadingUsing ::: typaramss ::: params :: otherExtParamss ::: paramss1
928
+ else
929
+ badRightAssoc(" cannot start with using clause" )
930
+ case _ =>
931
+ badRightAssoc(" must start with a single parameter" )
917
932
case _ =>
918
- noVParam
919
- params1 match
920
- case TypeDefs (_) => paramss1 match
921
- case params2 :: paramss2 => checkVparam(params1:: Nil , params2, paramss2)
922
- case _ => noVParam
923
- case _ =>
924
- checkVparam(Nil , params1, paramss1)
925
-
926
- case _ =>
933
+ // no value parameters, so not an infix operator.
934
+ ext.paramss ++ mdef.paramss
935
+ else
927
936
ext.paramss ++ mdef.paramss
928
937
).withMods(mdef.mods | ExtensionMethod )
929
938
)
0 commit comments