@@ -1087,6 +1087,11 @@ impl<'a> Parser<'a> {
1087
1087
}
1088
1088
}
1089
1089
1090
+ /// Returns whether any of the given keywords are `dist` tokens ahead of the current one.
1091
+ fn is_keyword_ahead ( & self , dist : usize , kws : & [ Symbol ] ) -> bool {
1092
+ self . look_ahead ( dist, |t| kws. iter ( ) . any ( |& kw| t. is_keyword ( kw) ) )
1093
+ }
1094
+
1090
1095
/// Is the current token one of the keywords that signals a bare function type?
1091
1096
fn token_is_bare_fn_keyword ( & mut self ) -> bool {
1092
1097
self . check_keyword ( kw:: Fn ) ||
@@ -4270,7 +4275,7 @@ impl<'a> Parser<'a> {
4270
4275
self . token . is_keyword ( kw:: Async ) &&
4271
4276
(
4272
4277
( // `async move {`
4273
- self . look_ahead ( 1 , |t| t . is_keyword ( kw:: Move ) ) &&
4278
+ self . is_keyword_ahead ( 1 , & [ kw:: Move ] ) &&
4274
4279
self . look_ahead ( 2 , |t| * t == token:: OpenDelim ( token:: Brace ) )
4275
4280
) || ( // `async {`
4276
4281
self . look_ahead ( 1 , |t| * t == token:: OpenDelim ( token:: Brace ) )
@@ -4280,12 +4285,12 @@ impl<'a> Parser<'a> {
4280
4285
4281
4286
fn is_async_fn ( & self ) -> bool {
4282
4287
self . token . is_keyword ( kw:: Async ) &&
4283
- self . look_ahead ( 1 , |t| t . is_keyword ( kw:: Fn ) )
4288
+ self . is_keyword_ahead ( 1 , & [ kw:: Fn ] )
4284
4289
}
4285
4290
4286
4291
fn is_do_catch_block ( & self ) -> bool {
4287
4292
self . token . is_keyword ( kw:: Do ) &&
4288
- self . look_ahead ( 1 , |t| t . is_keyword ( kw:: Catch ) ) &&
4293
+ self . is_keyword_ahead ( 1 , & [ kw:: Catch ] ) &&
4289
4294
self . look_ahead ( 2 , |t| * t == token:: OpenDelim ( token:: Brace ) ) &&
4290
4295
!self . restrictions . contains ( Restrictions :: NO_STRUCT_LITERAL )
4291
4296
}
@@ -4309,17 +4314,17 @@ impl<'a> Parser<'a> {
4309
4314
4310
4315
fn is_existential_type_decl ( & self ) -> bool {
4311
4316
self . token . is_keyword ( kw:: Existential ) &&
4312
- self . look_ahead ( 1 , |t| t . is_keyword ( kw:: Type ) )
4317
+ self . is_keyword_ahead ( 1 , & [ kw:: Type ] )
4313
4318
}
4314
4319
4315
4320
fn is_auto_trait_item ( & self ) -> bool {
4316
4321
// auto trait
4317
- ( self . token . is_keyword ( kw:: Auto )
4318
- && self . look_ahead ( 1 , |t| t . is_keyword ( kw:: Trait ) ) )
4322
+ ( self . token . is_keyword ( kw:: Auto ) &&
4323
+ self . is_keyword_ahead ( 1 , & [ kw:: Trait ] ) )
4319
4324
|| // unsafe auto trait
4320
4325
( self . token . is_keyword ( kw:: Unsafe ) &&
4321
- self . look_ahead ( 1 , |t| t . is_keyword ( kw:: Auto ) ) &&
4322
- self . look_ahead ( 2 , |t| t . is_keyword ( kw:: Trait ) ) )
4326
+ self . is_keyword_ahead ( 1 , & [ kw:: Auto ] ) &&
4327
+ self . is_keyword_ahead ( 2 , & [ kw:: Trait ] ) )
4323
4328
}
4324
4329
4325
4330
fn eat_macro_def ( & mut self , attrs : & [ Attribute ] , vis : & Visibility , lo : Span )
@@ -5486,7 +5491,7 @@ impl<'a> Parser<'a> {
5486
5491
( if isolated_self ( self , 1 ) {
5487
5492
self . bump ( ) ;
5488
5493
SelfKind :: Region ( None , Mutability :: Immutable )
5489
- } else if self . look_ahead ( 1 , |t| t . is_keyword ( kw:: Mut ) ) &&
5494
+ } else if self . is_keyword_ahead ( 1 , & [ kw:: Mut ] ) &&
5490
5495
isolated_self ( self , 2 ) {
5491
5496
self . bump ( ) ;
5492
5497
self . bump ( ) ;
@@ -5497,7 +5502,7 @@ impl<'a> Parser<'a> {
5497
5502
let lt = self . expect_lifetime ( ) ;
5498
5503
SelfKind :: Region ( Some ( lt) , Mutability :: Immutable )
5499
5504
} else if self . look_ahead ( 1 , |t| t. is_lifetime ( ) ) &&
5500
- self . look_ahead ( 2 , |t| t . is_keyword ( kw:: Mut ) ) &&
5505
+ self . is_keyword_ahead ( 2 , & [ kw:: Mut ] ) &&
5501
5506
isolated_self ( self , 3 ) {
5502
5507
self . bump ( ) ;
5503
5508
let lt = self . expect_lifetime ( ) ;
@@ -5676,8 +5681,7 @@ impl<'a> Parser<'a> {
5676
5681
/// (returns `false` for things like `const fn`, etc.).
5677
5682
fn is_const_item ( & self ) -> bool {
5678
5683
self . token . is_keyword ( kw:: Const ) &&
5679
- !self . look_ahead ( 1 , |t| t. is_keyword ( kw:: Fn ) ) &&
5680
- !self . look_ahead ( 1 , |t| t. is_keyword ( kw:: Unsafe ) )
5684
+ !self . is_keyword_ahead ( 1 , & [ kw:: Fn , kw:: Unsafe ] )
5681
5685
}
5682
5686
5683
5687
/// Parses all the "front matter" for a `fn` declaration, up to
@@ -5955,7 +5959,7 @@ impl<'a> Parser<'a> {
5955
5959
self . look_ahead ( 1 , |t| t. is_lifetime ( ) || t. is_ident ( ) ) &&
5956
5960
self . look_ahead ( 2 , |t| t == & token:: Gt || t == & token:: Comma ||
5957
5961
t == & token:: Colon || t == & token:: Eq ) ||
5958
- self . look_ahead ( 1 , |t| t . is_keyword ( kw:: Const ) ) )
5962
+ self . is_keyword_ahead ( 1 , & [ kw:: Const ] ) )
5959
5963
}
5960
5964
5961
5965
fn parse_impl_body ( & mut self ) -> PResult < ' a , ( Vec < ImplItem > , Vec < Attribute > ) > {
@@ -6316,7 +6320,7 @@ impl<'a> Parser<'a> {
6316
6320
// `()` or a tuple might be allowed. For example, `struct Struct(pub (), pub (usize));`.
6317
6321
// Because of this, we only `bump` the `(` if we're assured it is appropriate to do so
6318
6322
// by the following tokens.
6319
- if self . look_ahead ( 1 , |t| t . is_keyword ( kw:: Crate ) ) &&
6323
+ if self . is_keyword_ahead ( 1 , & [ kw:: Crate ] ) &&
6320
6324
self . look_ahead ( 2 , |t| t != & token:: ModSep ) // account for `pub(crate::foo)`
6321
6325
{
6322
6326
// `pub(crate)`
@@ -6328,7 +6332,7 @@ impl<'a> Parser<'a> {
6328
6332
VisibilityKind :: Crate ( CrateSugar :: PubCrate ) ,
6329
6333
) ;
6330
6334
return Ok ( vis)
6331
- } else if self . look_ahead ( 1 , |t| t . is_keyword ( kw:: In ) ) {
6335
+ } else if self . is_keyword_ahead ( 1 , & [ kw:: In ] ) {
6332
6336
// `pub(in path)`
6333
6337
self . bump ( ) ; // `(`
6334
6338
self . bump ( ) ; // `in`
@@ -6340,8 +6344,7 @@ impl<'a> Parser<'a> {
6340
6344
} ) ;
6341
6345
return Ok ( vis)
6342
6346
} else if self . look_ahead ( 2 , |t| t == & token:: CloseDelim ( token:: Paren ) ) &&
6343
- self . look_ahead ( 1 , |t| t. is_keyword ( kw:: Super ) ||
6344
- t. is_keyword ( kw:: SelfLower ) )
6347
+ self . is_keyword_ahead ( 1 , & [ kw:: Super , kw:: SelfLower ] )
6345
6348
{
6346
6349
// `pub(self)` or `pub(super)`
6347
6350
self . bump ( ) ; // `(`
@@ -6380,13 +6383,16 @@ impl<'a> Parser<'a> {
6380
6383
fn parse_defaultness ( & mut self ) -> Defaultness {
6381
6384
// `pub` is included for better error messages
6382
6385
if self . check_keyword ( kw:: Default ) &&
6383
- self . look_ahead ( 1 , |t| t. is_keyword ( kw:: Impl ) ||
6384
- t. is_keyword ( kw:: Const ) ||
6385
- t. is_keyword ( kw:: Fn ) ||
6386
- t. is_keyword ( kw:: Unsafe ) ||
6387
- t. is_keyword ( kw:: Extern ) ||
6388
- t. is_keyword ( kw:: Type ) ||
6389
- t. is_keyword ( kw:: Pub ) ) {
6386
+ self . is_keyword_ahead ( 1 , & [
6387
+ kw:: Impl ,
6388
+ kw:: Const ,
6389
+ kw:: Fn ,
6390
+ kw:: Unsafe ,
6391
+ kw:: Extern ,
6392
+ kw:: Type ,
6393
+ kw:: Pub ,
6394
+ ] )
6395
+ {
6390
6396
self . bump ( ) ; // `default`
6391
6397
Defaultness :: Default
6392
6398
} else {
@@ -6880,7 +6886,7 @@ impl<'a> Parser<'a> {
6880
6886
// Ident ["<"...">"] ["where" ...] ("=" | ":") Ty ";"
6881
6887
if self . check_keyword ( kw:: Type ) ||
6882
6888
self . check_keyword ( kw:: Existential ) &&
6883
- self . look_ahead ( 1 , |t| t . is_keyword ( kw:: Type ) ) {
6889
+ self . is_keyword_ahead ( 1 , & [ kw:: Type ] ) {
6884
6890
let existential = self . eat_keyword ( kw:: Existential ) ;
6885
6891
assert ! ( self . eat_keyword( kw:: Type ) ) ;
6886
6892
Some ( self . parse_existential_or_alias ( existential) )
@@ -7157,7 +7163,7 @@ impl<'a> Parser<'a> {
7157
7163
let const_span = self . prev_span ;
7158
7164
if self . check_keyword ( kw:: Fn )
7159
7165
|| ( self . check_keyword ( kw:: Unsafe )
7160
- && self . look_ahead ( 1 , |t| t . is_keyword ( kw:: Fn ) ) ) {
7166
+ && self . is_keyword_ahead ( 1 , & [ kw:: Fn ] ) ) {
7161
7167
// CONST FUNCTION ITEM
7162
7168
let unsafety = self . parse_unsafety ( ) ;
7163
7169
self . bump ( ) ;
@@ -7202,10 +7208,10 @@ impl<'a> Parser<'a> {
7202
7208
// `unsafe async fn` or `async fn`
7203
7209
if (
7204
7210
self . check_keyword ( kw:: Unsafe ) &&
7205
- self . look_ahead ( 1 , |t| t . is_keyword ( kw:: Async ) )
7211
+ self . is_keyword_ahead ( 1 , & [ kw:: Async ] )
7206
7212
) || (
7207
7213
self . check_keyword ( kw:: Async ) &&
7208
- self . look_ahead ( 1 , |t| t . is_keyword ( kw:: Fn ) )
7214
+ self . is_keyword_ahead ( 1 , & [ kw:: Fn ] )
7209
7215
)
7210
7216
{
7211
7217
// ASYNC FUNCTION ITEM
@@ -7239,8 +7245,7 @@ impl<'a> Parser<'a> {
7239
7245
return Ok ( Some ( item) ) ;
7240
7246
}
7241
7247
if self . check_keyword ( kw:: Unsafe ) &&
7242
- ( self . look_ahead ( 1 , |t| t. is_keyword ( kw:: Trait ) ) ||
7243
- self . look_ahead ( 1 , |t| t. is_keyword ( kw:: Auto ) ) )
7248
+ self . is_keyword_ahead ( 1 , & [ kw:: Trait , kw:: Auto ] )
7244
7249
{
7245
7250
// UNSAFE TRAIT ITEM
7246
7251
self . bump ( ) ; // `unsafe`
@@ -7263,11 +7268,9 @@ impl<'a> Parser<'a> {
7263
7268
}
7264
7269
if self . check_keyword ( kw:: Impl ) ||
7265
7270
self . check_keyword ( kw:: Unsafe ) &&
7266
- self . look_ahead ( 1 , |t| t. is_keyword ( kw:: Impl ) ) ||
7267
- self . check_keyword ( kw:: Default ) &&
7268
- self . look_ahead ( 1 , |t| t. is_keyword ( kw:: Impl ) ) ||
7271
+ self . is_keyword_ahead ( 1 , & [ kw:: Impl ] ) ||
7269
7272
self . check_keyword ( kw:: Default ) &&
7270
- self . look_ahead ( 1 , |t| t . is_keyword ( kw:: Unsafe ) ) {
7273
+ self . is_keyword_ahead ( 1 , & [ kw :: Impl , kw:: Unsafe ] ) {
7271
7274
// IMPL ITEM
7272
7275
let defaultness = self . parse_defaultness ( ) ;
7273
7276
let unsafety = self . parse_unsafety ( ) ;
@@ -7360,7 +7363,7 @@ impl<'a> Parser<'a> {
7360
7363
}
7361
7364
if self . check_keyword ( kw:: Trait )
7362
7365
|| ( self . check_keyword ( kw:: Auto )
7363
- && self . look_ahead ( 1 , |t| t . is_keyword ( kw:: Trait ) ) )
7366
+ && self . is_keyword_ahead ( 1 , & [ kw:: Trait ] ) )
7364
7367
{
7365
7368
let is_auto = if self . eat_keyword ( kw:: Trait ) {
7366
7369
IsAuto :: No
0 commit comments