@@ -3079,6 +3079,42 @@ object Parsers {
3079
3079
3080
3080
/* -------- PARAMETERS ------------------------------------------- */
3081
3081
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
+
3082
3118
/** ClsTypeParamClause::= ‘[’ ClsTypeParam {‘,’ ClsTypeParam} ‘]’
3083
3119
* ClsTypeParam ::= {Annotation} [‘+’ | ‘-’]
3084
3120
* id [HkTypeParamClause] TypeParamBounds
@@ -3132,34 +3168,39 @@ object Parsers {
3132
3168
3133
3169
/** ContextTypes ::= FunArgType {‘,’ FunArgType}
3134
3170
*/
3135
- def contextTypes (ofClass : Boolean , nparams : Int , impliedMods : Modifiers ): List [ValDef ] =
3171
+ def contextTypes (ofClass : Boolean , numLeadParams : Int , impliedMods : Modifiers ): List [ValDef ] =
3136
3172
val tps = commaSeparated(funArgType)
3137
- var counter = nparams
3173
+ var counter = numLeadParams
3138
3174
def nextIdx = { counter += 1 ; counter }
3139
3175
val paramFlags = if ofClass then LocalParamAccessor else Param
3140
3176
tps.map(makeSyntheticParameter(nextIdx, _, paramFlags | Synthetic | impliedMods.flags))
3141
3177
3142
- /** ClsParamClause ::= ‘(’ [‘erased’] ClsParams ‘)’ | UsingClsParamClause
3143
- * UsingClsParamClause ::= ‘(’ ‘using’ [‘erased’] (ClsParams | ContextTypes) ‘)’
3178
+ /** ClsTermParamClause ::= ‘(’ [‘erased’] ClsParams ‘)’ | UsingClsTermParamClause
3179
+ * UsingClsTermParamClause ::= ‘(’ ‘using’ [‘erased’] (ClsParams | ContextTypes) ‘)’
3144
3180
* ClsParams ::= ClsParam {‘,’ ClsParam}
3145
3181
* ClsParam ::= {Annotation}
3182
+ *
3183
+ * TypelessClause ::= DefTermParamClause
3184
+ * | UsingParamClause
3146
3185
*
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
3151
3191
*
3152
3192
* Param ::= id `:' ParamType [`=' Expr]
3153
3193
*
3154
3194
* @return the list of parameter definitions
3155
3195
*/
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 ] = {
3163
3204
var impliedMods : Modifiers = EmptyModifiers
3164
3205
3165
3206
def addParamMod (mod : () => Mod ) = impliedMods = addMod(impliedMods, atSpan(in.skipToken()) { mod() })
@@ -3224,7 +3265,7 @@ object Parsers {
3224
3265
checkVarArgsRules(rest)
3225
3266
}
3226
3267
3227
- // begin paramClause
3268
+ // begin termParamClause
3228
3269
inParens {
3229
3270
if in.token == RPAREN && ! prefix && ! impliedMods.is(Given ) then Nil
3230
3271
else
@@ -3239,41 +3280,43 @@ object Parsers {
3239
3280
|| startParamTokens.contains(in.token)
3240
3281
|| isIdent && (in.name == nme.inline || in.lookahead.isColon)
3241
3282
if isParams then commaSeparated(() => param())
3242
- else contextTypes(ofClass, nparams , impliedMods)
3283
+ else contextTypes(ofClass, numLeadParams , impliedMods)
3243
3284
checkVarArgsRules(clause)
3244
3285
clause
3245
3286
}
3246
3287
}
3247
3288
3248
- /** ClsParamClauses ::= {ClsParamClause } [[nl] ‘(’ [‘implicit’] ClsParams ‘)’]
3249
- * DefParamClauses ::= {DefParamClause} [[nl] ‘(’ [‘implicit’] DefParams ‘)’]
3289
+ /** ClsTermParamClauses ::= {ClsTermParamClause } [[nl] ‘(’ [‘implicit’] ClsParams ‘)’]
3290
+ * TypelessClauses ::= TypelessClause {TypelessClause}
3250
3291
*
3251
3292
* @return The parameter definitions
3252
3293
*/
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 ]] =
3257
3300
3258
- def recur (firstClause : Boolean , nparams : Int ): List [List [ValDef ]] =
3301
+ def recur (firstClause : Boolean , numLeadParams : Int ): List [List [ValDef ]] =
3259
3302
newLineOptWhenFollowedBy(LPAREN )
3260
3303
if in.token == LPAREN then
3261
3304
val paramsStart = in.offset
3262
- val params = paramClause (
3263
- nparams ,
3305
+ val params = termParamClause (
3306
+ numLeadParams ,
3264
3307
ofClass = ofClass,
3265
3308
ofCaseClass = ofCaseClass,
3266
3309
givenOnly = givenOnly,
3267
3310
firstClause = firstClause)
3268
3311
val lastClause = params.nonEmpty && params.head.mods.flags.is(Implicit )
3269
3312
params :: (
3270
3313
if lastClause then Nil
3271
- else recur(firstClause = false , nparams + params.length))
3314
+ else recur(firstClause = false , numLeadParams + params.length))
3272
3315
else Nil
3273
3316
end recur
3274
3317
3275
3318
recur(firstClause = true , numLeadParams)
3276
- end paramClauses
3319
+ end termParamClauses
3277
3320
3278
3321
/* -------- DEFS ------------------------------------------- */
3279
3322
@@ -3514,11 +3557,15 @@ object Parsers {
3514
3557
}
3515
3558
}
3516
3559
3560
+
3561
+
3517
3562
/** DefDef ::= DefSig [‘:’ Type] ‘=’ Expr
3518
- * | this ParamClause ParamClauses `=' ConstrExpr
3563
+ * | this TypelessClauses [DefImplicitClause] `=' ConstrExpr
3519
3564
* 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]
3522
3569
*/
3523
3570
def defDefOrDcl (start : Offset , mods : Modifiers , numLeadParams : Int = 0 ): DefDef = atSpan(start, nameStart) {
3524
3571
@@ -3537,7 +3584,7 @@ object Parsers {
3537
3584
3538
3585
if (in.token == THIS ) {
3539
3586
in.nextToken()
3540
- val vparamss = paramClauses (numLeadParams = numLeadParams)
3587
+ val vparamss = termParamClauses (numLeadParams = numLeadParams)
3541
3588
if (vparamss.isEmpty || vparamss.head.take(1 ).exists(_.mods.isOneOf(GivenOrImplicit )))
3542
3589
in.token match {
3543
3590
case LBRACKET => syntaxError(em " no type parameters allowed here " )
@@ -3555,9 +3602,18 @@ object Parsers {
3555
3602
val mods1 = addFlag(mods, Method )
3556
3603
val ident = termIdent()
3557
3604
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
+
3560
3615
var tpt = fromWithinReturnType { typedOpt() }
3616
+
3561
3617
if (migrateTo3) newLineOptWhenFollowedBy(LBRACE )
3562
3618
val rhs =
3563
3619
if in.token == EQUALS then
@@ -3574,7 +3630,7 @@ object Parsers {
3574
3630
accept(EQUALS )
3575
3631
expr()
3576
3632
3577
- val ddef = DefDef (name, joinParams(tparams, vparamss) , tpt, rhs)
3633
+ val ddef = DefDef (name, paramss , tpt, rhs)
3578
3634
if (isBackquoted(ident)) ddef.pushAttachment(Backquoted , ())
3579
3635
finalizeDef(ddef, mods1, start)
3580
3636
}
@@ -3695,12 +3751,12 @@ object Parsers {
3695
3751
val templ = templateOpt(constr)
3696
3752
finalizeDef(TypeDef (name, templ), mods, start)
3697
3753
3698
- /** ClassConstr ::= [ClsTypeParamClause] [ConstrMods] ClsParamClauses
3754
+ /** ClassConstr ::= [ClsTypeParamClause] [ConstrMods] ClsTermParamClauses
3699
3755
*/
3700
3756
def classConstr (isCaseClass : Boolean = false ): DefDef = atSpan(in.lastOffset) {
3701
3757
val tparams = typeParamClauseOpt(ParamOwner .Class )
3702
3758
val cmods = fromWithinClassConstr(constrModsOpt())
3703
- val vparamss = paramClauses (ofClass = true , ofCaseClass = isCaseClass)
3759
+ val vparamss = termParamClauses (ofClass = true , ofCaseClass = isCaseClass)
3704
3760
makeConstructor(tparams, vparamss).withMods(cmods)
3705
3761
}
3706
3762
@@ -3802,7 +3858,7 @@ object Parsers {
3802
3858
newLineOpt()
3803
3859
val vparamss =
3804
3860
if in.token == LPAREN && in.lookahead.isIdent(nme.using)
3805
- then paramClauses (givenOnly = true )
3861
+ then termParamClauses (givenOnly = true )
3806
3862
else Nil
3807
3863
newLinesOpt()
3808
3864
val noParams = tparams.isEmpty && vparamss.isEmpty
@@ -3837,32 +3893,32 @@ object Parsers {
3837
3893
finalizeDef(gdef, mods1, start)
3838
3894
}
3839
3895
3840
- /** Extension ::= ‘extension’ [DefTypeParamClause] {UsingParamClause} ‘(’ DefParam ‘)’
3896
+ /** Extension ::= ‘extension’ [DefTypeParamClause] {UsingParamClause} ‘(’ DefTermParam ‘)’
3841
3897
* {UsingParamClause} ExtMethods
3842
3898
*/
3843
3899
def extension (): ExtMethods =
3844
3900
val start = in.skipToken()
3845
3901
val tparams = typeParamClauseOpt(ParamOwner .Def )
3846
3902
val leadParamss = ListBuffer [List [ValDef ]]()
3847
- def nparams = leadParamss.map(_.length).sum
3903
+ def numLeadParams = leadParamss.map(_.length).sum
3848
3904
while
3849
- val extParams = paramClause(nparams , prefix = true )
3905
+ val extParams = termParamClause(numLeadParams , prefix = true )
3850
3906
leadParamss += extParams
3851
3907
isUsingClause(extParams)
3852
3908
do ()
3853
- leadParamss ++= paramClauses (givenOnly = true , numLeadParams = nparams )
3909
+ leadParamss ++= termParamClauses (givenOnly = true , numLeadParams = numLeadParams )
3854
3910
if in.isColon then
3855
3911
syntaxError(em " no `:` expected here " )
3856
3912
in.nextToken()
3857
3913
val methods : List [Tree ] =
3858
3914
if in.token == EXPORT then
3859
3915
exportClause()
3860
3916
else if isDefIntro(modifierTokens) then
3861
- extMethod(nparams ) :: Nil
3917
+ extMethod(numLeadParams ) :: Nil
3862
3918
else
3863
3919
in.observeIndented()
3864
3920
newLineOptWhenFollowedBy(LBRACE )
3865
- if in.isNestedStart then inDefScopeBraces(extMethods(nparams ))
3921
+ if in.isNestedStart then inDefScopeBraces(extMethods(numLeadParams ))
3866
3922
else { syntaxErrorOrIncomplete(em " Extension without extension methods " ) ; Nil }
3867
3923
val result = atSpan(start)(ExtMethods (joinParams(tparams, leadParamss.toList), methods))
3868
3924
val comment = in.getDocComment(start)
0 commit comments