Skip to content

Commit 151ce96

Browse files
committed
syntax: reduce repetition in fn parsing.
1 parent bea404f commit 151ce96

File tree

1 file changed

+21
-26
lines changed

1 file changed

+21
-26
lines changed

src/libsyntax/parse/parser/item.rs

Lines changed: 21 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -122,15 +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 (ident, item_, extra_attrs) = self.parse_item_fn(FnHeader {
125+
return self.parse_item_fn(lo, visibility, attrs, FnHeader {
126126
unsafety: Unsafety::Normal,
127127
asyncness: respan(fn_span, IsAsync::NotAsync),
128128
constness: respan(fn_span, Constness::NotConst),
129129
abi: opt_abi.unwrap_or(Abi::C),
130-
})?;
131-
let span = lo.to(self.prev_span);
132-
let attrs = maybe_append(attrs, extra_attrs);
133-
return Ok(Some(self.mk_item(span, ident, item_, visibility, attrs)));
130+
});
134131
} else if self.check(&token::OpenDelim(token::Brace)) {
135132
return Ok(Some(
136133
self.parse_item_foreign_mod(lo, opt_abi, visibility, attrs, extern_sp)?,
@@ -157,15 +154,12 @@ impl<'a> Parser<'a> {
157154
// CONST FUNCTION ITEM
158155
let unsafety = self.parse_unsafety();
159156
self.bump();
160-
let (ident, item_, extra_attrs) = self.parse_item_fn(FnHeader {
157+
return self.parse_item_fn(lo, visibility, attrs, FnHeader {
161158
unsafety,
162159
asyncness: respan(const_span, IsAsync::NotAsync),
163160
constness: respan(const_span, Constness::Const),
164161
abi: Abi::Rust,
165-
})?;
166-
let span = lo.to(self.prev_span);
167-
let attrs = maybe_append(attrs, extra_attrs);
168-
return Ok(Some(self.mk_item(span, ident, item_, visibility, attrs)));
162+
});
169163
}
170164

171165
// CONST ITEM
@@ -202,16 +196,14 @@ impl<'a> Parser<'a> {
202196
closure_id: DUMMY_NODE_ID,
203197
return_impl_trait_id: DUMMY_NODE_ID,
204198
});
205-
let (ident, item_, extra_attrs) = self.parse_item_fn(FnHeader {
199+
let item = self.parse_item_fn(lo, visibility, attrs, FnHeader {
206200
unsafety,
207201
asyncness,
208202
constness: respan(fn_span, Constness::NotConst),
209203
abi: Abi::Rust,
210204
})?;
211205
self.ban_async_in_2015(async_span);
212-
let span = lo.to(self.prev_span);
213-
let attrs = maybe_append(attrs, extra_attrs);
214-
return Ok(Some(self.mk_item(span, ident, item_, visibility, attrs)));
206+
return Ok(item);
215207
}
216208
}
217209
if self.check_keyword(kw::Unsafe) &&
@@ -249,15 +241,12 @@ impl<'a> Parser<'a> {
249241
// FUNCTION ITEM
250242
self.bump();
251243
let fn_span = self.prev_span;
252-
let (ident, item_, extra_attrs) = self.parse_item_fn(FnHeader {
244+
return self.parse_item_fn(lo, visibility, attrs, FnHeader {
253245
unsafety: Unsafety::Normal,
254246
asyncness: respan(fn_span, IsAsync::NotAsync),
255247
constness: respan(fn_span, Constness::NotConst),
256248
abi: Abi::Rust,
257-
})?;
258-
let span = lo.to(self.prev_span);
259-
let attrs = maybe_append(attrs, extra_attrs);
260-
return Ok(Some(self.mk_item(span, ident, item_, visibility, attrs)));
249+
});
261250
}
262251
if self.check_keyword(kw::Unsafe)
263252
&& self.look_ahead(1, |t| *t != token::OpenDelim(token::Brace)) {
@@ -272,15 +261,12 @@ impl<'a> Parser<'a> {
272261
};
273262
self.expect_keyword(kw::Fn)?;
274263
let fn_span = self.prev_span;
275-
let (ident, item_, extra_attrs) = self.parse_item_fn(FnHeader {
264+
return self.parse_item_fn(lo, visibility, attrs, FnHeader {
276265
unsafety: Unsafety::Unsafe,
277266
asyncness: respan(fn_span, IsAsync::NotAsync),
278267
constness: respan(fn_span, Constness::NotConst),
279268
abi,
280-
})?;
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)));
269+
});
284270
}
285271
if self.eat_keyword(kw::Mod) {
286272
// MODULE ITEM
@@ -1195,11 +1181,20 @@ impl<'a> Parser<'a> {
11951181
}
11961182

11971183
/// Parses an item-position function declaration.
1198-
fn parse_item_fn(&mut self, header: FnHeader) -> PResult<'a, ItemInfo> {
1184+
fn parse_item_fn(
1185+
&mut self,
1186+
lo: Span,
1187+
vis: Visibility,
1188+
attrs: Vec<Attribute>,
1189+
header: FnHeader,
1190+
) -> PResult<'a, Option<P<Item>>> {
11991191
let allow_c_variadic = header.abi == Abi::C && header.unsafety == Unsafety::Unsafe;
12001192
let (ident, decl, generics) = self.parse_fn_sig(allow_c_variadic)?;
12011193
let (inner_attrs, body) = self.parse_inner_attrs_and_block()?;
1202-
Ok((ident, ItemKind::Fn(decl, header, generics, body), Some(inner_attrs)))
1194+
let span = lo.to(self.prev_span);
1195+
let kind = ItemKind::Fn(decl, header, generics, body);
1196+
let attrs = maybe_append(attrs, Some(inner_attrs));
1197+
Ok(Some(self.mk_item(span, ident, kind, vis, attrs)))
12031198
}
12041199

12051200
/// Parse the "signature", including the identifier, parameters, and generics of a function.

0 commit comments

Comments
 (0)