@@ -181,24 +181,20 @@ extension Parser {
181
181
}
182
182
183
183
184
- let ( unexpectedBeforeAtSign, atSign) = self . eat ( . atSign)
184
+ let ( unexpectedBeforeAtSign, atSign) = self . expect ( . atSign)
185
185
let ident = self . consumeIdentifier ( )
186
- let unexpectedBeforeLeftParen : RawUnexpectedNodesSyntax ?
187
- let leftParen : RawTokenSyntax ?
186
+ let leftParen = self . consume ( if: . leftParen)
188
187
let arg : RawSyntax ?
189
188
let unexpectedBeforeRightParen : RawUnexpectedNodesSyntax ?
190
189
let rightParen : RawTokenSyntax ?
191
- if self . at ( . leftParen) {
190
+ if leftParen != nil {
192
191
var args = [ RawTokenSyntax] ( )
193
- ( unexpectedBeforeLeftParen, leftParen) = self . eat ( . leftParen)
194
192
while !self . at ( . eof) , !self . at ( . rightParen) {
195
193
args. append ( self . consumeAnyToken ( ) )
196
194
}
197
195
arg = RawSyntax ( RawTokenListSyntax ( elements: args, arena: self . arena) )
198
196
( unexpectedBeforeRightParen, rightParen) = self . expect ( . rightParen)
199
197
} else {
200
- unexpectedBeforeLeftParen = nil
201
- leftParen = nil
202
198
arg = nil
203
199
unexpectedBeforeRightParen = nil
204
200
rightParen = nil
@@ -207,7 +203,6 @@ extension Parser {
207
203
unexpectedBeforeAtSign,
208
204
atSignToken: atSign,
209
205
attributeName: ident,
210
- unexpectedBeforeLeftParen,
211
206
leftParen: leftParen,
212
207
argument: arg,
213
208
unexpectedBeforeRightParen,
@@ -217,25 +212,25 @@ extension Parser {
217
212
}
218
213
219
214
mutating func parseCustomAttribute( ) -> RawCustomAttributeSyntax {
220
- let ( unexpectedBeforeAtSign, atSign) = self . eat ( . atSign)
215
+ let ( unexpectedBeforeAtSign, atSign) = self . expect ( . atSign)
221
216
let attrName = self . parseType ( )
222
217
223
218
// Custom attributes are stricter than normal attributes about their
224
219
// argument lists "immediately" following the attribute name.
225
- guard self . at ( . leftParen) && !self . currentToken. isAtStartOfLine && self . lookahead ( ) . isCustomAttributeArgument ( ) else {
220
+ guard let leftParen = self . consume ( if: . leftParen, where: { ( lexeme, parser) in
221
+ !lexeme. isAtStartOfLine && parser. lookahead ( ) . isCustomAttributeArgument ( )
222
+ } ) else {
226
223
return RawCustomAttributeSyntax (
227
224
atSignToken: atSign, attributeName: attrName,
228
225
leftParen: nil , argumentList: nil , rightParen: nil ,
229
226
arena: self . arena)
230
227
}
231
- let ( unexpectedBeforeLeftParen, leftParen) = self . eat ( . leftParen)
232
228
let arguments = self . parseArgumentListElements ( )
233
229
let ( unexpectedBeforeRightParen, rightParen) = self . expect ( . rightParen)
234
230
return RawCustomAttributeSyntax (
235
231
unexpectedBeforeAtSign,
236
232
atSignToken: atSign,
237
233
attributeName: attrName,
238
- unexpectedBeforeLeftParen,
239
234
leftParen: leftParen,
240
235
argumentList: RawTupleExprElementListSyntax ( elements: arguments, arena: self . arena) ,
241
236
unexpectedBeforeRightParen,
@@ -246,7 +241,7 @@ extension Parser {
246
241
247
242
extension Parser {
248
243
mutating func parseAvailabilityAttribute( ) -> RawAttributeSyntax {
249
- let ( unexpectedBeforeAtSign, atSign) = self . eat ( . atSign)
244
+ let ( unexpectedBeforeAtSign, atSign) = self . expect ( . atSign)
250
245
assert ( self . currentToken. tokenText == " available " )
251
246
let available = self . consumeAnyToken ( )
252
247
let ( unexpectedBeforeLeftParen, leftParen) = self . expect ( . leftParen)
@@ -279,7 +274,7 @@ extension Parser {
279
274
280
275
extension Parser {
281
276
mutating func parseDifferentiableAttribute( ) -> RawAttributeSyntax {
282
- let ( unexpectedBeforeAtSign, atSign) = self . eat ( . atSign)
277
+ let ( unexpectedBeforeAtSign, atSign) = self . expect ( . atSign)
283
278
assert ( self . currentToken. tokenText == " differentiable " )
284
279
let differentiable = self . consumeAnyToken ( )
285
280
let ( unexpectedBeforeLeftParen, leftParen) = self . expect ( . leftParen)
@@ -349,7 +344,7 @@ extension Parser {
349
344
let wrt = self . consumeIdentifier ( )
350
345
let ( unexpectedBeforeColon, colon) = self . expect ( . colon)
351
346
352
- guard self . at ( . leftParen) else {
347
+ guard let leftParen = self . consume ( if : . leftParen) else {
353
348
// If no opening '(' for parameter list, parse a single parameter.
354
349
let param = self . parseDifferentiabilityParameter ( ) . map ( RawSyntax . init ( _: ) )
355
350
?? RawSyntax ( RawMissingSyntax ( arena: self . arena) )
@@ -362,7 +357,6 @@ extension Parser {
362
357
)
363
358
}
364
359
365
- let ( unexpectedBeforeLeftParen, leftParen) = self . eat ( . leftParen)
366
360
var elements = [ RawDifferentiabilityParamSyntax] ( )
367
361
while !self . at ( . eof) && !self . at ( . rightParen) {
368
362
guard let param = self . parseDifferentiabilityParameter ( ) else {
@@ -374,7 +368,6 @@ extension Parser {
374
368
375
369
let parameters = RawDifferentiabilityParamListSyntax ( elements: elements, arena: self . arena)
376
370
let list = RawDifferentiabilityParamsSyntax (
377
- unexpectedBeforeLeftParen,
378
371
leftParen: leftParen,
379
372
diffParams: parameters,
380
373
unexpectedBeforeRightParen,
@@ -391,50 +384,59 @@ extension Parser {
391
384
}
392
385
393
386
mutating func parseDifferentiabilityParameter( ) -> RawDifferentiabilityParamSyntax ? {
394
- switch self . currentToken. tokenKind {
395
- case . identifier:
396
- let token = self . consumeIdentifier ( )
387
+ enum ExpectedTokenKind : RawTokenKindSubset {
388
+ case identifier
389
+ case integerLiteral
390
+ case selfKeyword
391
+
392
+ var rawTokenKind : RawTokenKind {
393
+ switch self {
394
+ case . identifier: return . identifier
395
+ case . integerLiteral: return . integerLiteral
396
+ case . selfKeyword: return . selfKeyword
397
+ }
398
+ }
399
+ }
400
+
401
+ switch self . at ( anyIn: ExpectedTokenKind . self) {
402
+ case ( . identifier, let handle) ? :
403
+ let token = self . eat ( handle)
397
404
let comma = self . consume ( if: . comma)
398
405
return RawDifferentiabilityParamSyntax (
399
406
parameter: RawSyntax ( token) , trailingComma: comma, arena: self . arena)
400
- case . integerLiteral:
401
- let token = self . consumeAnyToken ( )
407
+ case ( . integerLiteral, let handle ) ? :
408
+ let token = self . eat ( handle )
402
409
let comma = self . consume ( if: . comma)
403
410
return RawDifferentiabilityParamSyntax (
404
411
parameter: RawSyntax ( token) , trailingComma: comma, arena: self . arena)
405
- case . selfKeyword:
406
- let ( unexpectedBeforeToken , token) = self . eat ( . selfKeyword )
412
+ case ( . selfKeyword, let handle ) ? :
413
+ let token = self . eat ( handle )
407
414
let comma = self . consume ( if: . comma)
408
415
return RawDifferentiabilityParamSyntax (
409
- unexpectedBeforeToken,
410
416
parameter: RawSyntax ( token) ,
411
417
trailingComma: comma,
412
418
arena: self . arena
413
419
)
414
- default :
420
+ case nil :
415
421
return nil
416
422
}
417
423
}
418
424
}
419
425
420
426
extension Parser {
421
427
mutating func parseObjectiveCAttribute( ) -> RawAttributeSyntax {
422
- let ( unexpectedBeforeAtSign, atSign) = self . eat ( . atSign)
428
+ let ( unexpectedBeforeAtSign, atSign) = self . expect ( . atSign)
423
429
assert ( self . currentToken. tokenText == " objc " )
424
430
let objc = self . consumeAnyToken ( )
425
431
426
- let unexpectedBeforeLeftParen : RawUnexpectedNodesSyntax ?
427
- let leftParen : RawTokenSyntax ?
432
+ let leftParen = self . consume ( if: . leftParen)
428
433
let argument : RawObjCSelectorSyntax ?
429
434
let unexpectedBeforeRightParen : RawUnexpectedNodesSyntax ?
430
435
let rightParen : RawTokenSyntax ?
431
- if self . at ( . leftParen) {
432
- ( unexpectedBeforeLeftParen, leftParen) = self . eat ( . leftParen)
436
+ if leftParen != nil {
433
437
argument = self . parseObjectiveCSelector ( )
434
438
( unexpectedBeforeRightParen, rightParen) = self . expect ( . rightParen)
435
439
} else {
436
- unexpectedBeforeLeftParen = nil
437
- leftParen = nil
438
440
argument = nil
439
441
unexpectedBeforeRightParen = nil
440
442
rightParen = nil
@@ -444,7 +446,6 @@ extension Parser {
444
446
unexpectedBeforeAtSign,
445
447
atSignToken: atSign,
446
448
attributeName: objc,
447
- unexpectedBeforeLeftParen,
448
449
leftParen: leftParen,
449
450
argument: argument. map ( RawSyntax . init) ,
450
451
unexpectedBeforeRightParen,
@@ -457,11 +458,9 @@ extension Parser {
457
458
var elements = [ RawObjCSelectorPieceSyntax] ( )
458
459
while !self . at ( . eof) && !self . at ( . rightParen) {
459
460
// Empty selector piece.
460
- if self . at ( . colon) {
461
- let ( unexpectedBeforeColon, colon) = self . eat ( . colon)
461
+ if let colon = self . consume ( if: . colon) {
462
462
elements. append ( RawObjCSelectorPieceSyntax (
463
463
name: nil ,
464
- unexpectedBeforeColon,
465
464
colon: colon,
466
465
arena: self . arena
467
466
) )
@@ -484,7 +483,7 @@ extension Parser {
484
483
485
484
extension Parser {
486
485
mutating func parseSpecializeAttribute( ) -> RawAttributeSyntax {
487
- let ( unexpectedBeforeAtSign, atSign) = self . eat ( . atSign)
486
+ let ( unexpectedBeforeAtSign, atSign) = self . expect ( . atSign)
488
487
assert ( self . currentToken. tokenText == " _specialize " )
489
488
let specializeToken = self . consumeAnyToken ( )
490
489
let ( unexpectedBeforeLeftParen, leftParen) = self . expect ( . leftParen)
@@ -668,7 +667,7 @@ extension Parser {
668
667
669
668
extension Parser {
670
669
mutating func parsePrivateImportAttribute( ) -> RawAttributeSyntax {
671
- let ( unexpectedBeforeAtSign, atSign) = self . eat ( . atSign)
670
+ let ( unexpectedBeforeAtSign, atSign) = self . expect ( . atSign)
672
671
assert ( self . currentToken. tokenText == " _private " )
673
672
let privateToken = self . consumeAnyToken ( )
674
673
let ( unexpectedBeforeLeftParen, leftParen) = self . expect ( . leftParen)
@@ -698,7 +697,7 @@ extension Parser {
698
697
699
698
extension Parser {
700
699
mutating func parseDynamicReplacementAttribute( ) -> RawAttributeSyntax {
701
- let ( unexpectedBeforeAtSign, atSign) = self . eat ( . atSign)
700
+ let ( unexpectedBeforeAtSign, atSign) = self . expect ( . atSign)
702
701
assert ( self . currentToken. tokenText == " _dynamicReplacement " )
703
702
let dynamicReplacementToken = self . consumeAnyToken ( )
704
703
let ( unexpectedBeforeLeftParen, leftParen) = self . expect ( . leftParen)
@@ -736,7 +735,7 @@ extension Parser {
736
735
737
736
extension Parser {
738
737
mutating func parseSPIAttribute( ) -> RawAttributeSyntax {
739
- let ( unexpectedBeforeAtSign, atSign) = self . eat ( . atSign)
738
+ let ( unexpectedBeforeAtSign, atSign) = self . expect ( . atSign)
740
739
assert ( self . currentToken. tokenText == " _spi " )
741
740
let spiToken = self . consumeAnyToken ( )
742
741
let ( unexpectedBeforeLeftParen, leftParen) = self . expect ( . leftParen)
0 commit comments