@@ -35,8 +35,8 @@ extension Parser {
35
35
repeat {
36
36
let entry : RawSyntax
37
37
switch source {
38
- case . available where self . currentToken . isIdentifier ,
39
- . unavailable where self . currentToken . isIdentifier :
38
+ case . available where self . at ( . identifier ) ,
39
+ . unavailable where self . at ( . identifier ) :
40
40
entry = RawSyntax ( self . parseAvailabilityMacro ( ) )
41
41
default :
42
42
entry = self . parseAvailabilitySpec ( )
@@ -48,15 +48,12 @@ extension Parser {
48
48
49
49
// Before continuing to parse the next specification, we check that it's
50
50
// also in the shorthand syntax and recover from it.
51
- if
52
- keepGoing != nil ,
53
- self . currentToken. isIdentifier,
54
- AvailabilityArgumentKind ( rawValue: self . currentToken. tokenText) != nil
55
- {
51
+ if keepGoing != nil ,
52
+ let ( _, handle) = self . at ( anyIn: AvailabilityArgumentKind . self) {
56
53
var tokens = [ RawTokenSyntax] ( )
57
- tokens. append ( self . consumeAnyToken ( ) )
54
+ tokens. append ( self . eat ( handle ) )
58
55
var recoveryProgress = LoopProgressCondition ( )
59
- while !self . at ( . eof) && ! self . at ( . comma) && ! self . at ( . rightParen) && recoveryProgress. evaluate ( currentToken) {
56
+ while !self . at ( any : [ . eof, . comma, . rightParen] ) && recoveryProgress. evaluate ( currentToken) {
60
57
tokens. append ( self . consumeAnyToken ( ) )
61
58
}
62
59
let syntax = RawTokenListSyntax ( elements: tokens, arena: self . arena)
@@ -70,7 +67,7 @@ extension Parser {
70
67
return RawAvailabilitySpecListSyntax ( elements: elements, arena: self . arena)
71
68
}
72
69
73
- enum AvailabilityArgumentKind : SyntaxText {
70
+ enum AvailabilityArgumentKind : SyntaxText , ContextualKeywords {
74
71
case message
75
72
case renamed
76
73
case introduced
@@ -92,21 +89,11 @@ extension Parser {
92
89
do {
93
90
var loopProgressCondition = LoopProgressCondition ( )
94
91
while keepGoing != nil && loopProgressCondition. evaluate ( currentToken) {
95
- guard self . currentToken. tokenKind == . identifier,
96
- let argKind = AvailabilityArgumentKind ( rawValue: self . currentToken. tokenText) else {
97
- // Not sure what this label is but, let's just eat it and
98
- // keep going.
99
- let arg = self . consumeAnyToken ( )
100
- keepGoing = self . consume ( if: . comma)
101
- elements. append ( RawAvailabilityArgumentSyntax (
102
- entry: RawSyntax ( arg) , trailingComma: keepGoing, arena: self . arena) )
103
- continue
104
- }
105
-
106
92
let entry : RawSyntax
107
- switch argKind {
108
- case . message, . renamed:
109
- let argumentLabel = self . consumeAnyToken ( )
93
+ switch self . at ( anyIn: AvailabilityArgumentKind . self) {
94
+ case ( . message, let handle) ? ,
95
+ ( . renamed, let handle) ? :
96
+ let argumentLabel = self . eat ( handle)
110
97
let ( unexpectedBeforeColon, colon) = self . expect ( . colon)
111
98
// FIXME: Make sure this is a string literal with no interpolation.
112
99
let stringValue = self . consumeAnyToken ( )
@@ -118,8 +105,9 @@ extension Parser {
118
105
value: RawSyntax ( stringValue) ,
119
106
arena: self . arena
120
107
) )
121
- case . introduced, . obsoleted:
122
- let argumentLabel = self . consumeAnyToken ( )
108
+ case ( . introduced, let handle) ? ,
109
+ ( . obsoleted, let handle) ? :
110
+ let argumentLabel = self . eat ( handle)
123
111
let ( unexpectedBeforeColon, colon) = self . expect ( . colon)
124
112
let version = self . parseVersionTuple ( )
125
113
entry = RawSyntax ( RawAvailabilityLabeledArgumentSyntax (
@@ -129,21 +117,29 @@ extension Parser {
129
117
value: RawSyntax ( version) ,
130
118
arena: self . arena
131
119
) )
132
- case . deprecated:
133
- let argumentLabel = self . consumeAnyToken ( )
134
- if self . at ( . colon) {
135
- let colon = self . eat ( . colon)
120
+ case ( . deprecated, let handle) ? :
121
+ let argumentLabel = self . eat ( handle)
122
+ if let colon = self . consume ( if: . colon) {
136
123
let version = self . parseVersionTuple ( )
137
124
entry = RawSyntax ( RawAvailabilityLabeledArgumentSyntax (
138
- label: argumentLabel, colon: colon, value: RawSyntax ( version) , arena: self . arena) )
125
+ label: argumentLabel,
126
+ colon: colon,
127
+ value: RawSyntax ( version) ,
128
+ arena: self . arena
129
+ ) )
139
130
} else {
140
131
entry = RawSyntax ( argumentLabel)
141
132
}
142
- case . unavailable, . noasync:
143
- let argument = self . consumeAnyToken ( )
133
+ case ( . unavailable, let handle) ? ,
134
+ ( . noasync, let handle) ? :
135
+ let argument = self . eat ( handle)
144
136
// FIXME: Can we model this in SwiftSyntax by making the
145
137
// 'labeled' argument part optional?
146
138
entry = RawSyntax ( argument)
139
+ case nil :
140
+ // Not sure what this label is but, let's just eat it and
141
+ // keep going.
142
+ entry = RawSyntax ( self . consumeAnyToken ( ) )
147
143
}
148
144
149
145
keepGoing = self . consume ( if: . comma)
@@ -162,15 +158,14 @@ extension Parser {
162
158
/// availability-argument → platform-name platform-version
163
159
/// availability-argument → *
164
160
mutating func parseAvailabilitySpec( ) -> RawSyntax {
165
- if self . currentToken. isBinaryOperator && self . currentToken. tokenText == " * " {
166
- let star = self . consumeAnyToken ( )
161
+ if let star = self . consumeIfContextualPunctuator ( " * " ) {
167
162
// FIXME: Use makeAvailabilityVersionRestriction here - but swift-format
168
163
// doesn't expect it.
169
164
return RawSyntax ( star)
170
165
}
171
166
172
- if self . currentToken . isIdentifier || self . at ( . wildcardKeyword) {
173
- if self . currentToken . tokenText == " swift " || self . currentToken . tokenText == " _PackageDescription " {
167
+ if self . at ( any : [ . identifier , . wildcardKeyword] ) {
168
+ if self . atContextualKeyword ( " swift " ) || self . atContextualKeyword ( " _PackageDescription " ) {
174
169
return RawSyntax ( self . parsePlatformAgnosticVersionConstraintSpec ( ) )
175
170
}
176
171
}
@@ -179,11 +174,14 @@ extension Parser {
179
174
}
180
175
181
176
mutating func parsePlatformAgnosticVersionConstraintSpec( ) -> RawAvailabilityVersionRestrictionSyntax {
182
- assert ( self . currentToken. isIdentifier || self . at ( . wildcardKeyword) )
183
- let platform = self . consumeAnyToken ( )
177
+ let ( unexpectedBeforePlatform, platform) = self . expectAny ( [ . identifier, . wildcardKeyword] , default: . identifier)
184
178
let version = self . parseVersionTuple ( )
185
179
return RawAvailabilityVersionRestrictionSyntax (
186
- platform: platform, version: version, arena: self . arena)
180
+ unexpectedBeforePlatform,
181
+ platform: platform,
182
+ version: version,
183
+ arena: self . arena
184
+ )
187
185
}
188
186
189
187
/// Parse a platform-specific version constraint.
@@ -202,7 +200,7 @@ extension Parser {
202
200
/// platform-name → tvOS
203
201
mutating func parsePlatformVersionConstraintSpec( ) -> RawAvailabilityVersionRestrictionSyntax {
204
202
// Register the platform name as a keyword token.
205
- let plaform = self . consume ( remapping: . contextualKeyword)
203
+ let plaform = self . consumeAnyToken ( remapping: . contextualKeyword)
206
204
let version = self . parseVersionTuple ( )
207
205
return RawAvailabilityVersionRestrictionSyntax (
208
206
platform: plaform, version: version, arena: self . arena)
@@ -220,9 +218,9 @@ extension Parser {
220
218
let platform = self . consumeAnyToken ( )
221
219
222
220
let version : RawVersionTupleSyntax ?
223
- if case . integerLiteral = self . currentToken . tokenKind {
221
+ if self . at ( . integerLiteral ) {
224
222
version = self . parseVersionTuple ( )
225
- } else if case . floatingLiteral = self . currentToken . tokenKind {
223
+ } else if self . at ( . floatingLiteral ) {
226
224
version = self . parseVersionTuple ( )
227
225
} else {
228
226
version = nil
@@ -241,7 +239,7 @@ extension Parser {
241
239
/// platform-version → decimal-digits '.' decimal-digits
242
240
/// platform-version → decimal-digits '.' decimal-digits '.' decimal-digits
243
241
mutating func parseVersionTuple( ) -> RawVersionTupleSyntax {
244
- if self . currentToken . tokenKind == . integerLiteral {
242
+ if self . at ( . integerLiteral) {
245
243
let majorMinor = self . consumeAnyToken ( )
246
244
return RawVersionTupleSyntax (
247
245
majorMinor: RawSyntax ( majorMinor) , patchPeriod: nil , patchVersion: nil ,
0 commit comments