@@ -900,33 +900,33 @@ extension Parser.Lookahead {
900
900
}
901
901
902
902
extension 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) )
907
905
908
906
guard let leftParen = self . consume ( if: . leftParen) else {
909
907
// If there is no left paren, add an entirely missing detail. Otherwise, we start to consume the following type
910
908
// name as a token inside the detail, which leads to confusing recovery results.
911
909
let arguments = RawLifetimeSpecifierArgumentsSyntax (
912
- leftParen: missingToken ( . leftParen) ,
913
910
arguments: RawLifetimeSpecifierArgumentListSyntax (
914
911
elements: [
915
912
RawLifetimeSpecifierArgumentSyntax ( parameter: missingToken ( . identifier) , trailingComma: nil , arena: arena)
916
913
] ,
917
914
arena: self . arena
918
915
) ,
919
- rightParen: missingToken ( . rightParen) ,
920
916
arena: self . arena
921
917
)
922
918
let lifetimeSpecifier = RawLifetimeTypeSpecifierSyntax (
923
- specifier: specifier,
919
+ dependsOnKeyword: specifier,
920
+ leftParen: missingToken ( . leftParen) ,
921
+ scopedKeyword: nil ,
924
922
arguments: arguments,
923
+ rightParen: missingToken ( . rightParen) ,
925
924
arena: self . arena
926
925
)
927
926
return . lifetimeTypeSpecifier( lifetimeSpecifier)
928
927
}
929
928
929
+ let scoped = self . consume ( if: . keyword( . scoped) )
930
930
var keepGoing : RawTokenSyntax ?
931
931
var arguments : [ RawLifetimeSpecifierArgumentSyntax ] = [ ]
932
932
var loopProgress = LoopProgressCondition ( )
@@ -948,15 +948,16 @@ extension Parser {
948
948
let lifetimeSpecifierArgumentList = RawLifetimeSpecifierArgumentListSyntax ( elements: arguments, arena: self . arena)
949
949
let ( unexpectedBeforeRightParen, rightParen) = self . expect ( . rightParen)
950
950
let argumentsSyntax = RawLifetimeSpecifierArgumentsSyntax (
951
- leftParen: leftParen,
952
951
arguments: lifetimeSpecifierArgumentList,
953
- unexpectedBeforeRightParen,
954
- rightParen: rightParen,
955
952
arena: self . arena
956
953
)
957
954
let lifetimeSpecifier = RawLifetimeTypeSpecifierSyntax (
958
- specifier: specifier,
955
+ dependsOnKeyword: specifier,
956
+ leftParen: leftParen,
957
+ scopedKeyword: scoped,
959
958
arguments: argumentsSyntax,
959
+ unexpectedBeforeRightParen,
960
+ rightParen: rightParen,
960
961
arena: self . arena
961
962
)
962
963
return . lifetimeTypeSpecifier( lifetimeSpecifier)
@@ -976,20 +977,18 @@ extension Parser {
976
977
specifiers: RawTypeSpecifierListSyntax ,
977
978
attributes: RawAttributeListSyntax
978
979
) ? {
979
- typealias SimpleOrLifetimeSpecifier =
980
- EitherTokenSpecSet < SimpleTypeSpecifierSyntax . SpecifierOptions , LifetimeTypeSpecifierSyntax . SpecifierOptions >
981
980
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) ) {
988
985
if self . experimentalFeatures. contains ( . nonescapableTypes) {
989
- specifiers. append ( parseLifetimeTypeSpecifier ( specifierHandle : specifierHandle ) )
986
+ specifiers. append ( parseLifetimeTypeSpecifier ( ) )
990
987
} else {
991
988
break SPECIFIER_PARSING
992
989
}
990
+ } else {
991
+ break SPECIFIER_PARSING
993
992
}
994
993
}
995
994
specifiers += misplacedSpecifiers. map {
0 commit comments