@@ -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
@@ -3566,24 +3567,23 @@ object Parsers {
3566
3567
val start = in.skipToken()
3567
3568
val tparams = typeParamClauseOpt(ParamOwner .Def )
3568
3569
val leadParamss = ListBuffer [List [ValDef ]]()
3569
- var nparams = 0
3570
+ def nparams = leadParamss.map(_.length).sum
3570
3571
while
3571
3572
val extParams = paramClause(nparams, prefix = true )
3572
3573
leadParamss += extParams
3573
- nparams += extParams.length
3574
3574
isUsingClause(extParams)
3575
3575
do ()
3576
- leadParamss ++= paramClauses(givenOnly = true )
3576
+ leadParamss ++= paramClauses(givenOnly = true , numLeadParams = nparams )
3577
3577
if in.token == COLON then
3578
3578
syntaxError(" no `:` expected here" )
3579
3579
in.nextToken()
3580
3580
val methods =
3581
3581
if isDefIntro(modifierTokens) then
3582
- extMethod() :: Nil
3582
+ extMethod(nparams ) :: Nil
3583
3583
else
3584
3584
in.observeIndented()
3585
3585
newLineOptWhenFollowedBy(LBRACE )
3586
- if in.isNestedStart then inDefScopeBraces(extMethods())
3586
+ if in.isNestedStart then inDefScopeBraces(extMethods(nparams ))
3587
3587
else { syntaxError(" Extension without extension methods" ); Nil }
3588
3588
val result = atSpan(start)(ExtMethods (joinParams(tparams, leadParamss.toList), methods))
3589
3589
val comment = in.getDocComment(start)
@@ -3595,20 +3595,20 @@ object Parsers {
3595
3595
3596
3596
/** ExtMethod ::= {Annotation [nl]} {Modifier} ‘def’ DefDef
3597
3597
*/
3598
- def extMethod (): DefDef =
3598
+ def extMethod (numLeadParams : Int ): DefDef =
3599
3599
val start = in.offset
3600
3600
val mods = defAnnotsMods(modifierTokens)
3601
3601
accept(DEF )
3602
- defDefOrDcl(start, mods)
3602
+ defDefOrDcl(start, mods, numLeadParams )
3603
3603
3604
3604
/** ExtMethods ::= ExtMethod | [nl] ‘{’ ExtMethod {semi ExtMethod ‘}’
3605
3605
*/
3606
- def extMethods (): List [DefDef ] = checkNoEscapingPlaceholders {
3606
+ def extMethods (numLeadParams : Int ): List [DefDef ] = checkNoEscapingPlaceholders {
3607
3607
val meths = new ListBuffer [DefDef ]
3608
3608
val exitOnError = false
3609
3609
while ! isStatSeqEnd && ! exitOnError do
3610
3610
setLastStatOffset()
3611
- meths += extMethod()
3611
+ meths += extMethod(numLeadParams )
3612
3612
acceptStatSepUnlessAtEnd(meths)
3613
3613
if meths.isEmpty then syntaxError(" `def` expected" )
3614
3614
meths.toList
0 commit comments