Skip to content

Commit 768c821

Browse files
committed
Change LoopProgress.evaluate to take a TokenConsumer instead of a Lexeme
This slightly simpifies the call sides.
1 parent d21d996 commit 768c821

19 files changed

+93
-79
lines changed

Sources/SwiftParser/Attributes.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ extension Parser {
2323
repeat {
2424
let attribute = self.parseAttribute()
2525
elements.append(attribute)
26-
} while self.at(.atSign, .poundIfKeyword) && loopProgress.evaluate(currentToken)
26+
} while self.at(.atSign, .poundIfKeyword) && loopProgress.evaluate(self)
2727
return RawAttributeListSyntax(elements: elements, arena: self.arena)
2828
}
2929
}
@@ -453,7 +453,7 @@ extension Parser {
453453

454454
var elements = [RawDifferentiabilityParamSyntax]()
455455
var loopProgress = LoopProgressCondition()
456-
while !self.at(.endOfFile, .rightParen) && loopProgress.evaluate(currentToken) {
456+
while !self.at(.endOfFile, .rightParen) && loopProgress.evaluate(self) {
457457
guard let param = self.parseDifferentiabilityParameter() else {
458458
break
459459
}
@@ -594,7 +594,7 @@ extension Parser {
594594
mutating func parseObjectiveCSelector() -> RawObjCSelectorSyntax {
595595
var elements = [RawObjCSelectorPieceSyntax]()
596596
var loopProgress = LoopProgressCondition()
597-
while loopProgress.evaluate(currentToken) {
597+
while loopProgress.evaluate(self) {
598598
// Empty selector piece.
599599
if let colon = self.consume(if: .colon) {
600600
elements.append(
@@ -676,7 +676,7 @@ extension Parser {
676676
var elements = [RawSpecializeAttributeSpecListSyntax.Element]()
677677
// Parse optional "exported" and "kind" labeled parameters.
678678
var loopProgress = LoopProgressCondition()
679-
while !self.at(.endOfFile, .rightParen, .keyword(.where)) && loopProgress.evaluate(currentToken) {
679+
while !self.at(.endOfFile, .rightParen, .keyword(.where)) && loopProgress.evaluate(self) {
680680
switch self.at(anyIn: SpecializeParameter.self) {
681681
case (.target, let handle)?:
682682
let ident = self.eat(handle)

Sources/SwiftParser/Availability.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ extension Parser {
4848
arena: self.arena
4949
)
5050
)
51-
} while keepGoing != nil && availabilityArgumentProgress.evaluate(currentToken)
51+
} while keepGoing != nil && availabilityArgumentProgress.evaluate(self)
5252
}
5353

5454
return RawAvailabilitySpecListSyntax(elements: elements, arena: self.arena)
@@ -176,7 +176,7 @@ extension Parser {
176176
arena: self.arena
177177
)
178178
)
179-
} while keepGoing != nil && loopProgressCondition.evaluate(currentToken)
179+
} while keepGoing != nil && loopProgressCondition.evaluate(self)
180180
return RawAvailabilitySpecListSyntax(elements: elements, arena: self.arena)
181181
}
182182

@@ -266,7 +266,7 @@ extension Parser {
266266
unexpectedTokens.append(unexpectedVersion)
267267
}
268268
keepGoing = self.consume(if: .period)
269-
} while keepGoing != nil && loopProgress.evaluate(currentToken)
269+
} while keepGoing != nil && loopProgress.evaluate(self)
270270
return RawUnexpectedNodesSyntax(unexpectedTokens, arena: self.arena)
271271
}
272272

Sources/SwiftParser/Declarations.swift

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ extension TokenConsumer {
6161

6262
var hasAttribute = false
6363
var attributeProgress = LoopProgressCondition()
64-
while attributeProgress.evaluate(subparser.currentToken) && subparser.at(.atSign) {
64+
while attributeProgress.evaluate(subparser) && subparser.at(.atSign) {
6565
hasAttribute = true
6666
_ = subparser.consumeAttributeList()
6767
}
@@ -71,7 +71,7 @@ extension TokenConsumer {
7171
var modifierProgress = LoopProgressCondition()
7272
while let (modifierKind, handle) = subparser.at(anyIn: DeclarationModifier.self),
7373
modifierKind != .class,
74-
modifierProgress.evaluate(subparser.currentToken)
74+
modifierProgress.evaluate(subparser)
7575
{
7676
hasModifier = true
7777
subparser.eat(handle)
@@ -356,7 +356,7 @@ extension Parser {
356356
arena: self.arena
357357
)
358358
)
359-
} while keepGoing != nil && loopProgress.evaluate(currentToken)
359+
} while keepGoing != nil && loopProgress.evaluate(self)
360360
return RawImportPathSyntax(elements: elements, arena: self.arena)
361361
}
362362
}
@@ -508,7 +508,7 @@ extension Parser {
508508
arena: self.arena
509509
)
510510
)
511-
} while keepGoing != nil && loopProgress.evaluate(currentToken)
511+
} while keepGoing != nil && loopProgress.evaluate(self)
512512
}
513513

