Skip to content

Commit 6743a27

Browse files
authored
Merge pull request #14741 from adampauls/comma_separated_helper
Use commaSeparated helper in more places
2 parents e54a934 + f76e5ed commit 6743a27

File tree

1 file changed

+14
-24
lines changed

1 file changed

+14
-24
lines changed

compiler/src/dotty/tools/dotc/parsing/Parsers.scala

Lines changed: 14 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)