@@ -610,48 +610,14 @@ extension Parser {
610
610
}
611
611
612
612
extension Parser {
613
- enum SpecializeParameter : TokenSpecSet {
614
- case target
615
- case availability
616
- case exported
617
- case kind
618
- case spi
619
- case spiModule
620
- case available
621
-
622
- init ? ( lexeme: Lexer . Lexeme ) {
623
- switch PrepareForKeywordMatch ( lexeme) {
624
- case TokenSpec ( . target) : self = . target
625
- case TokenSpec ( . availability) : self = . availability
626
- case TokenSpec ( . exported) : self = . exported
627
- case TokenSpec ( . kind) : self = . kind
628
- case TokenSpec ( . spi) : self = . spi
629
- case TokenSpec ( . spiModule) : self = . spiModule
630
- case TokenSpec ( . available) : self = . available
631
- default : return nil
632
- }
633
- }
634
-
635
- var spec : TokenSpec {
636
- switch self {
637
- case . target: return . keyword( . target)
638
- case . availability: return . keyword( . availability)
639
- case . exported: return . keyword( . exported)
640
- case . kind: return . keyword( . kind)
641
- case . spi: return . keyword( . spi)
642
- case . spiModule: return . keyword( . spiModule)
643
- case . available: return . keyword( . available)
644
- }
645
- }
646
- }
647
613
mutating func parseSpecializeAttributeSpecList( ) -> RawSpecializeAttributeSpecListSyntax {
648
614
var elements = [ RawSpecializeAttributeSpecListSyntax . Element] ( )
649
615
// Parse optional "exported" and "kind" labeled parameters.
650
616
var loopProgress = LoopProgressCondition ( )
651
617
while !self . at ( . eof, . rightParen, . keyword( . where) ) && loopProgress. evaluate ( currentToken) {
652
- switch self . at ( anyIn: SpecializeParameter . self) {
618
+ switch self . canRecoverTo ( anyIn: LabeledSpecializeEntrySyntax . LabelOptions . self) {
653
619
case ( . target, let handle) ? :
654
- let ident = self . eat ( handle)
620
+ let ( unexpectedBeforeLabel , label ) = self . eat ( handle)
655
621
let ( unexpectedBeforeColon, colon) = self . expect ( . colon)
656
622
let ( targetFunction, args) = self . parseDeclNameRef ( [ . zeroArgCompoundNames, . keywordsUsingSpecialNames, . operators] )
657
623
let declName = RawDeclNameSyntax (
@@ -663,7 +629,8 @@ extension Parser {
663
629
elements. append (
664
630
. targetFunctionEntry(
665
631
RawTargetFunctionEntrySyntax (
666
- label: ident,
632
+ unexpectedBeforeLabel,
633
+ label: label,
667
634
unexpectedBeforeColon,
668
635
colon: colon,
669
636
declname: declName,
@@ -673,14 +640,15 @@ extension Parser {
673
640
)
674
641
)
675
642
case ( . availability, let handle) ? :
676
- let ident = self . eat ( handle)
643
+ let ( unexpectedBeforeLabel , label ) = self . eat ( handle)
677
644
let ( unexpectedBeforeColon, colon) = self . expect ( . colon)
678
645
let availability = self . parseAvailabilitySpecList ( )
679
646
let ( unexpectedBeforeSemi, semi) = self . expect ( . semicolon)
680
647
elements. append (
681
648
. availabilityEntry(
682
649
RawAvailabilityEntrySyntax (
683
- label: ident,
650
+ unexpectedBeforeLabel,
651
+ label: label,
684
652
unexpectedBeforeColon,
685
653
colon: colon,
686
654
availabilityArguments: availability,
@@ -691,7 +659,7 @@ extension Parser {
691
659
)
692
660
)
693
661
case ( . available, let handle) ? :
694
- let ident = self . eat ( handle)
662
+ let ( unexpectedBeforeLabel , label ) = self . eat ( handle)
695
663
let ( unexpectedBeforeColon, colon) = self . expect ( . colon)
696
664
// FIXME: I have no idea what this is supposed to be, but the Syntax
697
665
// tree only allows us to insert a token so we'll take anything.
@@ -700,7 +668,8 @@ extension Parser {
700
668
elements. append (
701
669
. labeledSpecializeEntry(
702
670
RawLabeledSpecializeEntrySyntax (
703
- label: ident,
671
+ unexpectedBeforeLabel,
672
+ label: label,
704
673
unexpectedBeforeColon,
705
674
colon: colon,
706
675
value: available,
@@ -710,14 +679,15 @@ extension Parser {
710
679
)
711
680
)
712
681
case ( . exported, let handle) ? :
713
- let ident = self . eat ( handle)
682
+ let ( unexpectedBeforeLabel , label ) = self . eat ( handle)
714
683
let ( unexpectedBeforeColon, colon) = self . expect ( . colon)
715
684
let ( unexpectedBeforeValue, value) = self . expect ( . keyword( . true ) , . keyword( . false ) , default: . keyword( . false ) )
716
685
let comma = self . consume ( if: . comma)
717
686
elements. append (
718
687
. labeledSpecializeEntry(
719
688
RawLabeledSpecializeEntrySyntax (
720
- label: ident,
689
+ unexpectedBeforeLabel,
690
+ label: label,
721
691
unexpectedBeforeColon,
722
692
colon: colon,
723
693
unexpectedBeforeValue,
@@ -728,14 +698,15 @@ extension Parser {
728
698
)
729
699
)
730
700
case ( . kind, let handle) ? :
731
- let ident = self . eat ( handle)
701
+ let ( unexpectedBeforeLabel , label ) = self . eat ( handle)
732
702
let ( unexpectedBeforeColon, colon) = self . expect ( . colon)
733
703
let valueLabel = self . parseAnyIdentifier ( )
734
704
let comma = self . consume ( if: . comma)
735
705
elements. append (
736
706
. labeledSpecializeEntry(
737
707
RawLabeledSpecializeEntrySyntax (
738
- label: ident,
708
+ unexpectedBeforeLabel,
709
+ label: label,
739
710
unexpectedBeforeColon,
740
711
colon: colon,
741
712
value: valueLabel,
@@ -746,14 +717,15 @@ extension Parser {
746
717
)
747
718
case ( . spiModule, let handle) ? ,
748
719
( . spi, let handle) ? :
749
- let ident = self . eat ( handle)
720
+ let ( unexpectedBeforeLabel , label ) = self . eat ( handle)
750
721
let ( unexpectedBeforeColon, colon) = self . expect ( . colon)
751
722
let valueLabel = self . consumeAnyToken ( )
752
723
let comma = self . consume ( if: . comma)
753
724
elements. append (
754
725
. labeledSpecializeEntry(
755
726
RawLabeledSpecializeEntrySyntax (
756
- label: ident,
727
+ unexpectedBeforeLabel,
728
+ label: label,
757
729
unexpectedBeforeColon,
758
730
colon: colon,
759
731
value: valueLabel,
@@ -770,7 +742,8 @@ extension Parser {
770
742
elements. append (
771
743
. labeledSpecializeEntry(
772
744
RawLabeledSpecializeEntrySyntax (
773
- label: ident,
745
+ RawUnexpectedNodesSyntax ( [ ident] , arena: self . arena) ,
746
+ label: RawTokenSyntax ( missing: . identifier, arena: self . arena) ,
774
747
unexpectedBeforeColon,
775
748
colon: colon,
776
749
value: valueLabel,
0 commit comments