@@ -902,28 +902,37 @@ object desugar {
902902 defDef(
903903 cpy.DefDef (mdef)(
904904 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" )
917932 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
927936 ext.paramss ++ mdef.paramss
928937 ).withMods(mdef.mods | ExtensionMethod )
929938 )
0 commit comments