Skip to content

Commit 877ae05

Browse files
committed
Add a convenience initializer to combine unexpected nodes
1 parent 59d7f42 commit 877ae05

File tree

4 files changed

+51
-8
lines changed

4 files changed

+51
-8
lines changed

Sources/SwiftParser/Declarations.swift

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -726,7 +726,7 @@ extension Parser {
726726
// Continue through the comma-separated list.
727727
keepGoing = self.consume(if: .comma)
728728
elements.append(RawEnumCaseElementSyntax(
729-
RawUnexpectedNodesSyntax([unexpectedPeriod.map(RawSyntax.init)] + (unexpectedBeforeName?.elements ?? []), arena: self.arena),
729+
RawUnexpectedNodesSyntax(combining: unexpectedPeriod, unexpectedBeforeName, arena: self.arena),
730730
identifier: name,
731731
associatedValue: associatedValue,
732732
rawValue: rawValue,
@@ -1042,7 +1042,7 @@ extension Parser {
10421042
elements.append(RawFunctionParameterSyntax(
10431043
attributes: attrs,
10441044
modifiers: modifiers,
1045-
RawUnexpectedNodesSyntax(misplacedSpecifiers.map(RawSyntax.init) + (unexpectedBeforeFirstName?.elements ?? []), arena: self.arena),
1045+
RawUnexpectedNodesSyntax(combining: misplacedSpecifiers, unexpectedBeforeFirstName, arena: self.arena),
10461046
firstName: firstName,
10471047
unexpectedBeforeSecondName,
10481048
secondName: secondName,
@@ -1347,10 +1347,10 @@ extension Parser {
13471347
pattern: .none
13481348
)
13491349
initializer = RawInitializerClauseSyntax(
1350-
RawUnexpectedNodesSyntax(
1351-
(typeAnnotationUnwrapped.unexpectedBeforeColon?.elements ?? []) +
1352-
[RawSyntax(typeAnnotationUnwrapped.colon)] +
1353-
(typeAnnotationUnwrapped.unexpectedBetweenColonAndType?.elements ?? []),
1350+
RawUnexpectedNodesSyntax(combining:
1351+
typeAnnotationUnwrapped.unexpectedBeforeColon,
1352+
typeAnnotationUnwrapped.colon,
1353+
typeAnnotationUnwrapped.unexpectedBetweenColonAndType,
13541354
arena: self.arena
13551355
),
13561356
equal: missingToken(.equal, text: nil),

Sources/SwiftParser/Expressions.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2061,7 +2061,7 @@ extension Parser {
20612061
captures = RawClosureCaptureSignatureSyntax(
20622062
leftSquare: lsquare,
20632063
items: elements.isEmpty ? nil : RawClosureCaptureItemListSyntax(elements: elements, arena: self.arena),
2064-
unexpectedNodes.isEmpty ? nil : RawUnexpectedNodesSyntax(elements: unexpectedNodes, arena: self.arena),
2064+
RawUnexpectedNodesSyntax(unexpectedNodes, arena: self.arena),
20652065
rightSquare: rsquare, arena: self.arena)
20662066
} else {
20672067
captures = nil

Sources/SwiftParser/SyntaxUtils.swift

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212

1313
@_spi(RawSyntax) import SwiftSyntax
1414

15+
// MARK: - Unexpected nodes
16+
1517
extension RawUnexpectedNodesSyntax {
1618
/// Returns `true` if this contains a token that satisfies `condition`.
1719
func containsToken(where condition: (RawTokenSyntax) -> Bool) -> Bool {
@@ -41,6 +43,47 @@ extension RawUnexpectedNodesSyntax {
4143
}
4244
}
4345

46+
// MARK: Combining unexpected nodes
47+
48+
/// Implementation detail of `RawUnexpectedNodesSyntax.init(combining:arena)`.
49+
protocol UnexpectedNodesCombinable {
50+
var elements: [RawSyntax] { get }
51+
}
52+
53+
extension Array: UnexpectedNodesCombinable where Element: UnexpectedNodesCombinable {
54+
var elements: [RawSyntax] { self.flatMap { $0.elements } }
55+
}
56+
57+
extension Optional: UnexpectedNodesCombinable where Wrapped: UnexpectedNodesCombinable {
58+
var elements: [RawSyntax] {
59+
if let self = self {
60+
return self.elements
61+
} else {
62+
return []
63+
}
64+
}
65+
}
66+
67+
extension RawTokenSyntax: UnexpectedNodesCombinable {
68+
var elements: [RawSyntax] {
69+
return [RawSyntax(self)]
70+
}
71+
}
72+
73+
extension RawUnexpectedNodesSyntax: UnexpectedNodesCombinable {}
74+
75+
extension RawUnexpectedNodesSyntax {
76+
init?<T1: UnexpectedNodesCombinable, T2: UnexpectedNodesCombinable>(combining syntax1: T1, _ syntax2: T2, arena: SyntaxArena) {
77+
self.init(syntax1.elements + syntax2.elements, arena: arena)
78+
}
79+
80+
init?<T1: UnexpectedNodesCombinable, T2: UnexpectedNodesCombinable, T3: UnexpectedNodesCombinable>(combining syntax1: T1, _ syntax2: T2, _ syntax3: T3, arena: SyntaxArena) {
81+
self.init(syntax1.elements + syntax2.elements + syntax3.elements, arena: arena)
82+
}
83+
}
84+
85+
// MARK: - Misc
86+
4487
extension SyntaxText {
4588
var isEditorPlaceholder: Bool {
4689
return self.starts(with: SyntaxText("<#")) &&

Sources/SwiftParser/Types.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -465,7 +465,7 @@ extension Parser {
465465
keepGoing = trailingComma != nil
466466
elements.append(RawTupleTypeElementSyntax(
467467
inOut: nil,
468-
RawUnexpectedNodesSyntax(misplacedSpecifiers.map(RawSyntax.init) + (unexpectedBeforeFirst?.elements ?? []), arena: self.arena),
468+
RawUnexpectedNodesSyntax(combining: misplacedSpecifiers, unexpectedBeforeFirst, arena: self.arena),
469469
name: first,
470470
unexpectedBeforeSecond,
471471
secondName: second,

0 commit comments

Comments
 (0)