@@ -18,7 +18,7 @@ use crate::parse::token;
1818use crate :: parse:: parser:: maybe_append;
1919use crate :: parse:: diagnostics:: Error ;
2020use crate :: tokenstream:: { TokenTree , TokenStream } ;
21- use crate :: source_map:: { respan, Span , Spanned } ;
21+ use crate :: source_map:: { respan, Span } ;
2222use crate :: symbol:: { kw, sym} ;
2323
2424use std:: mem;
@@ -122,12 +122,12 @@ impl<'a> Parser<'a> {
122122 if self . eat_keyword ( kw:: Fn ) {
123123 // EXTERN FUNCTION ITEM
124124 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+ } ) ?;
131131 let prev_span = self . prev_span ;
132132 let item = self . mk_item ( lo. to ( prev_span) ,
133133 ident,
@@ -165,11 +165,12 @@ impl<'a> Parser<'a> {
165165 // CONST FUNCTION ITEM
166166 let unsafety = self . parse_unsafety ( ) ;
167167 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+ } ) ?;
173174 let prev_span = self . prev_span ;
174175 let item = self . mk_item ( lo. to ( prev_span) ,
175176 ident,
@@ -213,14 +214,16 @@ impl<'a> Parser<'a> {
213214 let unsafety = self . parse_unsafety ( ) ; // `unsafe`?
214215 self . expect_keyword ( kw:: Fn ) ?; // `fn`
215216 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+ } ) ?;
224227 let prev_span = self . prev_span ;
225228 let item = self . mk_item ( lo. to ( prev_span) ,
226229 ident,
@@ -271,11 +274,12 @@ impl<'a> Parser<'a> {
271274 // FUNCTION ITEM
272275 self . bump ( ) ;
273276 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+ } ) ?;
279283 let prev_span = self . prev_span ;
280284 let item = self . mk_item ( lo. to ( prev_span) ,
281285 ident,
@@ -297,11 +301,12 @@ impl<'a> Parser<'a> {
297301 } ;
298302 self . expect_keyword ( kw:: Fn ) ?;
299303 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+ } ) ?;
305310 let prev_span = self . prev_span ;
306311 let item = self . mk_item ( lo. to ( prev_span) ,
307312 ident,
@@ -872,8 +877,7 @@ impl<'a> Parser<'a> {
872877 is_name_required : impl Copy + Fn ( & token:: Token ) -> bool ,
873878 ) -> PResult < ' a , ( Ident , MethodSig , Generics ) > {
874879 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 ( ) ?;
877881 let decl = self . parse_fn_decl_with_self ( is_name_required) ?;
878882 let sig = MethodSig { header, decl } ;
879883 generics. where_clause = self . parse_where_clause ( ) ?;
@@ -1251,20 +1255,22 @@ impl<'a> Parser<'a> {
12511255 }
12521256
12531257 /// 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 (
12551267 & 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 ) > {
12611270 let ( ident, mut generics) = self . parse_fn_header ( ) ?;
1262- let allow_c_variadic = abi == Abi :: C && unsafety == Unsafety :: Unsafe ;
12631271 let decl = self . parse_fn_decl ( allow_c_variadic) ?;
12641272 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) )
12681274 }
12691275
12701276 /// Parses the name and optional generic types of a function header.
@@ -1386,18 +1392,15 @@ impl<'a> Parser<'a> {
13861392 extern_sp : Span ,
13871393 ) -> PResult < ' a , ForeignItem > {
13881394 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 ) ;
13941397 self . parse_semi_or_incorrect_foreign_fn_body ( & ident, extern_sp) ?;
13951398 Ok ( ast:: ForeignItem {
13961399 ident,
13971400 attrs,
13981401 kind : ForeignItemKind :: Fn ( decl, generics) ,
13991402 id : DUMMY_NODE_ID ,
1400- span : lo . to ( hi ) ,
1403+ span,
14011404 vis,
14021405 } )
14031406 }
0 commit comments