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