514514
let whereClause: RawGenericWhereClauseSyntax?
@@ -719,7 +719,7 @@ extension Parser {
719719
arena: self.arena
720720
)
721721
)
722-
} while keepGoing != nil && loopProgress.evaluate(currentToken)
722+
} while keepGoing != nil && loopProgress.evaluate(self)
723723
}
724724

725725
return RawGenericWhereClauseSyntax(
@@ -776,7 +776,7 @@ extension Parser {
776776
let (unexpectedBeforeLBrace, lbrace) = self.expect(.leftBrace)
777777
do {
778778
var loopProgress = LoopProgressCondition()
779-
while !self.at(.endOfFile, .rightBrace) && loopProgress.evaluate(currentToken) {
779+
while !self.at(.endOfFile, .rightBrace) && loopProgress.evaluate(self) {
780780
let newItemAtStartOfLine = self.currentToken.isAtStartOfLine
781781
guard let newElement = self.parseMemberDeclListItem() else {
782782
break
@@ -876,7 +876,7 @@ extension Parser {
876876
arena: self.arena
877877
)
878878
)
879-
} while keepGoing != nil && loopProgress.evaluate(currentToken)
879+
} while keepGoing != nil && loopProgress.evaluate(self)
880880
}
881881

882882
return RawEnumCaseDeclSyntax(
@@ -1394,7 +1394,7 @@ extension Parser {
13941394
arena: self.arena
13951395
)
13961396
)
1397-
} while keepGoing != nil && loopProgress.evaluate(currentToken)
1397+
} while keepGoing != nil && loopProgress.evaluate(self)
13981398
}
13991399

