extract parse_break_expr
This commit is contained in:
parent
a3c0ef1a8b
commit
e9a4d94c44
1 changed files with 16 additions and 10 deletions
|
@ -907,16 +907,7 @@ impl<'a> Parser<'a> {
|
||||||
if self.eat_keyword(kw::Return) {
|
if self.eat_keyword(kw::Return) {
|
||||||
return self.parse_return_expr(attrs);
|
return self.parse_return_expr(attrs);
|
||||||
} else if self.eat_keyword(kw::Break) {
|
} else if self.eat_keyword(kw::Break) {
|
||||||
let label = self.eat_label();
|
return self.parse_break_expr(attrs);
|
||||||
let e = if self.token.can_begin_expr()
|
|
||||||
&& !(self.token == token::OpenDelim(token::Brace)
|
|
||||||
&& self.restrictions.contains(
|
|
||||||
Restrictions::NO_STRUCT_LITERAL)) {
|
|
||||||
Some(self.parse_expr()?)
|
|
||||||
} else {
|
|
||||||
None
|
|
||||||
};
|
|
||||||
(self.prev_span, ExprKind::Break(label, e))
|
|
||||||
} else if self.eat_keyword(kw::Yield) {
|
} else if self.eat_keyword(kw::Yield) {
|
||||||
return self.parse_yield_expr(attrs);
|
return self.parse_yield_expr(attrs);
|
||||||
} else if self.eat_keyword(kw::Let) {
|
} else if self.eat_keyword(kw::Let) {
|
||||||
|
@ -1109,6 +1100,21 @@ impl<'a> Parser<'a> {
|
||||||
self.maybe_recover_from_bad_qpath(expr, true)
|
self.maybe_recover_from_bad_qpath(expr, true)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Parse `"('label ":")? break expr?`.
|
||||||
|
fn parse_break_expr(&mut self, attrs: ThinVec<Attribute>) -> PResult<'a, P<Expr>> {
|
||||||
|
let lo = self.prev_span;
|
||||||
|
let label = self.eat_label();
|
||||||
|
let kind = if self.token != token::OpenDelim(token::Brace)
|
||||||
|
|| !self.restrictions.contains(Restrictions::NO_STRUCT_LITERAL)
|
||||||
|
{
|
||||||
|
self.parse_expr_opt()?
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
};
|
||||||
|
let expr = self.mk_expr(lo.to(self.prev_span), ExprKind::Break(label, kind), attrs);
|
||||||
|
self.maybe_recover_from_bad_qpath(expr, true)
|
||||||
|
}
|
||||||
|
|
||||||
/// Parse `"yield" expr?`.
|
/// Parse `"yield" expr?`.
|
||||||
fn parse_yield_expr(&mut self, attrs: ThinVec<Attribute>) -> PResult<'a, P<Expr>> {
|
fn parse_yield_expr(&mut self, attrs: ThinVec<Attribute>) -> PResult<'a, P<Expr>> {
|
||||||
let lo = self.prev_span;
|
let lo = self.prev_span;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue