@@ -18,7 +18,7 @@ use crate::parse::token;
18
18
use crate :: parse:: parser:: maybe_append;
19
19
use crate :: parse:: diagnostics:: Error ;
20
20
use crate :: tokenstream:: { TokenTree , TokenStream } ;
21
- use crate :: source_map:: { respan, Span , Spanned } ;
21
+ use crate :: source_map:: { respan, Span } ;
22
22
use crate :: symbol:: { kw, sym} ;
23
23
24
24
use std:: mem;
@@ -122,12 +122,12 @@ impl<'a> Parser<'a> {
122
122
if self . eat_keyword ( kw:: Fn ) {
123
123
// EXTERN FUNCTION ITEM
124
124
let fn_span = self . prev_span ;
125
- let abi = opt_abi . unwrap_or ( Abi :: C ) ;
126
- let ( ident , item_ , extra_attrs ) =
127
- self . parse_item_fn ( Unsafety :: Normal ,
128
- respan ( fn_span, IsAsync :: NotAsync ) ,
129
- respan ( fn_span , Constness :: NotConst ) ,
130
- abi ) ?;
125
+ let ( ident , item_ , extra_attrs ) = self . parse_item_fn ( FnHeader {
126
+ unsafety : Unsafety :: Normal ,
127
+ asyncness : respan ( fn_span , IsAsync :: NotAsync ) ,
128
+ constness : respan ( fn_span, Constness :: NotConst ) ,
129
+ abi : opt_abi . unwrap_or ( Abi :: C ) ,
130
+ } ) ?;
131
131
let prev_span = self . prev_span ;
132
132
let item = self . mk_item ( lo. to ( prev_span) ,
133
133
ident,
@@ -165,11 +165,12 @@ impl<'a> Parser<'a> {
165
165
// CONST FUNCTION ITEM
166
166
let unsafety = self . parse_unsafety ( ) ;
167
167
self . bump ( ) ;
168
- let ( ident, item_, extra_attrs) =
169
- self . parse_item_fn ( unsafety,
170
- respan ( const_span, IsAsync :: NotAsync ) ,
171
- respan ( const_span, Constness :: Const ) ,
172
- Abi :: Rust ) ?;
168
+ let ( ident, item_, extra_attrs) = self . parse_item_fn ( FnHeader {
169
+ unsafety,
170
+ asyncness : respan ( const_span, IsAsync :: NotAsync ) ,
171
+ constness : respan ( const_span, Constness :: Const ) ,
172
+ abi : Abi :: Rust ,
173
+ } ) ?;
173
174
let prev_span = self . prev_span ;
174
175
let item = self . mk_item ( lo. to ( prev_span) ,
175
176
ident,
@@ -213,14 +214,16 @@ impl<'a> Parser<'a> {
213
214
let unsafety = self . parse_unsafety ( ) ; // `unsafe`?
214
215
self . expect_keyword ( kw:: Fn ) ?; // `fn`
215
216
let fn_span = self . prev_span ;
216
- let ( ident, item_, extra_attrs) =
217
- self . parse_item_fn ( unsafety,
218
- respan ( async_span, IsAsync :: Async {
219
- closure_id : DUMMY_NODE_ID ,
220
- return_impl_trait_id : DUMMY_NODE_ID ,
221
- } ) ,
222
- respan ( fn_span, Constness :: NotConst ) ,
223
- Abi :: Rust ) ?;
217
+ let asyncness = respan ( async_span, IsAsync :: Async {
218
+ closure_id : DUMMY_NODE_ID ,
219
+ return_impl_trait_id : DUMMY_NODE_ID ,
220
+ } ) ;
221
+ let ( ident, item_, extra_attrs) = self . parse_item_fn ( FnHeader {
222
+ unsafety,
223
+ asyncness,
224
+ constness : respan ( fn_span, Constness :: NotConst ) ,
225
+ abi : Abi :: Rust ,
226
+ } ) ?;
224
227
let prev_span = self . prev_span ;
225
228
let item = self . mk_item ( lo. to ( prev_span) ,
226
229
ident,
@@ -271,11 +274,12 @@ impl<'a> Parser<'a> {
271
274
// FUNCTION ITEM
272
275
self . bump ( ) ;
273
276
let fn_span = self . prev_span ;
274
- let ( ident, item_, extra_attrs) =
275
- self . parse_item_fn ( Unsafety :: Normal ,
276
- respan ( fn_span, IsAsync :: NotAsync ) ,
277
- respan ( fn_span, Constness :: NotConst ) ,
278
- Abi :: Rust ) ?;
277
+ let ( ident, item_, extra_attrs) = self . parse_item_fn ( FnHeader {
278
+ unsafety : Unsafety :: Normal ,
279
+ asyncness : respan ( fn_span, IsAsync :: NotAsync ) ,
280
+ constness : respan ( fn_span, Constness :: NotConst ) ,
281
+ abi : Abi :: Rust ,
282
+ } ) ?;
279
283
let prev_span = self . prev_span ;
280
284
let item = self . mk_item ( lo. to ( prev_span) ,
281
285
ident,
@@ -297,11 +301,12 @@ impl<'a> Parser<'a> {
297
301
} ;
298
302
self . expect_keyword ( kw:: Fn ) ?;
299
303
let fn_span = self . prev_span ;
300
- let ( ident, item_, extra_attrs) =
301
- self . parse_item_fn ( Unsafety :: Unsafe ,
302
- respan ( fn_span, IsAsync :: NotAsync ) ,
303
- respan ( fn_span, Constness :: NotConst ) ,
304
- abi) ?;
304
+ let ( ident, item_, extra_attrs) = self . parse_item_fn ( FnHeader {
305
+ unsafety : Unsafety :: Unsafe ,
306
+ asyncness : respan ( fn_span, IsAsync :: NotAsync ) ,
307
+ constness : respan ( fn_span, Constness :: NotConst ) ,
308
+ abi,
309
+ } ) ?;
305
310
let prev_span = self . prev_span ;
306
311
let item = self . mk_item ( lo. to ( prev_span) ,
307
312
ident,
@@ -872,8 +877,7 @@ impl<'a> Parser<'a> {
872
877
is_name_required : impl Copy + Fn ( & token:: Token ) -> bool ,
873
878
) -> PResult < ' a , ( Ident , MethodSig , Generics ) > {
874
879
let header = self . parse_fn_front_matter ( ) ?;
875
- let ident = self . parse_ident ( ) ?;
876
- let mut generics = self . parse_generics ( ) ?;
880
+ let ( ident, mut generics) = self . parse_fn_header ( ) ?;
877
881
let decl = self . parse_fn_decl_with_self ( is_name_required) ?;
878
882
let sig = MethodSig { header, decl } ;
879
883
generics. where_clause = self . parse_where_clause ( ) ?;
@@ -1251,20 +1255,22 @@ impl<'a> Parser<'a> {
1251
1255
}
1252
1256
1253
1257
/// Parses an item-position function declaration.
1254
- fn parse_item_fn (
1258
+ fn parse_item_fn ( & mut self , header : FnHeader ) -> PResult < ' a , ItemInfo > {
1259
+ let allow_c_variadic = header. abi == Abi :: C && header. unsafety == Unsafety :: Unsafe ;
1260
+ let ( ident, decl, generics) = self . parse_fn_sig ( allow_c_variadic) ?;
1261
+ let ( inner_attrs, body) = self . parse_inner_attrs_and_block ( ) ?;
1262
+ Ok ( ( ident, ItemKind :: Fn ( decl, header, generics, body) , Some ( inner_attrs) ) )
1263
+ }
1264
+
1265
+ /// Parse the "signature", including the identifier, parameters, and generics of a function.
1266
+ fn parse_fn_sig (
1255
1267
& mut self ,
1256
- unsafety : Unsafety ,
1257
- asyncness : Spanned < IsAsync > ,
1258
- constness : Spanned < Constness > ,
1259
- abi : Abi
1260
- ) -> PResult < ' a , ItemInfo > {
1268
+ allow_c_variadic : bool ,
1269
+ ) -> PResult < ' a , ( Ident , P < FnDecl > , Generics ) > {
1261
1270
let ( ident, mut generics) = self . parse_fn_header ( ) ?;
1262
- let allow_c_variadic = abi == Abi :: C && unsafety == Unsafety :: Unsafe ;
1263
1271
let decl = self . parse_fn_decl ( allow_c_variadic) ?;
1264
1272
generics. where_clause = self . parse_where_clause ( ) ?;
1265
- let ( inner_attrs, body) = self . parse_inner_attrs_and_block ( ) ?;
1266
- let header = FnHeader { unsafety, asyncness, constness, abi } ;
1267
- Ok ( ( ident, ItemKind :: Fn ( decl, header, generics, body) , Some ( inner_attrs) ) )
1273
+ Ok ( ( ident, decl, generics) )
1268
1274
}
1269
1275
1270
1276
/// Parses the name and optional generic types of a function header.
@@ -1386,18 +1392,15 @@ impl<'a> Parser<'a> {
1386
1392
extern_sp : Span ,
1387
1393
) -> PResult < ' a , ForeignItem > {
1388
1394
self . expect_keyword ( kw:: Fn ) ?;
1389
-
1390
- let ( ident, mut generics) = self . parse_fn_header ( ) ?;
1391
- let decl = self . parse_fn_decl ( true ) ?;
1392
- generics. where_clause = self . parse_where_clause ( ) ?;
1393
- let hi = self . token . span ;
1395
+ let ( ident, decl, generics) = self . parse_fn_sig ( true ) ?;
1396
+ let span = lo. to ( self . token . span ) ;
1394
1397
self . parse_semi_or_incorrect_foreign_fn_body ( & ident, extern_sp) ?;
1395
1398
Ok ( ast:: ForeignItem {
1396
1399
ident,
1397
1400
attrs,
1398
1401
kind : ForeignItemKind :: Fn ( decl, generics) ,
1399
1402
id : DUMMY_NODE_ID ,
1400
- span : lo . to ( hi ) ,
1403
+ span,
1401
1404
vis,
1402
1405
} )
1403
1406
}
0 commit comments