@@ -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 ( . endOfFile, . 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,14 +668,15 @@ 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)
708675 elements. append (
709676 . availabilityEntry(
710677 RawAvailabilityEntrySyntax (
711- availabilityLabel: ident,
678+ unexpectedBeforeLabel,
679+ availabilityLabel: label,
712680 unexpectedBeforeColon,
713681 colon: colon,
714682 availabilityArguments: availability,
@@ -719,7 +687,7 @@ extension Parser {
719687 )
720688 )
721689 case ( . available, let handle) ? :
722- let ident = self . eat ( handle)
690+ let ( unexpectedBeforeLabel , label ) = self . eat ( handle)
723691 let ( unexpectedBeforeColon, colon) = self . expect ( . colon)
724692 // FIXME: I have no idea what this is supposed to be, but the Syntax
725693 // tree only allows us to insert a token so we'll take anything.
@@ -728,7 +696,8 @@ extension Parser {
728696 elements. append (
729697 . labeledSpecializeEntry(
730698 RawLabeledSpecializeEntrySyntax (
731- label: ident,
699+ unexpectedBeforeLabel,
700+ label: label,
732701 unexpectedBeforeColon,
733702 colon: colon,
734703 value: available,
@@ -738,14 +707,15 @@ extension Parser {
738707 )
739708 )
740709 case ( . exported, let handle) ? :
741- let ident = self . eat ( handle)
710+ let ( unexpectedBeforeLabel , label ) = self . eat ( handle)
742711 let ( unexpectedBeforeColon, colon) = self . expect ( . colon)
743712 let ( unexpectedBeforeValue, value) = self . expect ( . keyword( . true ) , . keyword( . false ) , default: . keyword( . false ) )
744713 let comma = self . consume ( if: . comma)
745714 elements. append (
746715 . labeledSpecializeEntry(
747716 RawLabeledSpecializeEntrySyntax (
748- label: ident,
717+ unexpectedBeforeLabel,
718+ label: label,
749719 unexpectedBeforeColon,
750720 colon: colon,
751721 unexpectedBeforeValue,
@@ -756,14 +726,15 @@ extension Parser {
756726 )
757727 )
758728 case ( . kind, let handle) ? :
759- let ident = self . eat ( handle)
729+ let ( unexpectedBeforeLabel , label ) = self . eat ( handle)
760730 let ( unexpectedBeforeColon, colon) = self . expect ( . colon)
761731 let valueLabel = self . parseAnyIdentifier ( )
762732 let comma = self . consume ( if: . comma)
763733 elements. append (
764734 . labeledSpecializeEntry(
765735 RawLabeledSpecializeEntrySyntax (
766- label: ident,
736+ unexpectedBeforeLabel,
737+ label: label,
767738 unexpectedBeforeColon,
768739 colon: colon,
769740 value: valueLabel,
@@ -774,14 +745,15 @@ extension Parser {
774745 )
775746 case ( . spiModule, let handle) ? ,
776747 ( . spi, let handle) ? :
777- let ident = self . eat ( handle)
748+ let ( unexpectedBeforeLabel , label ) = self . eat ( handle)
778749 let ( unexpectedBeforeColon, colon) = self . expect ( . colon)
779750 let valueLabel = self . consumeAnyToken ( )
780751 let comma = self . consume ( if: . comma)
781752 elements. append (
782753 . labeledSpecializeEntry(
783754 RawLabeledSpecializeEntrySyntax (
784- label: ident,
755+ unexpectedBeforeLabel,
756+ label: label,
785757 unexpectedBeforeColon,
786758 colon: colon,
787759 value: valueLabel,
@@ -798,7 +770,8 @@ extension Parser {
798770 elements. append (
799771 . labeledSpecializeEntry(
800772 RawLabeledSpecializeEntrySyntax (
801- label: ident,
773+ RawUnexpectedNodesSyntax ( [ ident] , arena: self . arena) ,
774+ label: RawTokenSyntax ( missing: . identifier, arena: self . arena) ,
802775 unexpectedBeforeColon,
803776 colon: colon,
804777 value: valueLabel,
0 commit comments