Skip to content

Commit dc7ed30

Browse files
committed
Refactor out parse_struct_expr.
1 parent 1cf592f commit dc7ed30

File tree

1 file changed

+48
-45
lines changed

1 file changed

+48
-45
lines changed

src/libsyntax/parse/parser.rs

Lines changed: 48 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -2333,51 +2333,7 @@ impl<'a> Parser<'a> {
23332333
Restrictions::RESTRICTION_NO_STRUCT_LITERAL
23342334
);
23352335
if !prohibited {
2336-
// It's a struct literal.
2337-
self.bump();
2338-
let mut fields = Vec::new();
2339-
let mut base = None;
2340-
2341-
attrs.extend(self.parse_inner_attributes()?);
2342-
2343-
while self.token != token::CloseDelim(token::Brace) {
2344-
if self.eat(&token::DotDot) {
2345-
match self.parse_expr() {
2346-
Ok(e) => {
2347-
base = Some(e);
2348-
}
2349-
Err(mut e) => {
2350-
e.emit();
2351-
self.recover_stmt();
2352-
}
2353-
}
2354-
break;
2355-
}
2356-
2357-
match self.parse_field() {
2358-
Ok(f) => fields.push(f),
2359-
Err(mut e) => {
2360-
e.emit();
2361-
self.recover_stmt();
2362-
break;
2363-
}
2364-
}
2365-
2366-
match self.expect_one_of(&[token::Comma],
2367-
&[token::CloseDelim(token::Brace)]) {
2368-
Ok(()) => {}
2369-
Err(mut e) => {
2370-
e.emit();
2371-
self.recover_stmt();
2372-
break;
2373-
}
2374-
}
2375-
}
2376-
2377-
hi = self.span.hi;
2378-
self.expect(&token::CloseDelim(token::Brace))?;
2379-
ex = ExprKind::Struct(pth, fields, base);
2380-
return Ok(self.mk_expr(lo, hi, ex, attrs));
2336+
return self.parse_struct_expr(lo, pth, attrs);
23812337
}
23822338
}
23832339

@@ -2403,6 +2359,53 @@ impl<'a> Parser<'a> {
24032359
return Ok(self.mk_expr(lo, hi, ex, attrs));
24042360
}
24052361

2362+
fn parse_struct_expr(&mut self, lo: BytePos, pth: ast::Path, mut attrs: ThinVec<Attribute>)
2363+
-> PResult<'a, P<Expr>> {
2364+
self.bump();
2365+
let mut fields = Vec::new();
2366+
let mut base = None;
2367+
2368+
attrs.extend(self.parse_inner_attributes()?);
2369+
2370+
while self.token != token::CloseDelim(token::Brace) {
2371+
if self.eat(&token::DotDot) {
2372+
match self.parse_expr() {
2373+
Ok(e) => {
2374+
base = Some(e);
2375+
}
2376+
Err(mut e) => {
2377+
e.emit();
2378+
self.recover_stmt();
2379+
}
2380+
}
2381+
break;
2382+
}
2383+
2384+
match self.parse_field() {
2385+
Ok(f) => fields.push(f),
2386+
Err(mut e) => {
2387+
e.emit();
2388+
self.recover_stmt();
2389+
break;
2390+
}
2391+
}
2392+
2393+
match self.expect_one_of(&[token::Comma],
2394+
&[token::CloseDelim(token::Brace)]) {
2395+
Ok(()) => {}
2396+
Err(mut e) => {
2397+
e.emit();
2398+
self.recover_stmt();
2399+
break;
2400+
}
2401+
}
2402+
}
2403+
2404+
let hi = self.span.hi;
2405+
self.expect(&token::CloseDelim(token::Brace))?;
2406+
return Ok(self.mk_expr(lo, hi, ExprKind::Struct(pth, fields, base), attrs));
2407+
}
2408+
24062409
fn parse_or_use_outer_attributes(&mut self,
24072410
already_parsed_attrs: Option<ThinVec<Attribute>>)
24082411
-> PResult<'a, ThinVec<Attribute>> {

0 commit comments

Comments
 (0)