@@ -900,33 +900,33 @@ extension Parser.Lookahead {
900900}
901901
902902extension Parser {
903- private mutating func parseLifetimeTypeSpecifier(
904- specifierHandle: TokenConsumptionHandle
905- ) -> RawTypeSpecifierListSyntax . Element {
906- let specifier = self . eat ( specifierHandle)
903+ private mutating func parseLifetimeTypeSpecifier( ) -> RawTypeSpecifierListSyntax . Element {
904+ let specifier = self . eat ( TokenSpec ( . dependsOn) )
907905
908906 guard let leftParen = self . consume ( if: . leftParen) else {
909907 // If there is no left paren, add an entirely missing detail. Otherwise, we start to consume the following type
910908 // name as a token inside the detail, which leads to confusing recovery results.
911909 let arguments = RawLifetimeSpecifierArgumentsSyntax (
912- leftParen: missingToken ( . leftParen) ,
913910 arguments: RawLifetimeSpecifierArgumentListSyntax (
914911 elements: [
915912 RawLifetimeSpecifierArgumentSyntax ( parameter: missingToken ( . identifier) , trailingComma: nil , arena: arena)
916913 ] ,
917914 arena: self . arena
918915 ) ,
919- rightParen: missingToken ( . rightParen) ,
920916 arena: self . arena
921917 )
922918 let lifetimeSpecifier = RawLifetimeTypeSpecifierSyntax (
923- specifier: specifier,
919+ dependsOnKeyword: specifier,
920+ leftParen: missingToken ( . leftParen) ,
921+ scopedKeyword: nil ,
924922 arguments: arguments,
923+ rightParen: missingToken ( . rightParen) ,
925924 arena: self . arena
926925 )
927926 return . lifetimeTypeSpecifier( lifetimeSpecifier)
928927 }
929928
929+ let scoped = self . consume ( if: . keyword( . scoped) )
930930 var keepGoing : RawTokenSyntax ?
931931 var arguments : [ RawLifetimeSpecifierArgumentSyntax ] = [ ]
932932 var loopProgress = LoopProgressCondition ( )
@@ -948,15 +948,16 @@ extension Parser {
948948 let lifetimeSpecifierArgumentList = RawLifetimeSpecifierArgumentListSyntax ( elements: arguments, arena: self . arena)
949949 let ( unexpectedBeforeRightParen, rightParen) = self . expect ( . rightParen)
950950 let argumentsSyntax = RawLifetimeSpecifierArgumentsSyntax (
951- leftParen: leftParen,
952951 arguments: lifetimeSpecifierArgumentList,
953- unexpectedBeforeRightParen,
954- rightParen: rightParen,
955952 arena: self . arena
956953 )
957954 let lifetimeSpecifier = RawLifetimeTypeSpecifierSyntax (
958- specifier: specifier,
955+ dependsOnKeyword: specifier,
956+ leftParen: leftParen,
957+ scopedKeyword: scoped,
959958 arguments: argumentsSyntax,
959+ unexpectedBeforeRightParen,
960+ rightParen: rightParen,
960961 arena: self . arena
961962 )
962963 return . lifetimeTypeSpecifier( lifetimeSpecifier)
@@ -976,20 +977,18 @@ extension Parser {
976977 specifiers: RawTypeSpecifierListSyntax ,
977978 attributes: RawAttributeListSyntax
978979 ) ? {
979- typealias SimpleOrLifetimeSpecifier =
980- EitherTokenSpecSet < SimpleTypeSpecifierSyntax . SpecifierOptions , LifetimeTypeSpecifierSyntax . SpecifierOptions >
981980 var specifiers : [ RawTypeSpecifierListSyntax . Element ] = [ ]
982- SPECIFIER_PARSING: while canHaveParameterSpecifier,
983- let ( specifierSpec, specifierHandle) = self . at ( anyIn: SimpleOrLifetimeSpecifier . self)
984- {
985- switch specifierSpec {
986- case . lhs: specifiers. append ( parseSimpleTypeSpecifier ( specifierHandle: specifierHandle) )
987- case . rhs:
981+ SPECIFIER_PARSING: while canHaveParameterSpecifier {
982+ if let ( _, specifierHandle) = self . at ( anyIn: SimpleTypeSpecifierSyntax . SpecifierOptions. self) {
983+ specifiers. append ( parseSimpleTypeSpecifier ( specifierHandle: specifierHandle) )
984+ } else if self . at ( TokenSpec ( . dependsOn) ) {
988985 if self . experimentalFeatures. contains ( . nonescapableTypes) {
989- specifiers. append ( parseLifetimeTypeSpecifier ( specifierHandle : specifierHandle ) )
986+ specifiers. append ( parseLifetimeTypeSpecifier ( ) )
990987 } else {
991988 break SPECIFIER_PARSING
992989 }
990+ } else {
991+ break SPECIFIER_PARSING
993992 }
994993 }
995994 specifiers += misplacedSpecifiers. map {
0 commit comments