@@ -559,9 +559,14 @@ object Parsers {
559559 def inDefScopeBraces [T ](body : => T , rewriteWithColon : Boolean = false ): T =
560560 inBracesOrIndented(body, rewriteWithColon)
561561
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 ] =
563567 in.currentRegion.withCommasExpected {
564- val ts = new ListBuffer [T ] += part()
568+ val ts = new ListBuffer [T ]
569+ if (readFirst) ts += part()
565570 while in.token == COMMA do
566571 in.nextToken()
567572 ts += part()
@@ -1384,14 +1389,7 @@ object Parsers {
13841389 else
13851390 Function (params, t)
13861391 }
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+
13951393 var isValParamList = false
13961394
13971395 val t =
@@ -1407,11 +1405,10 @@ object Parsers {
14071405 val ts = funArgType() match {
14081406 case Ident (name) if name != tpnme.WILDCARD && in.isColon() =>
14091407 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 )
14131410 case t =>
1414- funTypeArgsRest(t, funArgType)
1411+ t :: commaSeparated( funArgType, readFirst = false )
14151412 }
14161413 accept(RPAREN )
14171414 if isValParamList || in.isArrow then
@@ -3191,9 +3188,9 @@ object Parsers {
31913188 }
31923189 else ImportSelector (from)
31933190
3194- def importSelectors (idOK : Boolean ): List [ ImportSelector ] =
3191+ def importSelector (idOK : Boolean )() : ImportSelector =
31953192 val isWildcard = in.token == USCORE || in.token == GIVEN || isIdent(nme.raw.STAR )
3196- val selector = atSpan(in.offset) {
3193+ atSpan(in.offset) {
31973194 in.token match
31983195 case USCORE => wildcardSelector()
31993196 case GIVEN => givenSelector()
@@ -3203,13 +3200,6 @@ object Parsers {
32033200 if ! idOK then syntaxError(i " named imports cannot follow wildcard imports " )
32043201 namedSelector(termIdent())
32053202 }
3206- val rest =
3207- if in.token == COMMA then
3208- in.nextToken()
3209- importSelectors(idOK = idOK && ! isWildcard)
3210- else
3211- Nil
3212- selector :: rest
32133203
32143204 def importSelection (qual : Tree ): Tree =
32153205 if in.isIdent(nme.as) && qual.isInstanceOf [RefTree ] then
@@ -3227,7 +3217,7 @@ object Parsers {
32273217 case GIVEN =>
32283218 mkTree(qual, givenSelector() :: Nil )
32293219 case LBRACE =>
3230- mkTree(qual, inBraces(importSelectors( idOK = true )))
3220+ mkTree(qual, inBraces(commaSeparated(importSelector( idOK = true ) )))
32313221 case _ =>
32323222 if isIdent(nme.raw.STAR ) then
32333223 mkTree(qual, wildcardSelector() :: Nil )
0 commit comments