@@ -3079,6 +3079,42 @@ object Parsers {
30793079
30803080 /* -------- PARAMETERS ------------------------------------------- */
30813081
3082+ /** DefParamClauses ::= DefParamClause { DefParamClause } -- and two DefTypeParamClause cannot be adjacent
3083+ * DefParamClause ::= DefTypeParamClause
3084+ * | DefTermParamClause
3085+ * | UsingParamClause
3086+ */
3087+ def typeOrTermParamClauses (
3088+ ownerKind : ParamOwner ,
3089+ numLeadParams : Int = 0
3090+ ): List [List [TypeDef ] | List [ValDef ]] =
3091+
3092+ def recur (firstClause : Boolean , numLeadParams : Int , prevIsTypeClause : Boolean ): List [List [TypeDef ] | List [ValDef ]] =
3093+ newLineOptWhenFollowedBy(LPAREN )
3094+ newLineOptWhenFollowedBy(LBRACKET )
3095+ if in.token == LPAREN then
3096+ val paramsStart = in.offset
3097+ val params = termParamClause(
3098+ numLeadParams,
3099+ firstClause = firstClause)
3100+ val lastClause = params.nonEmpty && params.head.mods.flags.is(Implicit )
3101+ params :: (
3102+ if lastClause then Nil
3103+ else recur(firstClause = false , numLeadParams + params.length, prevIsTypeClause = false ))
3104+ else if in.token == LBRACKET then
3105+ if prevIsTypeClause then
3106+ syntaxError(
3107+ em " Type parameter lists must be separated by a term or using parameter list " ,
3108+ in.offset
3109+ )
3110+ typeParamClause(ownerKind) :: recur(firstClause, numLeadParams, prevIsTypeClause = true )
3111+ else Nil
3112+ end recur
3113+
3114+ recur(firstClause = true , numLeadParams = numLeadParams, prevIsTypeClause = false )
3115+ end typeOrTermParamClauses
3116+
3117+
30823118 /** ClsTypeParamClause::= ‘[’ ClsTypeParam {‘,’ ClsTypeParam} ‘]’
30833119 * ClsTypeParam ::= {Annotation} [‘+’ | ‘-’]
30843120 * id [HkTypeParamClause] TypeParamBounds
@@ -3132,34 +3168,39 @@ object Parsers {
31323168
31333169 /** ContextTypes ::= FunArgType {‘,’ FunArgType}
31343170 */
3135- def contextTypes (ofClass : Boolean , nparams : Int , impliedMods : Modifiers ): List [ValDef ] =
3171+ def contextTypes (ofClass : Boolean , numLeadParams : Int , impliedMods : Modifiers ): List [ValDef ] =
31363172 val tps = commaSeparated(funArgType)
3137- var counter = nparams
3173+ var counter = numLeadParams
31383174 def nextIdx = { counter += 1 ; counter }
31393175 val paramFlags = if ofClass then LocalParamAccessor else Param
31403176 tps.map(makeSyntheticParameter(nextIdx, _, paramFlags | Synthetic | impliedMods.flags))
31413177
3142- /** ClsParamClause ::= ‘(’ [‘erased’] ClsParams ‘)’ | UsingClsParamClause
3143- * UsingClsParamClause ::= ‘(’ ‘using’ [‘erased’] (ClsParams | ContextTypes) ‘)’
3178+ /** ClsTermParamClause ::= ‘(’ [‘erased’] ClsParams ‘)’ | UsingClsTermParamClause
3179+ * UsingClsTermParamClause ::= ‘(’ ‘using’ [‘erased’] (ClsParams | ContextTypes) ‘)’
31443180 * ClsParams ::= ClsParam {‘,’ ClsParam}
31453181 * ClsParam ::= {Annotation}
3182+ *
3183+ * TypelessClause ::= DefTermParamClause
3184+ * | UsingParamClause
31463185 *
3147- * DefParamClause ::= ‘(’ [‘erased’] DefParams ‘)’ | UsingParamClause
3148- * UsingParamClause ::= ‘(’ ‘using’ [‘erased’] (DefParams | ContextTypes) ‘)’
3149- * DefParams ::= DefParam {‘,’ DefParam}
3150- * DefParam ::= {Annotation} [‘inline’] Param
3186+ * DefTermParamClause::= [nl] ‘(’ [DefTermParams] ‘)’
3187+ * UsingParamClause ::= ‘(’ ‘using’ [‘erased’] (DefTermParams | ContextTypes) ‘)’
3188+ * DefImplicitClause ::= [nl] ‘(’ ‘implicit’ DefTermParams ‘)’
3189+ * DefTermParams ::= DefTermParam {‘,’ DefTermParam}
3190+ * DefTermParam ::= {Annotation} [‘inline’] Param
31513191 *
31523192 * Param ::= id `:' ParamType [`=' Expr]
31533193 *
31543194 * @return the list of parameter definitions
31553195 */
3156- def paramClause (nparams : Int , // number of parameters preceding this clause
3157- ofClass : Boolean = false , // owner is a class
3158- ofCaseClass : Boolean = false , // owner is a case class
3159- prefix : Boolean = false , // clause precedes name of an extension method
3160- givenOnly : Boolean = false , // only given parameters allowed
3161- firstClause : Boolean = false // clause is the first in regular list of clauses
3162- ): List [ValDef ] = {
3196+ def termParamClause (
3197+ numLeadParams : Int , // number of parameters preceding this clause
3198+ ofClass : Boolean = false , // owner is a class
3199+ ofCaseClass : Boolean = false , // owner is a case class
3200+ prefix : Boolean = false , // clause precedes name of an extension method
3201+ givenOnly : Boolean = false , // only given parameters allowed
3202+ firstClause : Boolean = false // clause is the first in regular list of clauses
3203+ ): List [ValDef ] = {
31633204 var impliedMods : Modifiers = EmptyModifiers
31643205
31653206 def addParamMod (mod : () => Mod ) = impliedMods = addMod(impliedMods, atSpan(in.skipToken()) { mod() })
@@ -3224,7 +3265,7 @@ object Parsers {
32243265 checkVarArgsRules(rest)
32253266 }
32263267
3227- // begin paramClause
3268+ // begin termParamClause
32283269 inParens {
32293270 if in.token == RPAREN && ! prefix && ! impliedMods.is(Given ) then Nil
32303271 else
@@ -3239,41 +3280,43 @@ object Parsers {
32393280 || startParamTokens.contains(in.token)
32403281 || isIdent && (in.name == nme.inline || in.lookahead.isColon)
32413282 if isParams then commaSeparated(() => param())
3242- else contextTypes(ofClass, nparams , impliedMods)
3283+ else contextTypes(ofClass, numLeadParams , impliedMods)
32433284 checkVarArgsRules(clause)
32443285 clause
32453286 }
32463287 }
32473288
3248- /** ClsParamClauses ::= {ClsParamClause } [[nl] ‘(’ [‘implicit’] ClsParams ‘)’]
3249- * DefParamClauses ::= {DefParamClause} [[nl] ‘(’ [‘implicit’] DefParams ‘)’]
3289+ /** ClsTermParamClauses ::= {ClsTermParamClause } [[nl] ‘(’ [‘implicit’] ClsParams ‘)’]
3290+ * TypelessClauses ::= TypelessClause {TypelessClause}
32503291 *
32513292 * @return The parameter definitions
32523293 */
3253- def paramClauses (ofClass : Boolean = false ,
3254- ofCaseClass : Boolean = false ,
3255- givenOnly : Boolean = false ,
3256- numLeadParams : Int = 0 ): List [List [ValDef ]] =
3294+ def termParamClauses (
3295+ ofClass : Boolean = false ,
3296+ ofCaseClass : Boolean = false ,
3297+ givenOnly : Boolean = false ,
3298+ numLeadParams : Int = 0
3299+ ): List [List [ValDef ]] =
32573300
3258- def recur (firstClause : Boolean , nparams : Int ): List [List [ValDef ]] =
3301+ def recur (firstClause : Boolean , numLeadParams : Int ): List [List [ValDef ]] =
32593302 newLineOptWhenFollowedBy(LPAREN )
32603303 if in.token == LPAREN then
32613304 val paramsStart = in.offset
3262- val params = paramClause (
3263- nparams ,
3305+ val params = termParamClause (
3306+ numLeadParams ,
32643307 ofClass = ofClass,
32653308 ofCaseClass = ofCaseClass,
32663309 givenOnly = givenOnly,
32673310 firstClause = firstClause)
32683311 val lastClause = params.nonEmpty && params.head.mods.flags.is(Implicit )
32693312 params :: (
32703313 if lastClause then Nil
3271- else recur(firstClause = false , nparams + params.length))
3314+ else recur(firstClause = false , numLeadParams + params.length))
32723315 else Nil
32733316 end recur
32743317
32753318 recur(firstClause = true , numLeadParams)
3276- end paramClauses
3319+ end termParamClauses
32773320
32783321/* -------- DEFS ------------------------------------------- */
32793322
@@ -3514,11 +3557,15 @@ object Parsers {
35143557 }
35153558 }
35163559
3560+
3561+
35173562 /** DefDef ::= DefSig [‘:’ Type] ‘=’ Expr
3518- * | this ParamClause ParamClauses `=' ConstrExpr
3563+ * | this TypelessClauses [DefImplicitClause] `=' ConstrExpr
35193564 * DefDcl ::= DefSig `:' Type
3520- * DefSig ::= id [DefTypeParamClause] DefParamClauses
3521- * | ExtParamClause [nl] [‘.’] id DefParamClauses
3565+ * DefSig ::= id [DefTypeParamClause] DefTermParamClauses
3566+ *
3567+ * if clauseInterleaving is enabled:
3568+ * DefSig ::= id [DefParamClauses] [DefImplicitClause]
35223569 */
35233570 def defDefOrDcl (start : Offset , mods : Modifiers , numLeadParams : Int = 0 ): DefDef = atSpan(start, nameStart) {
35243571
@@ -3537,7 +3584,7 @@ object Parsers {
35373584
35383585 if (in.token == THIS ) {
35393586 in.nextToken()
3540- val vparamss = paramClauses (numLeadParams = numLeadParams)
3587+ val vparamss = termParamClauses (numLeadParams = numLeadParams)
35413588 if (vparamss.isEmpty || vparamss.head.take(1 ).exists(_.mods.isOneOf(GivenOrImplicit )))
35423589 in.token match {
35433590 case LBRACKET => syntaxError(em " no type parameters allowed here " )
@@ -3555,9 +3602,18 @@ object Parsers {
35553602 val mods1 = addFlag(mods, Method )
35563603 val ident = termIdent()
35573604 var name = ident.name.asTermName
3558- val tparams = typeParamClauseOpt(ParamOwner .Def )
3559- val vparamss = paramClauses(numLeadParams = numLeadParams)
3605+ val paramss =
3606+ if in.featureEnabled(Feature .clauseInterleaving) then
3607+ // If you are making interleaving stable manually, please refer to the PR introducing it instead, section "How to make non-experimental"
3608+ typeOrTermParamClauses(ParamOwner .Def , numLeadParams = numLeadParams)
3609+ else
3610+ val tparams = typeParamClauseOpt(ParamOwner .Def )
3611+ val vparamss = termParamClauses(numLeadParams = numLeadParams)
3612+
3613+ joinParams(tparams, vparamss)
3614+
35603615 var tpt = fromWithinReturnType { typedOpt() }
3616+
35613617 if (migrateTo3) newLineOptWhenFollowedBy(LBRACE )
35623618 val rhs =
35633619 if in.token == EQUALS then
@@ -3574,7 +3630,7 @@ object Parsers {
35743630 accept(EQUALS )
35753631 expr()
35763632
3577- val ddef = DefDef (name, joinParams(tparams, vparamss) , tpt, rhs)
3633+ val ddef = DefDef (name, paramss , tpt, rhs)
35783634 if (isBackquoted(ident)) ddef.pushAttachment(Backquoted , ())
35793635 finalizeDef(ddef, mods1, start)
35803636 }
@@ -3695,12 +3751,12 @@ object Parsers {
36953751 val templ = templateOpt(constr)
36963752 finalizeDef(TypeDef (name, templ), mods, start)
36973753
3698- /** ClassConstr ::= [ClsTypeParamClause] [ConstrMods] ClsParamClauses
3754+ /** ClassConstr ::= [ClsTypeParamClause] [ConstrMods] ClsTermParamClauses
36993755 */
37003756 def classConstr (isCaseClass : Boolean = false ): DefDef = atSpan(in.lastOffset) {
37013757 val tparams = typeParamClauseOpt(ParamOwner .Class )
37023758 val cmods = fromWithinClassConstr(constrModsOpt())
3703- val vparamss = paramClauses (ofClass = true , ofCaseClass = isCaseClass)
3759+ val vparamss = termParamClauses (ofClass = true , ofCaseClass = isCaseClass)
37043760 makeConstructor(tparams, vparamss).withMods(cmods)
37053761 }
37063762
@@ -3802,7 +3858,7 @@ object Parsers {
38023858 newLineOpt()
38033859 val vparamss =
38043860 if in.token == LPAREN && in.lookahead.isIdent(nme.using)
3805- then paramClauses (givenOnly = true )
3861+ then termParamClauses (givenOnly = true )
38063862 else Nil
38073863 newLinesOpt()
38083864 val noParams = tparams.isEmpty && vparamss.isEmpty
@@ -3837,32 +3893,32 @@ object Parsers {
38373893 finalizeDef(gdef, mods1, start)
38383894 }
38393895
3840- /** Extension ::= ‘extension’ [DefTypeParamClause] {UsingParamClause} ‘(’ DefParam ‘)’
3896+ /** Extension ::= ‘extension’ [DefTypeParamClause] {UsingParamClause} ‘(’ DefTermParam ‘)’
38413897 * {UsingParamClause} ExtMethods
38423898 */
38433899 def extension (): ExtMethods =
38443900 val start = in.skipToken()
38453901 val tparams = typeParamClauseOpt(ParamOwner .Def )
38463902 val leadParamss = ListBuffer [List [ValDef ]]()
3847- def nparams = leadParamss.map(_.length).sum
3903+ def numLeadParams = leadParamss.map(_.length).sum
38483904 while
3849- val extParams = paramClause(nparams , prefix = true )
3905+ val extParams = termParamClause(numLeadParams , prefix = true )
38503906 leadParamss += extParams
38513907 isUsingClause(extParams)
38523908 do ()
3853- leadParamss ++= paramClauses (givenOnly = true , numLeadParams = nparams )
3909+ leadParamss ++= termParamClauses (givenOnly = true , numLeadParams = numLeadParams )
38543910 if in.isColon then
38553911 syntaxError(em " no `:` expected here " )
38563912 in.nextToken()
38573913 val methods : List [Tree ] =
38583914 if in.token == EXPORT then
38593915 exportClause()
38603916 else if isDefIntro(modifierTokens) then
3861- extMethod(nparams ) :: Nil
3917+ extMethod(numLeadParams ) :: Nil
38623918 else
38633919 in.observeIndented()
38643920 newLineOptWhenFollowedBy(LBRACE )
3865- if in.isNestedStart then inDefScopeBraces(extMethods(nparams ))
3921+ if in.isNestedStart then inDefScopeBraces(extMethods(numLeadParams ))
38663922 else { syntaxErrorOrIncomplete(em " Extension without extension methods " ) ; Nil }
38673923 val result = atSpan(start)(ExtMethods (joinParams(tparams, leadParamss.toList), methods))
38683924 val comment = in.getDocComment(start)
0 commit comments