Skip to content

Commit c54c9ef

Browse files
committed
parser: early return for item stmt
1 parent 690815b commit c54c9ef

File tree

1 file changed

+39
-40
lines changed

1 file changed

+39
-40
lines changed

src/librustc_parse/parser/stmt.rs

Lines changed: 39 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -84,51 +84,50 @@ impl<'a> Parser<'a> {
8484
let item = self.parse_item_(attrs.clone(), false, true)?;
8585
self.directory.ownership = old_directory_ownership;
8686

87-
match item {
88-
Some(i) => self.mk_stmt(lo.to(i.span), StmtKind::Item(i)),
89-
None => {
90-
let unused_attrs = |attrs: &[Attribute], s: &mut Self| {
91-
if !attrs.is_empty() {
92-
if s.prev_token_kind == PrevTokenKind::DocComment {
93-
s.span_fatal_err(s.prev_span, Error::UselessDocComment).emit();
94-
} else if attrs.iter().any(|a| a.style == AttrStyle::Outer) {
95-
s.span_err(
96-
s.token.span, "expected statement after outer attribute"
97-
);
98-
}
99-
}
100-
};
101-
102-
// Do not attempt to parse an expression if we're done here.
103-
if self.token == token::Semi {
104-
unused_attrs(&attrs, self);
105-
self.bump();
106-
let mut last_semi = lo;
107-
while self.token == token::Semi {
108-
last_semi = self.token.span;
109-
self.bump();
110-
}
111-
// We are encoding a string of semicolons as an
112-
// an empty tuple that spans the excess semicolons
113-
// to preserve this info until the lint stage
114-
let kind = StmtKind::Semi(self.mk_expr(
115-
lo.to(last_semi),
116-
ExprKind::Tup(Vec::new()),
117-
ThinVec::new()
118-
));
119-
return Ok(Some(self.mk_stmt(lo.to(last_semi), kind)));
120-
}
87+
if let Some(item) = item {
88+
return Ok(Some(self.mk_stmt(lo.to(item.span), StmtKind::Item(item))));
89+
}
12190

122-
if self.token == token::CloseDelim(token::Brace) {
123-
unused_attrs(&attrs, self);
124-
return Ok(None);
91+
let unused_attrs = |attrs: &[Attribute], s: &mut Self| {
92+
if !attrs.is_empty() {
93+
if s.prev_token_kind == PrevTokenKind::DocComment {
94+
s.span_fatal_err(s.prev_span, Error::UselessDocComment).emit();
95+
} else if attrs.iter().any(|a| a.style == AttrStyle::Outer) {
96+
s.span_err(
97+
s.token.span, "expected statement after outer attribute"
98+
);
12599
}
100+
}
101+
};
126102

127-
// Remainder are line-expr stmts.
128-
let e = self.parse_expr_res( Restrictions::STMT_EXPR, Some(attrs.into()))?;
129-
self.mk_stmt(lo.to(e.span), StmtKind::Expr(e))
103+
// Do not attempt to parse an expression if we're done here.
104+
if self.token == token::Semi {
105+
unused_attrs(&attrs, self);
106+
self.bump();
107+
let mut last_semi = lo;
108+
while self.token == token::Semi {
109+
last_semi = self.token.span;
110+
self.bump();
130111
}
112+
// We are encoding a string of semicolons as an
113+
// an empty tuple that spans the excess semicolons
114+
// to preserve this info until the lint stage
115+
let kind = StmtKind::Semi(self.mk_expr(
116+
lo.to(last_semi),
117+
ExprKind::Tup(Vec::new()),
118+
ThinVec::new()
119+
));
120+
return Ok(Some(self.mk_stmt(lo.to(last_semi), kind)));
121+
}
122+
123+
if self.token == token::CloseDelim(token::Brace) {
124+
unused_attrs(&attrs, self);
125+
return Ok(None);
131126
}
127+
128+
// Remainder are line-expr stmts.
129+
let e = self.parse_expr_res( Restrictions::STMT_EXPR, Some(attrs.into()))?;
130+
self.mk_stmt(lo.to(e.span), StmtKind::Expr(e))
132131
}))
133132
}
134133

0 commit comments

Comments
 (0)