@@ -98,23 +98,22 @@ impl<'a> Parser<'a> {
98
98
99
99
let lo = self . token . span ;
100
100
101
- let visibility = self . parse_visibility ( false ) ?;
101
+ let vis = self . parse_visibility ( false ) ?;
102
102
103
103
if self . eat_keyword ( kw:: Use ) {
104
104
// USE ITEM
105
105
let item_ = ItemKind :: Use ( P ( self . parse_use_tree ( ) ?) ) ;
106
106
self . expect ( & token:: Semi ) ?;
107
107
108
108
let span = lo. to ( self . prev_span ) ;
109
- let item =
110
- self . mk_item ( span, Ident :: invalid ( ) , item_, visibility, attrs) ;
109
+ let item = self . mk_item ( span, Ident :: invalid ( ) , item_, vis, attrs) ;
111
110
return Ok ( Some ( item) ) ;
112
111
}
113
112
114
113
if self . eat_keyword ( kw:: Extern ) {
115
114
let extern_sp = self . prev_span ;
116
115
if self . eat_keyword ( kw:: Crate ) {
117
- return Ok ( Some ( self . parse_item_extern_crate ( lo, visibility , attrs) ?) ) ;
116
+ return Ok ( Some ( self . parse_item_extern_crate ( lo, vis , attrs) ?) ) ;
118
117
}
119
118
120
119
let opt_abi = self . parse_opt_abi ( ) ?;
@@ -128,10 +127,10 @@ impl<'a> Parser<'a> {
128
127
constness : respan ( fn_span, Constness :: NotConst ) ,
129
128
abi : opt_abi. unwrap_or ( Abi :: C ) ,
130
129
} ;
131
- return self . parse_item_fn ( lo, visibility , attrs, header) ;
130
+ return self . parse_item_fn ( lo, vis , attrs, header) ;
132
131
} else if self . check ( & token:: OpenDelim ( token:: Brace ) ) {
133
132
return Ok ( Some (
134
- self . parse_item_foreign_mod ( lo, opt_abi, visibility , attrs, extern_sp) ?,
133
+ self . parse_item_foreign_mod ( lo, opt_abi, vis , attrs, extern_sp) ?,
135
134
) ) ;
136
135
}
137
136
@@ -142,10 +141,8 @@ impl<'a> Parser<'a> {
142
141
self . bump ( ) ;
143
142
// STATIC ITEM
144
143
let m = self . parse_mutability ( ) ;
145
- let ( ident, item_, extra_attrs) = self . parse_item_const ( Some ( m) ) ?;
146
- let span = lo. to ( self . prev_span ) ;
147
- let attrs = maybe_append ( attrs, extra_attrs) ;
148
- return Ok ( Some ( self . mk_item ( span, ident, item_, visibility, attrs) ) ) ;
144
+ let info = self . parse_item_const ( Some ( m) ) ;
145
+ return self . mk_item_with_info ( attrs, lo, vis, info) ;
149
146
}
150
147
if self . eat_keyword ( kw:: Const ) {
151
148
let const_span = self . prev_span ;
@@ -168,7 +165,7 @@ impl<'a> Parser<'a> {
168
165
constness : respan ( const_span, Constness :: Const ) ,
169
166
abi,
170
167
} ;
171
- return self . parse_item_fn ( lo, visibility , attrs, header) ;
168
+ return self . parse_item_fn ( lo, vis , attrs, header) ;
172
169
}
173
170
174
171
// CONST ITEM
@@ -184,10 +181,8 @@ impl<'a> Parser<'a> {
184
181
)
185
182
. emit ( ) ;
186
183
}
187
- let ( ident, item_, extra_attrs) = self . parse_item_const ( None ) ?;
188
- let span = lo. to ( self . prev_span ) ;
189
- let attrs = maybe_append ( attrs, extra_attrs) ;
190
- return Ok ( Some ( self . mk_item ( span, ident, item_, visibility, attrs) ) ) ;
184
+ let info = self . parse_item_const ( None ) ;
185
+ return self . mk_item_with_info ( attrs, lo, vis, info) ;
191
186
}
192
187
193
188
// Parses `async unsafe? fn`.
@@ -212,7 +207,7 @@ impl<'a> Parser<'a> {
212
207
constness : respan ( fn_span, Constness :: NotConst ) ,
213
208
abi : Abi :: Rust ,
214
209
} ;
215
- return self . parse_item_fn ( lo, visibility , attrs, header) ;
210
+ return self . parse_item_fn ( lo, vis , attrs, header) ;
216
211
}
217
212
}
218
213
if self . check_keyword ( kw:: Unsafe ) &&
@@ -227,10 +222,8 @@ impl<'a> Parser<'a> {
227
222
self . expect_keyword ( kw:: Trait ) ?;
228
223
IsAuto :: Yes
229
224
} ;
230
- let ( ident, item_, extra_attrs) = self . parse_item_trait ( is_auto, Unsafety :: Unsafe ) ?;
231
- let span = lo. to ( self . prev_span ) ;
232
- let attrs = maybe_append ( attrs, extra_attrs) ;
233
- return Ok ( Some ( self . mk_item ( span, ident, item_, visibility, attrs) ) ) ;
225
+ let info = self . parse_item_trait ( is_auto, Unsafety :: Unsafe ) ;
226
+ return self . mk_item_with_info ( attrs, lo, vis, info) ;
234
227
}
235
228
if self . check_keyword ( kw:: Impl ) ||
236
229
self . check_keyword ( kw:: Unsafe ) &&
@@ -241,10 +234,8 @@ impl<'a> Parser<'a> {
241
234
let defaultness = self . parse_defaultness ( ) ;
242
235
let unsafety = self . parse_unsafety ( ) ;
243
236
self . expect_keyword ( kw:: Impl ) ?;
244
- let ( ident, item_, extra_attrs) = self . parse_item_impl ( unsafety, defaultness) ?;
245
- let span = lo. to ( self . prev_span ) ;
246
- let attrs = maybe_append ( attrs, extra_attrs) ;
247
- return Ok ( Some ( self . mk_item ( span, ident, item_, visibility, attrs) ) ) ;
237
+ let info = self . parse_item_impl ( unsafety, defaultness) ;
238
+ return self . mk_item_with_info ( attrs, lo, vis, info) ;
248
239
}
249
240
if self . check_keyword ( kw:: Fn ) {
250
241
// FUNCTION ITEM
@@ -256,7 +247,7 @@ impl<'a> Parser<'a> {
256
247
constness : respan ( fn_span, Constness :: NotConst ) ,
257
248
abi : Abi :: Rust ,
258
249
} ;
259
- return self . parse_item_fn ( lo, visibility , attrs, header) ;
250
+ return self . parse_item_fn ( lo, vis , attrs, header) ;
260
251
}
261
252
if self . check_keyword ( kw:: Unsafe )
262
253
&& self . look_ahead ( 1 , |t| * t != token:: OpenDelim ( token:: Brace ) ) {
@@ -273,14 +264,12 @@ impl<'a> Parser<'a> {
273
264
constness : respan ( fn_span, Constness :: NotConst ) ,
274
265
abi,
275
266
} ;
276
- return self . parse_item_fn ( lo, visibility , attrs, header) ;
267
+ return self . parse_item_fn ( lo, vis , attrs, header) ;
277
268
}
278
269
if self . eat_keyword ( kw:: Mod ) {
279
270
// MODULE ITEM
280
- let ( ident, item_, extra_attrs) = self . parse_item_mod ( & attrs[ ..] ) ?;
281
- let span = lo. to ( self . prev_span ) ;
282
- let attrs = maybe_append ( attrs, extra_attrs) ;
283
- return Ok ( Some ( self . mk_item ( span, ident, item_, visibility, attrs) ) ) ;
271
+ let info = self . parse_item_mod ( & attrs[ ..] ) ;
272
+ return self . mk_item_with_info ( attrs, lo, vis, info) ;
284
273
}
285
274
if let Some ( type_) = self . eat_type ( ) {
286
275
let ( ident, alias, generics) = type_?;
@@ -290,14 +279,12 @@ impl<'a> Parser<'a> {
290
279
AliasKind :: OpaqueTy ( bounds) => ItemKind :: OpaqueTy ( bounds, generics) ,
291
280
} ;
292
281
let span = lo. to ( self . prev_span ) ;
293
- return Ok ( Some ( self . mk_item ( span, ident, item_, visibility , attrs) ) ) ;
282
+ return Ok ( Some ( self . mk_item ( span, ident, item_, vis , attrs) ) ) ;
294
283
}
295
284
if self . eat_keyword ( kw:: Enum ) {
296
285
// ENUM ITEM
297
- let ( ident, item_, extra_attrs) = self . parse_item_enum ( ) ?;
298
- let span = lo. to ( self . prev_span ) ;
299
- let attrs = maybe_append ( attrs, extra_attrs) ;
300
- return Ok ( Some ( self . mk_item ( span, ident, item_, visibility, attrs) ) ) ;
286
+ let info = self . parse_item_enum ( ) ;
287
+ return self . mk_item_with_info ( attrs, lo, vis, info) ;
301
288
}
302
289
if self . check_keyword ( kw:: Trait )
303
290
|| ( self . check_keyword ( kw:: Auto )
@@ -311,33 +298,27 @@ impl<'a> Parser<'a> {
311
298
IsAuto :: Yes
312
299
} ;
313
300
// TRAIT ITEM
314
- let ( ident, item_, extra_attrs) = self . parse_item_trait ( is_auto, Unsafety :: Normal ) ?;
315
- let span = lo. to ( self . prev_span ) ;
316
- let attrs = maybe_append ( attrs, extra_attrs) ;
317
- return Ok ( Some ( self . mk_item ( span, ident, item_, visibility, attrs) ) ) ;
301
+ let info = self . parse_item_trait ( is_auto, Unsafety :: Normal ) ;
302
+ return self . mk_item_with_info ( attrs, lo, vis, info) ;
318
303
}
319
304
if self . eat_keyword ( kw:: Struct ) {
320
305
// STRUCT ITEM
321
- let ( ident, item_, extra_attrs) = self . parse_item_struct ( ) ?;
322
- let span = lo. to ( self . prev_span ) ;
323
- let attrs = maybe_append ( attrs, extra_attrs) ;
324
- return Ok ( Some ( self . mk_item ( span, ident, item_, visibility, attrs) ) ) ;
306
+ let info = self . parse_item_struct ( ) ;
307
+ return self . mk_item_with_info ( attrs, lo, vis, info) ;
325
308
}
326
309
if self . is_union_item ( ) {
327
310
// UNION ITEM
328
311
self . bump ( ) ;
329
- let ( ident, item_, extra_attrs) = self . parse_item_union ( ) ?;
330
- let span = lo. to ( self . prev_span ) ;
331
- let attrs = maybe_append ( attrs, extra_attrs) ;
332
- return Ok ( Some ( self . mk_item ( span, ident, item_, visibility, attrs) ) ) ;
312
+ let info = self . parse_item_union ( ) ;
313
+ return self . mk_item_with_info ( attrs, lo, vis, info) ;
333
314
}
334
- if let Some ( macro_def) = self . eat_macro_def ( & attrs, & visibility , lo) ? {
315
+ if let Some ( macro_def) = self . eat_macro_def ( & attrs, & vis , lo) ? {
335
316
return Ok ( Some ( macro_def) ) ;
336
317
}
337
318
338
319
// Verify whether we have encountered a struct or method definition where the user forgot to
339
320
// add the `struct` or `fn` keyword after writing `pub`: `pub S {}`
340
- if visibility . node . is_pub ( ) &&
321
+ if vis . node . is_pub ( ) &&
341
322
self . check_ident ( ) &&
342
323
self . look_ahead ( 1 , |t| * t != token:: Not )
343
324
{
@@ -428,7 +409,20 @@ impl<'a> Parser<'a> {
428
409
return Err ( err) ;
429
410
}
430
411
}
431
- self . parse_macro_use_or_failure ( attrs, macros_allowed, attributes_allowed, lo, visibility)
412
+ self . parse_macro_use_or_failure ( attrs, macros_allowed, attributes_allowed, lo, vis)
413
+ }
414
+
415
+ fn mk_item_with_info (
416
+ & self ,
417
+ attrs : Vec < Attribute > ,
418
+ lo : Span ,
419
+ vis : Visibility ,
420
+ info : PResult < ' a , ItemInfo > ,
421
+ ) -> PResult < ' a , Option < P < Item > > > {
422
+ let ( ident, item, extra_attrs) = info?;
423
+ let span = lo. to ( self . prev_span ) ;
424
+ let attrs = maybe_append ( attrs, extra_attrs) ;
425
+ Ok ( Some ( self . mk_item ( span, ident, item, vis, attrs) ) )
432
426
}
433
427
434
428
fn recover_first_param ( & mut self ) -> & ' static str {
0 commit comments