13
13
import SwiftSyntax
14
14
15
15
public struct KeywordSpec {
16
- public var name : String
16
+ /// The name of the keyword.
17
+ public let name : String
17
18
18
- /// If `true`, this is for an experimental language feature, and any public
19
- /// API generated should be SPI.
20
- public var isExperimental : Bool
19
+ /// Indicates if the keyword is part of an experimental language feature.
20
+ ///
21
+ /// If `true`, this keyword is for an experimental language feature, and any public
22
+ /// API generated should be marked as SPI
23
+ public let isExperimental : Bool
21
24
22
- public var isLexerClassified : Bool
23
- public var requiresLeadingSpace : Bool
24
- public var requiresTrailingSpace : Bool
25
+ /// Indicates if the token kind is switched from being an identifier to a keyword in the lexer.
26
+ public let isLexerClassified : Bool
25
27
26
- public var escapedName : String {
27
- if isLexerClassified || name == " Type " || name == " Protocol " {
28
- return " ` \( name) ` "
28
+ /// The name of this keyword that's suitable to be used for variable or enum case names.
29
+ public var varOrCaseName : TokenSyntax {
30
+ if name == " init " {
31
+ return " `init` "
29
32
} else {
30
- return name
33
+ return TokenSyntax . identifier ( name)
31
34
}
32
35
}
33
36
34
- /// Retrieve the attributes that should be printed on any API for the
35
- /// generated keyword.
37
+ /// The attributes that should be printed on any API for the generated keyword.
38
+ ///
39
+ /// This is typically used to mark APIs as SPI when the keyword is part of an experimental language feature.
36
40
public var apiAttributes : AttributeListSyntax {
37
41
guard isExperimental else { return " " }
38
42
return AttributeListSyntax ( " @_spi(ExperimentalLanguageFeatures) " ) . with ( \. trailingTrivia, . newline)
39
43
}
40
44
41
- /// `isLexerClassified` determines whether the token kind is switched from being an identifier to a keyword in the lexer.
42
- /// This is true for keywords that used to be considered non-contextual.
43
- init ( _ name: String , isExperimental: Bool = false , isLexerClassified: Bool = false , requiresLeadingSpace: Bool = false , requiresTrailingSpace: Bool = false ) {
45
+ /// Initializes a new `KeywordSpec` instance.
46
+ ///
47
+ /// - Parameters:
48
+ /// - name: A name of the keyword.
49
+ /// - isExperimental: Indicates if the keyword is part of an experimental language feature.
50
+ /// - isLexerClassified: Indicates if the token kind is switched from being an identifier to a keyword in the lexer.
51
+ init (
52
+ _ name: String ,
53
+ isExperimental: Bool = false ,
54
+ isLexerClassified: Bool = false
55
+ ) {
44
56
self . name = name
45
57
self . isExperimental = isExperimental
46
58
self . isLexerClassified = isLexerClassified
47
- self . requiresLeadingSpace = requiresLeadingSpace
48
- self . requiresTrailingSpace = requiresTrailingSpace
49
59
}
50
60
}
51
61
@@ -375,17 +385,17 @@ public enum Keyword: CaseIterable {
375
385
case . any:
376
386
return KeywordSpec ( " any " )
377
387
case . Any:
378
- return KeywordSpec ( " Any " , isLexerClassified: true , requiresTrailingSpace : true )
388
+ return KeywordSpec ( " Any " , isLexerClassified: true )
379
389
case . as:
380
- return KeywordSpec ( " as " , isLexerClassified: true , requiresTrailingSpace : true )
390
+ return KeywordSpec ( " as " , isLexerClassified: true )
381
391
case . assignment:
382
392
return KeywordSpec ( " assignment " )
383
393
case . associatedtype:
384
- return KeywordSpec ( " associatedtype " , isLexerClassified: true , requiresTrailingSpace : true )
394
+ return KeywordSpec ( " associatedtype " , isLexerClassified: true )
385
395
case . associativity:
386
396
return KeywordSpec ( " associativity " )
387
397
case . async :
388
- return KeywordSpec ( " async " , requiresTrailingSpace : true )
398
+ return KeywordSpec ( " async " )
389
399
case . attached:
390
400
return KeywordSpec ( " attached " )
391
401
case . autoclosure:
@@ -395,7 +405,7 @@ public enum Keyword: CaseIterable {
395
405
case . available:
396
406
return KeywordSpec ( " available " )
397
407
case . await :
398
- return KeywordSpec ( " await " , requiresTrailingSpace : true )
408
+ return KeywordSpec ( " await " )
399
409
case . backDeployed:
400
410
return KeywordSpec ( " backDeployed " )
401
411
case . before:
@@ -405,15 +415,15 @@ public enum Keyword: CaseIterable {
405
415
case . borrowing:
406
416
return KeywordSpec ( " borrowing " )
407
417
case . break:
408
- return KeywordSpec ( " break " , isLexerClassified: true , requiresTrailingSpace : true )
418
+ return KeywordSpec ( " break " , isLexerClassified: true )
409
419
case . canImport:
410
420
return KeywordSpec ( " canImport " )
411
421
case . case:
412
- return KeywordSpec ( " case " , isLexerClassified: true , requiresTrailingSpace : true )
422
+ return KeywordSpec ( " case " , isLexerClassified: true )
413
423
case . catch:
414
- return KeywordSpec ( " catch " , isLexerClassified: true , requiresLeadingSpace : true )
424
+ return KeywordSpec ( " catch " , isLexerClassified: true )
415
425
case . class:
416
- return KeywordSpec ( " class " , isLexerClassified: true , requiresTrailingSpace : true )
426
+ return KeywordSpec ( " class " , isLexerClassified: true )
417
427
case . compiler:
418
428
return KeywordSpec ( " compiler " )
419
429
case . consume:
@@ -423,7 +433,7 @@ public enum Keyword: CaseIterable {
423
433
case . consuming:
424
434
return KeywordSpec ( " consuming " )
425
435
case . continue:
426
- return KeywordSpec ( " continue " , isLexerClassified: true , requiresTrailingSpace : true )
436
+ return KeywordSpec ( " continue " , isLexerClassified: true )
427
437
case . convenience:
428
438
return KeywordSpec ( " convenience " )
429
439
case . convention:
@@ -433,7 +443,7 @@ public enum Keyword: CaseIterable {
433
443
case . default:
434
444
return KeywordSpec ( " default " , isLexerClassified: true )
435
445
case . defer:
436
- return KeywordSpec ( " defer " , isLexerClassified: true , requiresTrailingSpace : true )
446
+ return KeywordSpec ( " defer " , isLexerClassified: true )
437
447
case . deinit:
438
448
return KeywordSpec ( " deinit " , isLexerClassified: true )
439
449
case . deprecated:
@@ -453,47 +463,47 @@ public enum Keyword: CaseIterable {
453
463
case . each:
454
464
return KeywordSpec ( " each " )
455
465
case . else:
456
- return KeywordSpec ( " else " , isLexerClassified: true , requiresLeadingSpace : true , requiresTrailingSpace : true )
466
+ return KeywordSpec ( " else " , isLexerClassified: true )
457
467
case . enum:
458
- return KeywordSpec ( " enum " , isLexerClassified: true , requiresTrailingSpace : true )
468
+ return KeywordSpec ( " enum " , isLexerClassified: true )
459
469
case . escaping:
460
470
return KeywordSpec ( " escaping " )
461
471
case . exclusivity:
462
472
return KeywordSpec ( " exclusivity " )
463
473
case . exported:
464
474
return KeywordSpec ( " exported " )
465
475
case . extension:
466
- return KeywordSpec ( " extension " , isLexerClassified: true , requiresTrailingSpace : true )
476
+ return KeywordSpec ( " extension " , isLexerClassified: true )
467
477
case . fallthrough:
468
- return KeywordSpec ( " fallthrough " , isLexerClassified: true , requiresTrailingSpace : true )
478
+ return KeywordSpec ( " fallthrough " , isLexerClassified: true )
469
479
case . false :
470
480
return KeywordSpec ( " false " , isLexerClassified: true )
471
481
case . file:
472
482
return KeywordSpec ( " file " )
473
483
case . fileprivate:
474
- return KeywordSpec ( " fileprivate " , isLexerClassified: true , requiresTrailingSpace : true )
484
+ return KeywordSpec ( " fileprivate " , isLexerClassified: true )
475
485
case . final:
476
486
return KeywordSpec ( " final " )
477
487
case . for:
478
- return KeywordSpec ( " for " , isLexerClassified: true , requiresTrailingSpace : true )
488
+ return KeywordSpec ( " for " , isLexerClassified: true )
479
489
case . discard:
480
490
return KeywordSpec ( " discard " )
481
491
case . forward:
482
492
return KeywordSpec ( " forward " )
483
493
case . func:
484
- return KeywordSpec ( " func " , isLexerClassified: true , requiresTrailingSpace : true )
494
+ return KeywordSpec ( " func " , isLexerClassified: true )
485
495
case . get:
486
496
return KeywordSpec ( " get " )
487
497
case . guard:
488
- return KeywordSpec ( " guard " , isLexerClassified: true , requiresTrailingSpace : true )
498
+ return KeywordSpec ( " guard " , isLexerClassified: true )
489
499
case . higherThan:
490
500
return KeywordSpec ( " higherThan " )
491
501
case . if:
492
- return KeywordSpec ( " if " , isLexerClassified: true , requiresTrailingSpace : true )
502
+ return KeywordSpec ( " if " , isLexerClassified: true )
493
503
case . import:
494
- return KeywordSpec ( " import " , isLexerClassified: true , requiresTrailingSpace : true )
504
+ return KeywordSpec ( " import " , isLexerClassified: true )
495
505
case . in:
496
- return KeywordSpec ( " in " , isLexerClassified: true , requiresLeadingSpace : true , requiresTrailingSpace : true )
506
+ return KeywordSpec ( " in " , isLexerClassified: true )
497
507
case . indirect:
498
508
return KeywordSpec ( " indirect " )
499
509
case . infix:
@@ -505,13 +515,13 @@ public enum Keyword: CaseIterable {
505
515
case . inline:
506
516
return KeywordSpec ( " inline " )
507
517
case . inout:
508
- return KeywordSpec ( " inout " , isLexerClassified: true , requiresTrailingSpace : true )
518
+ return KeywordSpec ( " inout " , isLexerClassified: true )
509
519
case . internal:
510
- return KeywordSpec ( " internal " , isLexerClassified: true , requiresTrailingSpace : true )
520
+ return KeywordSpec ( " internal " , isLexerClassified: true )
511
521
case . introduced:
512
522
return KeywordSpec ( " introduced " )
513
523
case . is:
514
- return KeywordSpec ( " is " , isLexerClassified: true , requiresTrailingSpace : true )
524
+ return KeywordSpec ( " is " , isLexerClassified: true )
515
525
case . isolated:
516
526
return KeywordSpec ( " isolated " )
517
527
case . kind:
@@ -521,7 +531,7 @@ public enum Keyword: CaseIterable {
521
531
case . left:
522
532
return KeywordSpec ( " left " )
523
533
case . let:
524
- return KeywordSpec ( " let " , isLexerClassified: true , requiresTrailingSpace : true )
534
+ return KeywordSpec ( " let " , isLexerClassified: true )
525
535
case . line:
526
536
return KeywordSpec ( " line " )
527
537
case . linear:
@@ -565,7 +575,7 @@ public enum Keyword: CaseIterable {
565
575
case . open:
566
576
return KeywordSpec ( " open " )
567
577
case . operator:
568
- return KeywordSpec ( " operator " , isLexerClassified: true , requiresTrailingSpace : true )
578
+ return KeywordSpec ( " operator " , isLexerClassified: true )
569
579
case . optional:
570
580
return KeywordSpec ( " optional " )
571
581
case . override:
@@ -575,29 +585,29 @@ public enum Keyword: CaseIterable {
575
585
case . postfix:
576
586
return KeywordSpec ( " postfix " )
577
587
case . precedencegroup:
578
- return KeywordSpec ( " precedencegroup " , isLexerClassified: true , requiresTrailingSpace : true )
588
+ return KeywordSpec ( " precedencegroup " , isLexerClassified: true )
579
589
case . prefix:
580
590
return KeywordSpec ( " prefix " )
581
591
case . private:
582
- return KeywordSpec ( " private " , isLexerClassified: true , requiresTrailingSpace : true )
592
+ return KeywordSpec ( " private " , isLexerClassified: true )
583
593
case . Protocol:
584
594
return KeywordSpec ( " Protocol " )
585
595
case . protocol:
586
- return KeywordSpec ( " protocol " , isLexerClassified: true , requiresTrailingSpace : true )
596
+ return KeywordSpec ( " protocol " , isLexerClassified: true )
587
597
case . public:
588
- return KeywordSpec ( " public " , isLexerClassified: true , requiresTrailingSpace : true )
598
+ return KeywordSpec ( " public " , isLexerClassified: true )
589
599
case . reasync:
590
600
return KeywordSpec ( " reasync " )
591
601
case . renamed:
592
602
return KeywordSpec ( " renamed " )
593
603
case . repeat :
594
- return KeywordSpec ( " repeat " , isLexerClassified: true , requiresTrailingSpace : true )
604
+ return KeywordSpec ( " repeat " , isLexerClassified: true )
595
605
case . required:
596
606
return KeywordSpec ( " required " )
597
607
case . rethrows:
598
- return KeywordSpec ( " rethrows " , isLexerClassified: true , requiresTrailingSpace : true )
608
+ return KeywordSpec ( " rethrows " , isLexerClassified: true )
599
609
case . return:
600
- return KeywordSpec ( " return " , isLexerClassified: true , requiresTrailingSpace : true )
610
+ return KeywordSpec ( " return " , isLexerClassified: true )
601
611
case . reverse:
602
612
return KeywordSpec ( " reverse " )
603
613
case . right:
@@ -621,33 +631,33 @@ public enum Keyword: CaseIterable {
621
631
case . spiModule:
622
632
return KeywordSpec ( " spiModule " )
623
633
case . static:
624
- return KeywordSpec ( " static " , isLexerClassified: true , requiresTrailingSpace : true )
634
+ return KeywordSpec ( " static " , isLexerClassified: true )
625
635
case . struct:
626
- return KeywordSpec ( " struct " , isLexerClassified: true , requiresTrailingSpace : true )
636
+ return KeywordSpec ( " struct " , isLexerClassified: true )
627
637
case . subscript:
628
- return KeywordSpec ( " subscript " , isLexerClassified: true , requiresTrailingSpace : true )
638
+ return KeywordSpec ( " subscript " , isLexerClassified: true )
629
639
case . super:
630
640
return KeywordSpec ( " super " , isLexerClassified: true )
631
641
case . swift:
632
642
return KeywordSpec ( " swift " )
633
643
case . switch:
634
- return KeywordSpec ( " switch " , isLexerClassified: true , requiresTrailingSpace : true )
644
+ return KeywordSpec ( " switch " , isLexerClassified: true )
635
645
case . target:
636
646
return KeywordSpec ( " target " )
637
647
case . throw:
638
- return KeywordSpec ( " throw " , isLexerClassified: true , requiresTrailingSpace : true )
648
+ return KeywordSpec ( " throw " , isLexerClassified: true )
639
649
case . throws:
640
- return KeywordSpec ( " throws " , isLexerClassified: true , requiresTrailingSpace : true )
650
+ return KeywordSpec ( " throws " , isLexerClassified: true )
641
651
case . transpose:
642
652
return KeywordSpec ( " transpose " )
643
653
case . true :
644
654
return KeywordSpec ( " true " , isLexerClassified: true )
645
655
case . try :
646
- return KeywordSpec ( " try " , isLexerClassified: true , requiresTrailingSpace : true )
656
+ return KeywordSpec ( " try " , isLexerClassified: true )
647
657
case . Type:
648
658
return KeywordSpec ( " Type " )
649
659
case . typealias:
650
- return KeywordSpec ( " typealias " , isLexerClassified: true , requiresTrailingSpace : true )
660
+ return KeywordSpec ( " typealias " , isLexerClassified: true )
651
661
case . unavailable:
652
662
return KeywordSpec ( " unavailable " )
653
663
case . unchecked:
@@ -661,15 +671,15 @@ public enum Keyword: CaseIterable {
661
671
case . unsafeMutableAddress:
662
672
return KeywordSpec ( " unsafeMutableAddress " )
663
673
case . var:
664
- return KeywordSpec ( " var " , isLexerClassified: true , requiresTrailingSpace : true )
674
+ return KeywordSpec ( " var " , isLexerClassified: true )
665
675
case . visibility:
666
676
return KeywordSpec ( " visibility " )
667
677
case . weak:
668
678
return KeywordSpec ( " weak " )
669
679
case . where:
670
- return KeywordSpec ( " where " , isLexerClassified: true , requiresLeadingSpace : true , requiresTrailingSpace : true )
680
+ return KeywordSpec ( " where " , isLexerClassified: true )
671
681
case . while:
672
- return KeywordSpec ( " while " , isLexerClassified: true , requiresTrailingSpace : true )
682
+ return KeywordSpec ( " while " , isLexerClassified: true )
673
683
case . willSet:
674
684
return KeywordSpec ( " willSet " )
675
685
case . witness_method:
0 commit comments