@@ -638,48 +638,14 @@ extension Parser {
638638}
639639
640640extension Parser {
641- enum SpecializeParameter : TokenSpecSet {
642- case target
643- case availability
644- case exported
645- case kind
646- case spi
647- case spiModule
648- case available
649-
650- init ? ( lexeme: Lexer . Lexeme ) {
651- switch PrepareForKeywordMatch ( lexeme) {
652- case TokenSpec ( . target) : self = . target
653- case TokenSpec ( . availability) : self = . availability
654- case TokenSpec ( . exported) : self = . exported
655- case TokenSpec ( . kind) : self = . kind
656- case TokenSpec ( . spi) : self = . spi
657- case TokenSpec ( . spiModule) : self = . spiModule
658- case TokenSpec ( . available) : self = . available
659- default : return nil
660- }
661- }
662-
663- var spec : TokenSpec {
664- switch self {
665- case . target: return . keyword( . target)
666- case . availability: return . keyword( . availability)
667- case . exported: return . keyword( . exported)
668- case . kind: return . keyword( . kind)
669- case . spi: return . keyword( . spi)
670- case . spiModule: return . keyword( . spiModule)
671- case . available: return . keyword( . available)
672- }
673- }
674- }
675641 mutating func parseSpecializeAttributeSpecList( ) -> RawSpecializeAttributeSpecListSyntax {
676642 var elements = [ RawSpecializeAttributeSpecListSyntax . Element] ( )
677643 // Parse optional "exported" and "kind" labeled parameters.
678644 var loopProgress = LoopProgressCondition ( )
679645 while !self . at ( . eof, . rightParen, . keyword( . where) ) && loopProgress. evaluate ( currentToken) {
680- switch self . at ( anyIn: SpecializeParameter . self) {
646+ switch self . canRecoverTo ( anyIn: LabeledSpecializeEntrySyntax . LabelOptions . self) {
681647 case ( . target, let handle) ? :
682- let ident = self . eat ( handle)
648+ let ( unexpectedBeforeLabel , label ) = self . eat ( handle)
683649 let ( unexpectedBeforeColon, colon) = self . expect ( . colon)
684650 let ( targetFunction, args) = self . parseDeclNameRef ( [ . zeroArgCompoundNames, . keywordsUsingSpecialNames, . operators] )
685651 let declName = RawDeclNameSyntax (
@@ -691,7 +657,8 @@ extension Parser {
691657 elements. append (
692658 . targetFunctionEntry(
693659 RawTargetFunctionEntrySyntax (
694- targetLabel: ident,
660+ unexpectedBeforeLabel,
661+ targetLabel: label,
695662 unexpectedBeforeColon,
696663 colon: colon,
697664 declname: declName,
@@ -701,7 +668,7 @@ extension Parser {
701668 )
702669 )
703670 case ( . availability, let handle) ? :
704- let ident = self . eat ( handle)
671+ let ( unexpectedBeforeLabel , label ) = self . eat ( handle)
705672 let ( unexpectedBeforeColon, colon) = self . expect ( . colon)
706673 let availability = self . parseAvailabilitySpecList ( )
707674 let ( unexpectedBeforeSemi, semi) = self . expect ( . semicolon)
@@ -719,7 +686,7 @@ extension Parser {
719686 )
720687 )
721688 case ( . available, let handle) ? :
722- let ident = self . eat ( handle)
689+ let ( unexpectedBeforeLabel , label ) = self . eat ( handle)
723690 let ( unexpectedBeforeColon, colon) = self . expect ( . colon)
724691 // FIXME: I have no idea what this is supposed to be, but the Syntax
725692 // tree only allows us to insert a token so we'll take anything.
@@ -728,7 +695,8 @@ extension Parser {
728695 elements. append (
729696 . labeledSpecializeEntry(
730697 RawLabeledSpecializeEntrySyntax (
731- label: ident,
698+ unexpectedBeforeLabel,
699+ label: label,
732700 unexpectedBeforeColon,
733701 colon: colon,
734702 value: available,
@@ -738,14 +706,15 @@ extension Parser {
738706 )
739707 )
740708 case ( . exported, let handle) ? :
741- let ident = self . eat ( handle)
709+ let ( unexpectedBeforeLabel , label ) = self . eat ( handle)
742710 let ( unexpectedBeforeColon, colon) = self . expect ( . colon)
743711 let ( unexpectedBeforeValue, value) = self . expect ( . keyword( . true ) , . keyword( . false ) , default: . keyword( . false ) )
744712 let comma = self . consume ( if: . comma)
745713 elements. append (
746714 . labeledSpecializeEntry(
747715 RawLabeledSpecializeEntrySyntax (
748- label: ident,
716+ unexpectedBeforeLabel,
717+ label: label,
749718 unexpectedBeforeColon,
750719 colon: colon,
751720 unexpectedBeforeValue,
@@ -756,14 +725,15 @@ extension Parser {
756725 )
757726 )
758727 case ( . kind, let handle) ? :
759- let ident = self . eat ( handle)
728+ let ( unexpectedBeforeLabel , label ) = self . eat ( handle)
760729 let ( unexpectedBeforeColon, colon) = self . expect ( . colon)
761730 let valueLabel = self . parseAnyIdentifier ( )
762731 let comma = self . consume ( if: . comma)
763732 elements. append (
764733 . labeledSpecializeEntry(
765734 RawLabeledSpecializeEntrySyntax (
766- label: ident,
735+ unexpectedBeforeLabel,
736+ label: label,
767737 unexpectedBeforeColon,
768738 colon: colon,
769739 value: valueLabel,
@@ -774,14 +744,15 @@ extension Parser {
774744 )
775745 case ( . spiModule, let handle) ? ,
776746 ( . spi, let handle) ? :
777- let ident = self . eat ( handle)
747+ let ( unexpectedBeforeLabel , label ) = self . eat ( handle)
778748 let ( unexpectedBeforeColon, colon) = self . expect ( . colon)
779749 let valueLabel = self . consumeAnyToken ( )
780750 let comma = self . consume ( if: . comma)
781751 elements. append (
782752 . labeledSpecializeEntry(
783753 RawLabeledSpecializeEntrySyntax (
784- label: ident,
754+ unexpectedBeforeLabel,
755+ label: label,
785756 unexpectedBeforeColon,
786757 colon: colon,
787758 value: valueLabel,
@@ -798,7 +769,8 @@ extension Parser {
798769 elements. append (
799770 . labeledSpecializeEntry(
800771 RawLabeledSpecializeEntrySyntax (
801- label: ident,
772+ RawUnexpectedNodesSyntax ( [ ident] , arena: self . arena) ,
773+ label: RawTokenSyntax ( missing: . identifier, arena: self . arena) ,
802774 unexpectedBeforeColon,
803775 colon: colon,
804776 value: valueLabel,
0 commit comments