Skip to content

Commit 258e86a

Browse files
committed
syntax: fuse more code paths together.
1 parent 573a8d8 commit 258e86a

File tree

1 file changed

+51
-48
lines changed

1 file changed

+51
-48
lines changed

src/libsyntax/parse/parser/item.rs

Lines changed: 51 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ use crate::parse::token;
1818
use crate::parse::parser::maybe_append;
1919
use crate::parse::diagnostics::Error;
2020
use crate::tokenstream::{TokenTree, TokenStream};
21-
use crate::source_map::{respan, Span, Spanned};
21+
use crate::source_map::{respan, Span};
2222
use crate::symbol::{kw, sym};
2323

2424
use 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

Comments
 (0)