Skip to content

Commit 6d9acfc

Browse files
authored
Merge pull request #2689 from mateusrodriguesxyz/trailing-comma-2
2 parents e0971a7 + 1d11c43 commit 6d9acfc

File tree

9 files changed

+190
-48
lines changed

9 files changed

+190
-48
lines changed

Sources/SwiftParser/Attributes.swift

+4-1
Original file line numberDiff line numberDiff line change
@@ -374,7 +374,10 @@ extension Parser {
374374
}
375375
case nil:
376376
return parseAttribute(argumentMode: .customAttribute) { parser in
377-
let arguments = parser.parseArgumentListElements(pattern: .none, allowTrailingComma: false)
377+
let arguments = parser.parseArgumentListElements(
378+
pattern: .none,
379+
allowTrailingComma: true
380+
)
378381
return .argumentList(RawLabeledExprListSyntax(elements: arguments, arena: parser.arena))
379382
}
380383
}

Sources/SwiftParser/Availability.swift

+2-1
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,8 @@ extension Parser {
4747
arena: self.arena
4848
)
4949
)
50-
} while keepGoing != nil && self.hasProgressed(&availabilityArgumentProgress)
50+
} while keepGoing != nil
51+
&& self.hasProgressed(&availabilityArgumentProgress)
5152
}
5253

5354
return RawAvailabilityArgumentListSyntax(elements: elements, arena: self.arena)

Sources/SwiftParser/Declarations.swift

+14-3
Original file line numberDiff line numberDiff line change
@@ -492,7 +492,7 @@ extension Parser {
492492
arena: self.arena
493493
)
494494
)
495-
} while keepGoing != nil && self.hasProgressed(&loopProgress)
495+
} while keepGoing != nil && !atGenericParametersListTerminator() && self.hasProgressed(&loopProgress)
496496
}
497497

498498
let whereClause: RawGenericWhereClauseSyntax?
@@ -519,6 +519,10 @@ extension Parser {
519519
)
520520
}
521521

522+
mutating func atGenericParametersListTerminator() -> Bool {
523+
return self.at(prefix: ">")
524+
}
525+
522526
mutating func parseGenericWhereClause() -> RawGenericWhereClauseSyntax {
523527
let (unexpectedBeforeWhereKeyword, whereKeyword) = self.expect(.keyword(.where))
524528

@@ -700,7 +704,7 @@ extension Parser {
700704
arena: self.arena
701705
)
702706
)
703-
} while keepGoing != nil && self.hasProgressed(&loopProgress)
707+
} while keepGoing != nil && !self.atWhereClauseListTerminator() && self.hasProgressed(&loopProgress)
704708
}
705709

706710
return RawGenericWhereClauseSyntax(
@@ -710,6 +714,10 @@ extension Parser {
710714
arena: self.arena
711715
)
712716
}
717+
718+
mutating func atWhereClauseListTerminator() -> Bool {
719+
return self.at(.leftBrace)
720+
}
713721
}
714722

