Skip to content

Commit 24655ae

Browse files
committed
Refactor loop for #if directive parsing
This makes it easier to implement recovery in the future.
1 parent 00cf557 commit 24655ae

File tree

1 file changed

+13
-12
lines changed

1 file changed

+13
-12
lines changed

Sources/SwiftParser/Directives.swift

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -68,22 +68,23 @@ extension Parser {
6868
) -> RawIfConfigDeclSyntax {
6969
var clauses = [RawIfConfigClauseSyntax]()
7070
do {
71-
var (unexpectedBeforePoundIf, poundIf) = self.expect(.poundIfKeyword)
71+
var firstIteration = true
7272
var loopProgress = LoopProgressCondition()
73-
repeat {
73+
while let poundIf = self.consume(ifAny: firstIteration ? [.poundIfKeyword] : [.poundIfKeyword, .poundElseifKeyword, .poundElseKeyword]),
74+
loopProgress.evaluate(self.currentToken) {
75+
firstIteration = false
7476
// Parse the condition.
77+
let unexpectedBeforePoundIf: RawUnexpectedNodesSyntax?
7578
let condition: RawExprSyntax?
76-
if let parsedElse = self.consume(if: .poundElseKeyword) {
79+
switch poundIf.tokenKind {
80+
case .poundIfKeyword, .poundElseifKeyword:
7781
unexpectedBeforePoundIf = nil
78-
poundIf = parsedElse
79-
condition = nil
80-
} else if let poundElseif = self.consume(if: .poundElseifKeyword) {
81-
unexpectedBeforePoundIf = nil
82-
poundIf = poundElseif
83-
condition = RawExprSyntax(self.parseSequenceExpression(.basic, forDirective: true))
84-
} else {
85-
assert(poundIf.tokenKind == .poundIfKeyword)
8682
condition = RawExprSyntax(self.parseSequenceExpression(.basic, forDirective: true))
83+
case .poundElseKeyword:
84+
unexpectedBeforePoundIf = nil
85+
condition = nil
86+
default:
87+
preconditionFailure("The loop condition should guarantee that we are at one of these tokens")
8788
}
8889

8990
var elements = [Element]()
@@ -104,7 +105,7 @@ extension Parser {
104105
condition: condition,
105106
elements: syntax(&self, elements),
106107
arena: self.arena))
107-
} while self.at(any: [.poundElseifKeyword, .poundElseKeyword]) && loopProgress.evaluate(currentToken)
108+
}
108109
}
109110

110111
let (unexpectedBeforePoundEndIf, poundEndIf) = self.expect(.poundEndifKeyword)

0 commit comments

Comments
 (0)