Skip to content

Commit 13287bb

Browse files
authored
Merge pull request #1005 from ahoppen/ahoppen/combine-unexpected
Add a convenience initializer to combine unexpected nodes
2 parents a2a871f + 631d5c5 commit 13287bb

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,
@@ -1029,7 +1029,7 @@ extension Parser {
10291029
return RawFunctionParameterSyntax(
10301030
attributes: attrs,
10311031
modifiers: modifiers,
1032-
RawUnexpectedNodesSyntax(misplacedSpecifiers.map(RawSyntax.init) + (unexpectedBeforeFirstName?.elements ?? []), arena: self.arena),
1032+
RawUnexpectedNodesSyntax(combining: misplacedSpecifiers, unexpectedBeforeFirstName, arena: self.arena),
10331033
firstName: firstName,
10341034
unexpectedBeforeSecondName,
10351035
secondName: secondName,
@@ -1352,10 +1352,10 @@ extension Parser {
13521352
pattern: .none
13531353
)
13541354
initializer = RawInitializerClauseSyntax(
1355-
RawUnexpectedNodesSyntax(
1356-
(typeAnnotationUnwrapped.unexpectedBeforeColon?.elements ?? []) +
1357-
[RawSyntax(typeAnnotationUnwrapped.colon)] +
1358-
(typeAnnotationUnwrapped.unexpectedBetweenColonAndType?.elements ?? []),
1355+
RawUnexpectedNodesSyntax(combining:
1356+
typeAnnotationUnwrapped.unexpectedBeforeColon,
1357+
typeAnnotationUnwrapped.colon,
1358+
typeAnnotationUnwrapped.unexpectedBetweenColonAndType,
13591359
arena: self.arena
13601360
),
13611361
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)