@@ -3020,7 +3020,8 @@ object Parsers {
30203020 */
30213021 def paramClauses (ofClass : Boolean = false ,
30223022 ofCaseClass : Boolean = false ,
3023- givenOnly : Boolean = false ): List [List [ValDef ]] =
3023+ givenOnly : Boolean = false ,
3024+ numLeadParams : Int = 0 ): List [List [ValDef ]] =
30243025
30253026 def recur (firstClause : Boolean , nparams : Int ): List [List [ValDef ]] =
30263027 newLineOptWhenFollowedBy(LPAREN )
@@ -3039,7 +3040,7 @@ object Parsers {
30393040 else Nil
30403041 end recur
30413042
3042- recur(firstClause = true , 0 )
3043+ recur(firstClause = true , numLeadParams )
30433044 end paramClauses
30443045
30453046/* -------- DEFS ------------------------------------------- */
@@ -3244,7 +3245,7 @@ object Parsers {
32443245 * DefSig ::= id [DefTypeParamClause] DefParamClauses
32453246 * | ExtParamClause [nl] [‘.’] id DefParamClauses
32463247 */
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) {
32483249
32493250 def scala2ProcedureSyntax (resultTypeStr : String ) =
32503251 def toInsert =
@@ -3261,7 +3262,7 @@ object Parsers {
32613262
32623263 if (in.token == THIS ) {
32633264 in.nextToken()
3264- val vparamss = paramClauses()
3265+ val vparamss = paramClauses(numLeadParams = numLeadParams )
32653266 if (vparamss.isEmpty || vparamss.head.take(1 ).exists(_.mods.isOneOf(GivenOrImplicit )))
32663267 in.token match {
32673268 case LBRACKET => syntaxError(" no type parameters allowed here" )
@@ -3280,7 +3281,7 @@ object Parsers {
32803281 val ident = termIdent()
32813282 var name = ident.name.asTermName
32823283 val tparams = typeParamClauseOpt(ParamOwner .Def )
3283- val vparamss = paramClauses()
3284+ val vparamss = paramClauses(numLeadParams = numLeadParams )
32843285 var tpt = fromWithinReturnType {
32853286 if in.token == COLONEOL then in.token = COLON
32863287 // a hack to allow
@@ -3568,24 +3569,23 @@ object Parsers {
35683569 val start = in.skipToken()
35693570 val tparams = typeParamClauseOpt(ParamOwner .Def )
35703571 val leadParamss = ListBuffer [List [ValDef ]]()
3571- var nparams = 0
3572+ def nparams = leadParamss.map(_.length).sum
35723573 while
35733574 val extParams = paramClause(nparams, prefix = true )
35743575 leadParamss += extParams
3575- nparams += extParams.length
35763576 isUsingClause(extParams)
35773577 do ()
3578- leadParamss ++= paramClauses(givenOnly = true )
3578+ leadParamss ++= paramClauses(givenOnly = true , numLeadParams = nparams )
35793579 if in.token == COLON then
35803580 syntaxError(" no `:` expected here" )
35813581 in.nextToken()
35823582 val methods =
35833583 if isDefIntro(modifierTokens) then
3584- extMethod() :: Nil
3584+ extMethod(nparams ) :: Nil
35853585 else
35863586 in.observeIndented()
35873587 newLineOptWhenFollowedBy(LBRACE )
3588- if in.isNestedStart then inDefScopeBraces(extMethods())
3588+ if in.isNestedStart then inDefScopeBraces(extMethods(nparams ))
35893589 else { syntaxError(" Extension without extension methods" ); Nil }
35903590 val result = atSpan(start)(ExtMethods (joinParams(tparams, leadParamss.toList), methods))
35913591 val comment = in.getDocComment(start)
@@ -3597,20 +3597,20 @@ object Parsers {
35973597
35983598 /** ExtMethod ::= {Annotation [nl]} {Modifier} ‘def’ DefDef
35993599 */
3600- def extMethod (): DefDef =
3600+ def extMethod (numLeadParams : Int ): DefDef =
36013601 val start = in.offset
36023602 val mods = defAnnotsMods(modifierTokens)
36033603 accept(DEF )
3604- defDefOrDcl(start, mods)
3604+ defDefOrDcl(start, mods, numLeadParams )
36053605
36063606 /** ExtMethods ::= ExtMethod | [nl] ‘{’ ExtMethod {semi ExtMethod ‘}’
36073607 */
3608- def extMethods (): List [DefDef ] = checkNoEscapingPlaceholders {
3608+ def extMethods (numLeadParams : Int ): List [DefDef ] = checkNoEscapingPlaceholders {
36093609 val meths = new ListBuffer [DefDef ]
36103610 val exitOnError = false
36113611 while ! isStatSeqEnd && ! exitOnError do
36123612 setLastStatOffset()
3613- meths += extMethod()
3613+ meths += extMethod(numLeadParams )
36143614 acceptStatSepUnlessAtEnd(meths)
36153615 if meths.isEmpty then syntaxError(" `def` expected" )
36163616 meths.toList
0 commit comments