14001400
return RawVariableDeclSyntax(
@@ -1539,7 +1539,7 @@ extension Parser {
15391539
var elements = [RawAccessorDeclSyntax]()
15401540
do {
15411541
var loopProgress = LoopProgressCondition()
1542-
while !self.at(.endOfFile, .rightBrace) && loopProgress.evaluate(currentToken) {
1542+
while !self.at(.endOfFile, .rightBrace) && loopProgress.evaluate(self) {
15431543
guard let introducer = self.parseAccessorIntroducer() else {
15441544
// There can only be an implicit getter if no other accessors were
15451545
// seen before this one.
@@ -1759,7 +1759,7 @@ extension Parser {
17591759
while (identifiersAfterOperatorName.last ?? name).trailingTriviaByteLength == 0,
17601760
self.currentToken.leadingTriviaByteLength == 0,
17611761
!self.at(.colon, .leftBrace, .endOfFile),
1762-
loopProgress.evaluate(self.currentToken)
1762+
loopProgress.evaluate(self)
17631763
{
17641764
identifiersAfterOperatorName.append(consumeAnyToken())
17651765
}
@@ -1906,7 +1906,7 @@ extension Parser {
19061906
var elements = [RawPrecedenceGroupAttributeListSyntax.Element]()
19071907
do {
19081908
var attributesProgress = LoopProgressCondition()
1909-
LOOP: while !self.at(.endOfFile, .rightBrace) && attributesProgress.evaluate(currentToken) {
1909+
LOOP: while !self.at(.endOfFile, .rightBrace) && attributesProgress.evaluate(self) {
19101910
switch self.at(anyIn: LabelText.self) {
19111911
case (.associativity, let handle)?:
19121912
let associativity = self.eat(handle)
@@ -1970,7 +1970,7 @@ extension Parser {
19701970
arena: self.arena
19711971
)
19721972
)
1973-
} while keepGoing != nil && namesProgress.evaluate(currentToken)
1973+
} while keepGoing != nil && namesProgress.evaluate(self)
19741974
}
19751975
elements.append(
19761976
.precedenceGroupRelation(

Sources/SwiftParser/Directives.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ extension Parser {
121121

122122
// Proceed to parse #if continuation clauses (#elseif, #else, check #elif typo, #endif)
123123
var loopProgress = LoopProgressCondition()
124-
LOOP: while let (match, handle) = self.canRecoverTo(anyIn: IfConfigContinuationClauseStartKeyword.self), loopProgress.evaluate(self.currentToken) {
124+
LOOP: while let (match, handle) = self.canRecoverTo(anyIn: IfConfigContinuationClauseStartKeyword.self), loopProgress.evaluate(self) {
125125
var unexpectedBeforePoundKeyword: RawUnexpectedNodesSyntax?
126126
var poundKeyword: RawTokenSyntax
127127
let condition: RawExprSyntax?
@@ -208,7 +208,7 @@ extension Parser {
208208
while !self.at(.endOfFile)
209209
&& !self.at(.poundElseKeyword, .poundElseifKeyword, .poundEndifKeyword)
210210
&& !self.atElifTypo()
211-
&& elementsProgress.evaluate(currentToken)
211+
&& elementsProgress.evaluate(self)
212212
{
213213
let newItemAtStartOfLine = self.currentToken.isAtStartOfLine
214214
guard let element = parseElement(&self, elements.isEmpty), !element.isEmpty else {

Sources/SwiftParser/Expressions.swift

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ extension Parser {
151151
)
152152

153153
var loopCondition = LoopProgressCondition()
154-
while loopCondition.evaluate(currentToken) {
154+
while loopCondition.evaluate(self) {
155155
guard
156156
!lastElement.is(RawMissingExprSyntax.self),
157157
!(forDirective && self.currentToken.isAtStartOfLine)
@@ -806,7 +806,7 @@ extension Parser {
806806
// Handle suffix expressions.
807807
var leadingExpr = start
808808
var loopCondition = LoopProgressCondition()
809-
while loopCondition.evaluate(currentToken) {
809+
while loopCondition.evaluate(self) {
810810
if forDirective && self.currentToken.isAtStartOfLine {
811811
return leadingExpr
812812
}
@@ -963,7 +963,7 @@ extension Parser {
963963
while !backtrack.at(.endOfFile) && !backtrack.currentToken.isAtStartOfLine {
964964
backtrack.skipSingle()
965965
}
966-
} while backtrack.at(.poundIfKeyword) && loopProgress.evaluate(backtrack.currentToken)
966+
} while backtrack.at(.poundIfKeyword) && loopProgress.evaluate(backtrack)
967967

968968
guard backtrack.isAtStartOfPostfixExprSuffix() else {
969969
break
@@ -1086,7 +1086,7 @@ extension Parser {
10861086

10871087
var components: [RawKeyPathComponentSyntax] = []
10881088
var loopCondition = LoopProgressCondition()
1089-
while loopCondition.evaluate(currentToken) {
1089+
while loopCondition.evaluate(self) {
10901090
// Check for a [] or .[] suffix. The latter is only permitted when there
10911091
// are no components.
10921092
if self.at(TokenSpec(.leftSquare, allowAtStartOfLine: false))
@@ -1692,7 +1692,7 @@ extension Parser {
16921692
var elements = [RawSyntax]()
16931693
do {
16941694
var collectionLoopCondition = LoopProgressCondition()
1695-
COLLECTION_LOOP: while collectionLoopCondition.evaluate(currentToken) {
1695+
COLLECTION_LOOP: while collectionLoopCondition.evaluate(self) {
16961696
elementKind = self.parseCollectionElement(elementKind)
16971697

16981698
// Parse the ',' if exists.
@@ -1936,7 +1936,7 @@ extension Parser {
19361936
arena: self.arena
19371937
)
19381938
)
1939-
} while keepGoing != nil && loopProgress.evaluate(currentToken)
1939+
} while keepGoing != nil && loopProgress.evaluate(self)
19401940
}
19411941
// We were promised a right square bracket, so we're going to get it.
19421942
var unexpectedNodes = [RawSyntax]()
@@ -1991,7 +1991,7 @@ extension Parser {
19911991
arena: self.arena
19921992
)
19931993
)
1994-
} while keepGoing != nil && loopProgress.evaluate(currentToken)
1994+
} while keepGoing != nil && loopProgress.evaluate(self)
19951995
}
19961996

19971997
parameterClause = .simpleInput(RawClosureParamListSyntax(elements: params, arena: self.arena))
@@ -2130,7 +2130,7 @@ extension Parser {
21302130
arena: self.arena
21312131
)
21322132
)
2133-
} while keepGoing != nil && loopProgress.evaluate(currentToken)
2133+
} while keepGoing != nil && loopProgress.evaluate(self)
21342134
return result
21352135
}
21362136
}
@@ -2151,7 +2151,7 @@ extension Parser {
21512151
// Parse labeled trailing closures.
21522152
var elements = [RawMultipleTrailingClosureElementSyntax]()
21532153
var loopProgress = LoopProgressCondition()
2154-
while self.withLookahead({ $0.isStartOfLabelledTrailingClosure() }) && loopProgress.evaluate(currentToken) {
2154+
while self.withLookahead({ $0.isStartOfLabelledTrailingClosure() }) && loopProgress.evaluate(self) {
21552155
let (unexpectedBeforeLabel, label) = self.parseArgumentLabel()
21562156
let (unexpectedBeforeColon, colon) = self.expect(.colon)
21572157
let closure = self.parseClosureExpression()
@@ -2248,7 +2248,7 @@ extension Parser.Lookahead {
22482248
var loopProgress = LoopProgressCondition()
22492249
while !backtrack.at(.endOfFile, .rightBrace)
22502250
&& !backtrack.at(.poundEndifKeyword, .poundElseKeyword, .poundElseifKeyword)
2251-
&& loopProgress.evaluate(backtrack.currentToken)
2251+
&& loopProgress.evaluate(backtrack)
22522252
{
22532253
backtrack.skipSingle()
22542254
}
@@ -2400,7 +2400,7 @@ extension Parser {
24002400
var elements = [RawSwitchCaseListSyntax.Element]()
24012401
var elementsProgress = LoopProgressCondition()
24022402
while !self.at(.endOfFile, .rightBrace) && !self.at(.poundEndifKeyword, .poundElseifKeyword, .poundElseKeyword)
2403-
&& elementsProgress.evaluate(currentToken)
2403+
&& elementsProgress.evaluate(self)
24042404
{
24052405
if self.withLookahead({ $0.isAtStartOfSwitchCase(allowRecovery: false) }) {
24062406
elements.append(.switchCase(self.parseSwitchCase()))
@@ -2564,7 +2564,7 @@ extension Parser {
25642564
arena: self.arena
25652565
)
25662566
)
2567-
} while keepGoing != nil && loopProgress.evaluate(currentToken)
2567+
} while keepGoing != nil && loopProgress.evaluate(self)
25682568
}
25692569
let (unexpectedBeforeColon, colon) = self.expect(.colon)
25702570
return RawSwitchCaseLabelSyntax(
@@ -2677,7 +2677,7 @@ extension Parser.Lookahead {
26772677
mutating func consumeEffectsSpecifiers() {
26782678
var loopProgress = LoopProgressCondition()
26792679
while let (_, handle) = self.at(anyIn: EffectSpecifier.self),
2680-
loopProgress.evaluate(currentToken)
2680+
loopProgress.evaluate(self)
26812681
{
26822682
self.eat(handle)
26832683
}
@@ -2687,7 +2687,7 @@ extension Parser.Lookahead {
26872687
// Consume attributes.
26882688
var lookahead = self.lookahead()
26892689
var attributesProgress = LoopProgressCondition()
2690-
while let _ = lookahead.consume(if: .atSign), attributesProgress.evaluate(lookahead.currentToken) {
2690+
while let _ = lookahead.consume(if: .atSign), attributesProgress.evaluate(lookahead) {
26912691
guard lookahead.at(.identifier) else {
26922692
break
26932693
}
@@ -2707,7 +2707,7 @@ extension Parser.Lookahead {
27072707

27082708
// While we don't have '->' or ')', eat balanced tokens.
27092709
var skipProgress = LoopProgressCondition()
2710-
while !lookahead.at(.endOfFile, .rightParen) && skipProgress.evaluate(lookahead.currentToken) {
2710+
while !lookahead.at(.endOfFile, .rightParen) && skipProgress.evaluate(lookahead) {
27112711
lookahead.skipSingle()
27122712
}
27132713

@@ -2730,7 +2730,7 @@ extension Parser.Lookahead {
27302730
lookahead.consumeAnyToken()
27312731

27322732
var parametersProgress = LoopProgressCondition()
2733-
while lookahead.consume(if: .comma) != nil && parametersProgress.evaluate(lookahead.currentToken) {
2733+
while lookahead.consume(if: .comma) != nil && parametersProgress.evaluate(lookahead) {
27342734
if lookahead.at(.identifier) || lookahead.at(.wildcard) {
27352735
lookahead.consumeAnyToken()
27362736
continue

Sources/SwiftParser/Lookahead.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,7 @@ extension Parser.Lookahead {
222222
self.skipUntilEndOfLine()
223223

224224
var attributesLoopProgress = LoopProgressCondition()
225-
ATTRIBUTE_LOOP: while attributesLoopProgress.evaluate(self.currentToken) {
225+
ATTRIBUTE_LOOP: while attributesLoopProgress.evaluate(self) {
226226
switch self.currentToken.rawTokenKind {
227227
case .atSign:
228228
didSeeAnyAttributes = true
@@ -233,7 +233,7 @@ extension Parser.Lookahead {
233233
break ATTRIBUTE_LOOP
234234
}
235235
}
236-
} while self.at(.poundElseifKeyword, .poundElseKeyword) && poundIfLoopProgress.evaluate(self.currentToken)
236+
} while self.at(.poundElseifKeyword, .poundElseKeyword) && poundIfLoopProgress.evaluate(self)
237237

238238
return didSeeAnyAttributes && self.currentToken.isAtStartOfLine && self.consume(if: .poundEndifKeyword) != nil
239239
}

Sources/SwiftParser/LoopProgressCondition.swift

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,25 @@ struct LoopProgressCondition {
2020
init() {}
2121

2222
/// Check that the loop has made progress since `evaluate` was called the last time.
23-
/// `currentToken` is the current token of the parser.
2423
/// In assert builds, this traps if the loop has not made any parser progress in between two iterations,
2524
/// ie. it checks if the parser's `currentToken` has changed in between two calls to `evaluate`.
2625
/// In non-assert builds, `evaluate()` returns `false` if the loop has not made progress, thus aborting the loop.
27-
mutating func evaluate(_ currentToken: Lexer.Lexeme) -> Bool {
26+
@inline(__always)
27+
mutating func evaluate(_ parser: Parser) -> Bool {
28+
return evaluate(parser.currentToken)
29+
}
30+
31+
/// Check that the loop has made progress since `evaluate` was called the last time.
32+
/// In assert builds, this traps if the loop has not made any parser progress in between two iterations,
33+
/// ie. it checks if the parser's `currentToken` has changed in between two calls to `evaluate`.
34+
/// In non-assert builds, `evaluate()` returns `false` if the loop has not made progress, thus aborting the loop.
35+
@inline(__always)
36+
mutating func evaluate(_ parser: Parser.Lookahead) -> Bool {
37+
return evaluate(parser.currentToken)
38+
}
39+
40+
/// Implementation of the above `evaluate` methods.
41+
private mutating func evaluate(_ currentToken: Lexer.Lexeme) -> Bool {
2842
defer {
2943
self.currentToken = currentToken
3044
}

Sources/SwiftParser/Modifiers.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ extension Parser {
1616
mutating func parseModifierList() -> RawModifierListSyntax? {
1717
var elements = [RawDeclModifierSyntax]()
1818
var modifierLoopCondition = LoopProgressCondition()
19-
MODIFIER_LOOP: while modifierLoopCondition.evaluate(currentToken) {
19+
MODIFIER_LOOP: while modifierLoopCondition.evaluate(self) {
2020
switch self.canRecoverTo(anyIn: DeclarationStart.self) {
2121
case (.declarationModifier(.private), _)?,
2222
(.declarationModifier(.fileprivate), _)?,

0 commit comments

Comments
 (0)