@@ -3020,7 +3020,8 @@ object Parsers {
3020
3020
*/
3021
3021
def paramClauses (ofClass : Boolean = false ,
3022
3022
ofCaseClass : Boolean = false ,
3023
- givenOnly : Boolean = false ): List [List [ValDef ]] =
3023
+ givenOnly : Boolean = false ,
3024
+ numLeadParams : Int = 0 ): List [List [ValDef ]] =
3024
3025
3025
3026
def recur (firstClause : Boolean , nparams : Int ): List [List [ValDef ]] =
3026
3027
newLineOptWhenFollowedBy(LPAREN )
@@ -3039,7 +3040,7 @@ object Parsers {
3039
3040
else Nil
3040
3041
end recur
3041
3042
3042
- recur(firstClause = true , 0 )
3043
+ recur(firstClause = true , numLeadParams )
3043
3044
end paramClauses
3044
3045
3045
3046
/* -------- DEFS ------------------------------------------- */
@@ -3244,7 +3245,7 @@ object Parsers {
3244
3245
* DefSig ::= id [DefTypeParamClause] DefParamClauses
3245
3246
* | ExtParamClause [nl] [‘.’] id DefParamClauses
3246
3247
*/
3247
- def defDefOrDcl (start : Offset , mods : Modifiers ): DefDef = atSpan(start, nameStart) {
3248
+ def defDefOrDcl (start : Offset , mods : Modifiers , numLeadParams : Int = 0 ): DefDef = atSpan(start, nameStart) {
3248
3249
3249
3250
def scala2ProcedureSyntax (resultTypeStr : String ) =
3250
3251
def toInsert =
@@ -3261,7 +3262,7 @@ object Parsers {
3261
3262
3262
3263
if (in.token == THIS ) {
3263
3264
in.nextToken()
3264
- val vparamss = paramClauses()
3265
+ val vparamss = paramClauses(numLeadParams = numLeadParams )
3265
3266
if (vparamss.isEmpty || vparamss.head.take(1 ).exists(_.mods.isOneOf(GivenOrImplicit )))
3266
3267
in.token match {
3267
3268
case LBRACKET => syntaxError(" no type parameters allowed here" )
@@ -3280,7 +3281,7 @@ object Parsers {
3280
3281
val ident = termIdent()
3281
3282
var name = ident.name.asTermName
3282
3283
val tparams = typeParamClauseOpt(ParamOwner .Def )
3283
- val vparamss = paramClauses()
3284
+ val vparamss = paramClauses(numLeadParams = numLeadParams )
3284
3285
var tpt = fromWithinReturnType {
3285
3286
if in.token == COLONEOL then in.token = COLON
3286
3287
// a hack to allow
@@ -3568,24 +3569,23 @@ object Parsers {
3568
3569
val start = in.skipToken()
3569
3570
val tparams = typeParamClauseOpt(ParamOwner .Def )
3570
3571
val leadParamss = ListBuffer [List [ValDef ]]()
3571
- var nparams = 0
3572
+ def nparams = leadParamss.map(_.length).sum
3572
3573
while
3573
3574
val extParams = paramClause(nparams, prefix = true )
3574
3575
leadParamss += extParams
3575
- nparams += extParams.length
3576
3576
isUsingClause(extParams)
3577
3577
do ()
3578
- leadParamss ++= paramClauses(givenOnly = true )
3578
+ leadParamss ++= paramClauses(givenOnly = true , numLeadParams = nparams )
3579
3579
if in.token == COLON then
3580
3580
syntaxError(" no `:` expected here" )
3581
3581
in.nextToken()
3582
3582
val methods =
3583
3583
if isDefIntro(modifierTokens) then
3584
- extMethod() :: Nil
3584
+ extMethod(nparams ) :: Nil
3585
3585
else
3586
3586
in.observeIndented()
3587
3587
newLineOptWhenFollowedBy(LBRACE )
3588
- if in.isNestedStart then inDefScopeBraces(extMethods())
3588
+ if in.isNestedStart then inDefScopeBraces(extMethods(nparams ))
3589
3589
else { syntaxError(" Extension without extension methods" ); Nil }
3590
3590
val result = atSpan(start)(ExtMethods (joinParams(tparams, leadParamss.toList), methods))
3591
3591
val comment = in.getDocComment(start)
@@ -3597,20 +3597,20 @@ object Parsers {
3597
3597
3598
3598
/** ExtMethod ::= {Annotation [nl]} {Modifier} ‘def’ DefDef
3599
3599
*/
3600
- def extMethod (): DefDef =
3600
+ def extMethod (numLeadParams : Int ): DefDef =
3601
3601
val start = in.offset
3602
3602
val mods = defAnnotsMods(modifierTokens)
3603
3603
accept(DEF )
3604
- defDefOrDcl(start, mods)
3604
+ defDefOrDcl(start, mods, numLeadParams )
3605
3605
3606
3606
/** ExtMethods ::= ExtMethod | [nl] ‘{’ ExtMethod {semi ExtMethod ‘}’
3607
3607
*/
3608
- def extMethods (): List [DefDef ] = checkNoEscapingPlaceholders {
3608
+ def extMethods (numLeadParams : Int ): List [DefDef ] = checkNoEscapingPlaceholders {
3609
3609
val meths = new ListBuffer [DefDef ]
3610
3610
val exitOnError = false
3611
3611
while ! isStatSeqEnd && ! exitOnError do
3612
3612
setLastStatOffset()
3613
- meths += extMethod()
3613
+ meths += extMethod(numLeadParams )
3614
3614
acceptStatSepUnlessAtEnd(meths)
3615
3615
if meths.isEmpty then syntaxError(" `def` expected" )
3616
3616
meths.toList
0 commit comments