@@ -559,9 +559,14 @@ object Parsers {
559
559
def inDefScopeBraces [T ](body : => T , rewriteWithColon : Boolean = false ): T =
560
560
inBracesOrIndented(body, rewriteWithColon)
561
561
562
- def commaSeparated [T ](part : () => T ): List [T ] =
562
+ /**
563
+ * @param readFirst If true, assume we have not read the first `part`. Otherwise,
564
+ * expect that we have (i.e the next thing to expect is a [[COMMA ]]).
565
+ */
566
+ def commaSeparated [T ](part : () => T , readFirst : Boolean = true ): List [T ] =
563
567
in.currentRegion.withCommasExpected {
564
- val ts = new ListBuffer [T ] += part()
568
+ val ts = new ListBuffer [T ]
569
+ if (readFirst) ts += part()
565
570
while in.token == COMMA do
566
571
in.nextToken()
567
572
ts += part()
@@ -1384,14 +1389,7 @@ object Parsers {
1384
1389
else
1385
1390
Function (params, t)
1386
1391
}
1387
- def funTypeArgsRest (first : Tree , following : () => Tree ) = {
1388
- val buf = new ListBuffer [Tree ] += first
1389
- while (in.token == COMMA ) {
1390
- in.nextToken()
1391
- buf += following()
1392
- }
1393
- buf.toList
1394
- }
1392
+
1395
1393
var isValParamList = false
1396
1394
1397
1395
val t =
@@ -1407,11 +1405,10 @@ object Parsers {
1407
1405
val ts = funArgType() match {
1408
1406
case Ident (name) if name != tpnme.WILDCARD && in.isColon() =>
1409
1407
isValParamList = true
1410
- funTypeArgsRest(
1411
- typedFunParam(paramStart, name.toTermName, imods),
1412
- () => typedFunParam(in.offset, ident(), imods))
1408
+ typedFunParam(paramStart, name.toTermName, imods) :: commaSeparated(
1409
+ () => typedFunParam(in.offset, ident(), imods), readFirst = false )
1413
1410
case t =>
1414
- funTypeArgsRest(t, funArgType)
1411
+ t :: commaSeparated( funArgType, readFirst = false )
1415
1412
}
1416
1413
accept(RPAREN )
1417
1414
if isValParamList || in.isArrow then
@@ -3191,9 +3188,9 @@ object Parsers {
3191
3188
}
3192
3189
else ImportSelector (from)
3193
3190
3194
- def importSelectors (idOK : Boolean ): List [ ImportSelector ] =
3191
+ def importSelector (idOK : Boolean )() : ImportSelector =
3195
3192
val isWildcard = in.token == USCORE || in.token == GIVEN || isIdent(nme.raw.STAR )
3196
- val selector = atSpan(in.offset) {
3193
+ atSpan(in.offset) {
3197
3194
in.token match
3198
3195
case USCORE => wildcardSelector()
3199
3196
case GIVEN => givenSelector()
@@ -3203,13 +3200,6 @@ object Parsers {
3203
3200
if ! idOK then syntaxError(i " named imports cannot follow wildcard imports " )
3204
3201
namedSelector(termIdent())
3205
3202
}
3206
- val rest =
3207
- if in.token == COMMA then
3208
- in.nextToken()
3209
- importSelectors(idOK = idOK && ! isWildcard)
3210
- else
3211
- Nil
3212
- selector :: rest
3213
3203
3214
3204
def importSelection (qual : Tree ): Tree =
3215
3205
if in.isIdent(nme.as) && qual.isInstanceOf [RefTree ] then
@@ -3227,7 +3217,7 @@ object Parsers {
3227
3217
case GIVEN =>
3228
3218
mkTree(qual, givenSelector() :: Nil )
3229
3219
case LBRACE =>
3230
- mkTree(qual, inBraces(importSelectors( idOK = true )))
3220
+ mkTree(qual, inBraces(commaSeparated(importSelector( idOK = true ) )))
3231
3221
case _ =>
3232
3222
if isIdent(nme.raw.STAR ) then
3233
3223
mkTree(qual, wildcardSelector() :: Nil )
0 commit comments