@@ -141,14 +141,14 @@ impl<'a> Parser<'a> {
141
141
self . bump ( ) ;
142
142
// STATIC ITEM
143
143
let m = self . parse_mutability ( ) ;
144
- let info = self . parse_item_const ( Some ( m) ) ;
144
+ let info = self . parse_item_const ( Some ( m) ) ? ;
145
145
return self . mk_item_with_info ( attrs, lo, vis, info) ;
146
146
}
147
+
147
148
if self . eat_keyword ( kw:: Const ) {
148
149
let const_span = self . prev_span ;
149
150
if [ kw:: Fn , kw:: Unsafe , kw:: Extern ] . iter ( ) . any ( |k| self . check_keyword ( * k) ) {
150
151
// CONST FUNCTION ITEM
151
-
152
152
let unsafety = self . parse_unsafety ( ) ;
153
153
154
154
if self . check_keyword ( kw:: Extern ) {
@@ -157,7 +157,7 @@ impl<'a> Parser<'a> {
157
157
) ;
158
158
}
159
159
let abi = self . parse_extern_abi ( ) ?;
160
- self . bump ( ) ; // 'fn'
160
+ self . bump ( ) ; // `fn`
161
161
162
162
let header = FnHeader {
163
163
unsafety,
@@ -181,7 +181,8 @@ impl<'a> Parser<'a> {
181
181
)
182
182
. emit ( ) ;
183
183
}
184
- let info = self . parse_item_const ( None ) ;
184
+
185
+ let info = self . parse_item_const ( None ) ?;
185
186
return self . mk_item_with_info ( attrs, lo, vis, info) ;
186
187
}
187
188
@@ -210,6 +211,7 @@ impl<'a> Parser<'a> {
210
211
return self . parse_item_fn ( lo, vis, attrs, header) ;
211
212
}
212
213
}
214
+
213
215
if self . check_keyword ( kw:: Unsafe ) &&
214
216
self . is_keyword_ahead ( 1 , & [ kw:: Trait , kw:: Auto ] )
215
217
{
@@ -222,21 +224,24 @@ impl<'a> Parser<'a> {
222
224
self . expect_keyword ( kw:: Trait ) ?;
223
225
IsAuto :: Yes
224
226
} ;
225
- let info = self . parse_item_trait ( is_auto, Unsafety :: Unsafe ) ;
227
+ let info = self . parse_item_trait ( is_auto, Unsafety :: Unsafe ) ? ;
226
228
return self . mk_item_with_info ( attrs, lo, vis, info) ;
227
229
}
230
+
228
231
if self . check_keyword ( kw:: Impl ) ||
229
232
self . check_keyword ( kw:: Unsafe ) &&
230
233
self . is_keyword_ahead ( 1 , & [ kw:: Impl ] ) ||
231
234
self . check_keyword ( kw:: Default ) &&
232
- self . is_keyword_ahead ( 1 , & [ kw:: Impl , kw:: Unsafe ] ) {
235
+ self . is_keyword_ahead ( 1 , & [ kw:: Impl , kw:: Unsafe ] )
236
+ {
233
237
// IMPL ITEM
234
238
let defaultness = self . parse_defaultness ( ) ;
235
239
let unsafety = self . parse_unsafety ( ) ;
236
240
self . expect_keyword ( kw:: Impl ) ?;
237
- let info = self . parse_item_impl ( unsafety, defaultness) ;
241
+ let info = self . parse_item_impl ( unsafety, defaultness) ? ;
238
242
return self . mk_item_with_info ( attrs, lo, vis, info) ;
239
243
}
244
+
240
245
if self . check_keyword ( kw:: Fn ) {
241
246
// FUNCTION ITEM
242
247
self . bump ( ) ;
@@ -249,8 +254,10 @@ impl<'a> Parser<'a> {
249
254
} ;
250
255
return self . parse_item_fn ( lo, vis, attrs, header) ;
251
256
}
257
+
252
258
if self . check_keyword ( kw:: Unsafe )
253
- && self . look_ahead ( 1 , |t| * t != token:: OpenDelim ( token:: Brace ) ) {
259
+ && self . look_ahead ( 1 , |t| * t != token:: OpenDelim ( token:: Brace ) )
260
+ {
254
261
// UNSAFE FUNCTION ITEM
255
262
self . bump ( ) ; // `unsafe`
256
263
// `{` is also expected after `unsafe`; in case of error, include it in the diagnostic.
@@ -266,11 +273,13 @@ impl<'a> Parser<'a> {
266
273
} ;
267
274
return self . parse_item_fn ( lo, vis, attrs, header) ;
268
275
}
276
+
269
277
if self . eat_keyword ( kw:: Mod ) {
270
278
// MODULE ITEM
271
- let info = self . parse_item_mod ( & attrs[ ..] ) ;
279
+ let info = self . parse_item_mod ( & attrs[ ..] ) ? ;
272
280
return self . mk_item_with_info ( attrs, lo, vis, info) ;
273
281
}
282
+
274
283
if let Some ( type_) = self . eat_type ( ) {
275
284
let ( ident, alias, generics) = type_?;
276
285
// TYPE ITEM
@@ -281,37 +290,41 @@ impl<'a> Parser<'a> {
281
290
let span = lo. to ( self . prev_span ) ;
282
291
return Ok ( Some ( self . mk_item ( span, ident, item_, vis, attrs) ) ) ;
283
292
}
293
+
284
294
if self . eat_keyword ( kw:: Enum ) {
285
295
// ENUM ITEM
286
- let info = self . parse_item_enum ( ) ;
296
+ let info = self . parse_item_enum ( ) ? ;
287
297
return self . mk_item_with_info ( attrs, lo, vis, info) ;
288
298
}
299
+
289
300
if self . check_keyword ( kw:: Trait )
290
301
|| ( self . check_keyword ( kw:: Auto )
291
302
&& self . is_keyword_ahead ( 1 , & [ kw:: Trait ] ) )
292
303
{
293
- let is_auto = if self . eat_keyword ( kw:: Trait ) {
294
- IsAuto :: No
295
- } else {
296
- self . expect_keyword ( kw:: Auto ) ?;
297
- self . expect_keyword ( kw:: Trait ) ?;
304
+ // TRAIT ITEM
305
+ let is_auto = if self . eat_keyword ( kw:: Auto ) {
298
306
IsAuto :: Yes
307
+ } else {
308
+ IsAuto :: No
299
309
} ;
300
- // TRAIT ITEM
301
- let info = self . parse_item_trait ( is_auto, Unsafety :: Normal ) ;
310
+ self . expect_keyword ( kw :: Trait ) ? ;
311
+ let info = self . parse_item_trait ( is_auto, Unsafety :: Normal ) ? ;
302
312
return self . mk_item_with_info ( attrs, lo, vis, info) ;
303
313
}
314
+
304
315
if self . eat_keyword ( kw:: Struct ) {
305
316
// STRUCT ITEM
306
- let info = self . parse_item_struct ( ) ;
317
+ let info = self . parse_item_struct ( ) ? ;
307
318
return self . mk_item_with_info ( attrs, lo, vis, info) ;
308
319
}
320
+
309
321
if self . is_union_item ( ) {
310
322
// UNION ITEM
311
323
self . bump ( ) ;
312
- let info = self . parse_item_union ( ) ;
324
+ let info = self . parse_item_union ( ) ? ;
313
325
return self . mk_item_with_info ( attrs, lo, vis, info) ;
314
326
}
327
+
315
328
if let Some ( macro_def) = self . eat_macro_def ( & attrs, & vis, lo) ? {
316
329
return Ok ( Some ( macro_def) ) ;
317
330
}
@@ -417,9 +430,9 @@ impl<'a> Parser<'a> {
417
430
attrs : Vec < Attribute > ,
418
431
lo : Span ,
419
432
vis : Visibility ,
420
- info : PResult < ' a , ItemInfo > ,
433
+ info : ItemInfo ,
421
434
) -> PResult < ' a , Option < P < Item > > > {
422
- let ( ident, item, extra_attrs) = info? ;
435
+ let ( ident, item, extra_attrs) = info;
423
436
let span = lo. to ( self . prev_span ) ;
424
437
let attrs = maybe_append ( attrs, extra_attrs) ;
425
438
Ok ( Some ( self . mk_item ( span, ident, item, vis, attrs) ) )
@@ -1195,10 +1208,8 @@ impl<'a> Parser<'a> {
1195
1208
let allow_c_variadic = header. abi == Abi :: C && header. unsafety == Unsafety :: Unsafe ;
1196
1209
let ( ident, decl, generics) = self . parse_fn_sig ( allow_c_variadic) ?;
1197
1210
let ( inner_attrs, body) = self . parse_inner_attrs_and_block ( ) ?;
1198
- let span = lo. to ( self . prev_span ) ;
1199
1211
let kind = ItemKind :: Fn ( decl, header, generics, body) ;
1200
- let attrs = maybe_append ( attrs, Some ( inner_attrs) ) ;
1201
- Ok ( Some ( self . mk_item ( span, ident, kind, vis, attrs) ) )
1212
+ self . mk_item_with_info ( attrs, lo, vis, ( ident, kind, Some ( inner_attrs) ) )
1202
1213
}
1203
1214
1204
1215
/// Parse the "signature", including the identifier, parameters, and generics of a function.
0 commit comments