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