715723
extension Parser {
@@ -2017,7 +2025,10 @@ extension Parser {
20172025
let unexpectedBeforeRightParen: RawUnexpectedNodesSyntax?
20182026
let rightParen: RawTokenSyntax?
20192027
if leftParen != nil {
2020-
args = parseArgumentListElements(pattern: .none, allowTrailingComma: false)
2028+
args = parseArgumentListElements(
2029+
pattern: .none,
2030+
allowTrailingComma: true
2031+
)
20212032
(unexpectedBeforeRightParen, rightParen) = self.expect(.rightParen)
20222033
} else {
20232034
args = []

Sources/SwiftParser/Expressions.swift

+25-8
Original file line numberDiff line numberDiff line change
@@ -751,7 +751,7 @@ extension Parser {
751751
let args = self.parseArgumentListElements(
752752
pattern: pattern,
753753
flavor: flavor.callArgumentFlavor,
754-
allowTrailingComma: experimentalFeatures.contains(.trailingComma)
754+
allowTrailingComma: true
755755
)
756756
let (unexpectedBeforeRParen, rparen) = self.expect(.rightParen)
757757

@@ -788,7 +788,10 @@ extension Parser {
788788
if self.at(.rightSquare) {
789789
args = []
790790
} else {
791-
args = self.parseArgumentListElements(pattern: pattern, allowTrailingComma: false)
791+
args = self.parseArgumentListElements(
792+
pattern: pattern,
793+
allowTrailingComma: true
794+
)
792795
}
793796
let (unexpectedBeforeRSquare, rsquare) = self.expect(.rightSquare)
794797

@@ -1021,7 +1024,10 @@ extension Parser {
10211024
if self.at(.rightSquare) {
10221025
args = []
10231026
} else {
1024-
args = self.parseArgumentListElements(pattern: pattern, allowTrailingComma: false)
1027+
args = self.parseArgumentListElements(
1028+
pattern: pattern,
1029+
allowTrailingComma: true
1030+
)
10251031
}
10261032
let (unexpectedBeforeRSquare, rsquare) = self.expect(.rightSquare)
10271033

@@ -1313,7 +1319,10 @@ extension Parser {
13131319
let unexpectedBeforeRightParen: RawUnexpectedNodesSyntax?
13141320
let rightParen: RawTokenSyntax?
13151321
if leftParen != nil {
1316-
args = parseArgumentListElements(pattern: pattern, allowTrailingComma: false)
1322+
args = parseArgumentListElements(
1323+
pattern: pattern,
1324+
allowTrailingComma: true
1325+
)
13171326
(unexpectedBeforeRightParen, rightParen) = self.expect(.rightParen)
13181327
} else {
13191328
args = []
@@ -1429,7 +1438,7 @@ extension Parser {
14291438
let (unexpectedBeforeLParen, lparen) = self.expect(.leftParen)
14301439
let elements = self.parseArgumentListElements(
14311440
pattern: pattern,
1432-
allowTrailingComma: experimentalFeatures.contains(.trailingComma)
1441+
allowTrailingComma: true
14331442
)
14341443
let (unexpectedBeforeRParen, rparen) = self.expect(.rightParen)
14351444
return RawTupleExprSyntax(
@@ -1730,7 +1739,7 @@ extension Parser {
17301739
arena: arena
17311740
)
17321741
)
1733-
} while keepGoing != nil && self.hasProgressed(&loopProgress)
1742+
} while keepGoing != nil && !self.atCaptureListTerminator() && self.hasProgressed(&loopProgress)
17341743
}
17351744
// We were promised a right square bracket, so we're going to get it.
17361745
var unexpectedNodes = [RawSyntax]()
@@ -1817,6 +1826,10 @@ extension Parser {
18171826
)
18181827
}
18191828

1829+
mutating func atCaptureListTerminator() -> Bool {
1830+
return self.at(.rightSquare)
1831+
}
1832+
18201833
mutating func parseClosureCaptureSpecifiers() -> RawClosureCaptureSpecifierSyntax? {
18211834
// Check for the strength specifier: "weak", "unowned", or
18221835
// "unowned(safe/unsafe)".
@@ -1928,7 +1941,7 @@ extension Parser {
19281941
}
19291942

19301943
mutating func atArgumentListTerminator(_ allowTrailingComma: Bool) -> Bool {
1931-
return allowTrailingComma && self.at(.rightParen)
1944+
return allowTrailingComma && (self.at(.rightParen) || self.at(.rightSquare))
19321945
}
19331946
}
19341947

@@ -2367,7 +2380,7 @@ extension Parser {
23672380
} else {
23682381
unexpectedPrePatternCase = nil
23692382
}
2370-
} while keepGoing != nil && self.hasProgressed(&loopProgress)
2383+
} while keepGoing != nil && !self.atSwitchCaseListTerminator() && self.hasProgressed(&loopProgress)
23712384
}
23722385
let (unexpectedBeforeColon, colon) = self.expect(.colon)
23732386
return RawSwitchCaseLabelSyntax(
@@ -2380,6 +2393,10 @@ extension Parser {
23802393
)
23812394
}
23822395

2396+
mutating func atSwitchCaseListTerminator() -> Bool {
2397+
return self.experimentalFeatures.contains(.trailingComma) && self.at(.colon)
2398+
}
2399+
23832400
/// Parse a switch case with a 'default' label.
23842401
mutating func parseSwitchDefaultLabel(
23852402
_ handle: RecoveryConsumptionHandle

Sources/SwiftParser/Nominals.swift

+5-1
Original file line numberDiff line numberDiff line change
@@ -315,7 +315,7 @@ extension Parser {
315315
arena: self.arena
316316
)
317317
)
318-
} while keepGoing != nil && self.hasProgressed(&loopProgress)
318+
} while keepGoing != nil && !self.atInheritanceListTerminator() && self.hasProgressed(&loopProgress)
319319
}
320320

321321
let unexpectedAfterInheritedTypeCollection: RawUnexpectedNodesSyntax?
@@ -339,6 +339,10 @@ extension Parser {
339339
)
340340
}
341341

342+
mutating func atInheritanceListTerminator() -> Bool {
343+
return self.experimentalFeatures.contains(.trailingComma) && (self.at(.leftBrace) || self.at(.keyword(.where)))
344+
}
345+
342346
mutating func parsePrimaryAssociatedTypes() -> RawPrimaryAssociatedTypeClauseSyntax {
343347
let langle = self.consumePrefix("<", as: .leftAngle)
344348
var associatedTypes = [RawPrimaryAssociatedTypeSyntax]()

Sources/SwiftParser/StringLiterals.swift

+4-1
Original file line numberDiff line numberDiff line change
@@ -551,7 +551,10 @@ extension Parser {
551551
)
552552
let leftParen = self.expectWithoutRecoveryOrLeadingTrivia(.leftParen)
553553
let expressions = RawLabeledExprListSyntax(
554-
elements: self.parseArgumentListElements(pattern: .none, allowTrailingComma: false),
554+
elements: self.parseArgumentListElements(
555+
pattern: .none,
556+
allowTrailingComma: true
557+
),
555558
arena: self.arena
556559
)
557560

Sources/SwiftParser/Types.swift

+4-1
Original file line numberDiff line numberDiff line change
@@ -1024,7 +1024,10 @@ extension Parser {
10241024
}
10251025
case nil: // Custom attribute
10261026
return parseAttribute(argumentMode: .customAttribute) { parser in
1027-
let arguments = parser.parseArgumentListElements(pattern: .none, allowTrailingComma: false)
1027+
let arguments = parser.parseArgumentListElements(
1028+
pattern: .none,
1029+
allowTrailingComma: true
1030+
)
10281031
return .argumentList(RawLabeledExprListSyntax(elements: arguments, arena: parser.arena))
10291032
}
10301033

0 commit comments

Comments
 (0)