Rollup merge of #106846 - WaffleLapkin:pico_parse_ref, r=TaKO8Ki
Improve some comments and names in parser Just a tiny drive-by cleanup.
This commit is contained in:
commit
81da2a19fa
2 changed files with 25 additions and 15 deletions
|
@ -83,7 +83,7 @@ macro_rules! maybe_whole_expr {
|
||||||
pub(super) enum LhsExpr {
|
pub(super) enum LhsExpr {
|
||||||
NotYetParsed,
|
NotYetParsed,
|
||||||
AttributesParsed(AttrWrapper),
|
AttributesParsed(AttrWrapper),
|
||||||
AlreadyParsed(P<Expr>, bool), // (expr, starts_statement)
|
AlreadyParsed { expr: P<Expr>, starts_statement: bool },
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<Option<AttrWrapper>> for LhsExpr {
|
impl From<Option<AttrWrapper>> for LhsExpr {
|
||||||
|
@ -97,11 +97,11 @@ impl From<Option<AttrWrapper>> for LhsExpr {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<P<Expr>> for LhsExpr {
|
impl From<P<Expr>> for LhsExpr {
|
||||||
/// Converts the `expr: P<Expr>` into `LhsExpr::AlreadyParsed(expr)`.
|
/// Converts the `expr: P<Expr>` into `LhsExpr::AlreadyParsed { expr, starts_statement: false }`.
|
||||||
///
|
///
|
||||||
/// This conversion does not allocate.
|
/// This conversion does not allocate.
|
||||||
fn from(expr: P<Expr>) -> Self {
|
fn from(expr: P<Expr>) -> Self {
|
||||||
LhsExpr::AlreadyParsed(expr, false)
|
LhsExpr::AlreadyParsed { expr, starts_statement: false }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -174,7 +174,7 @@ impl<'a> Parser<'a> {
|
||||||
lhs: LhsExpr,
|
lhs: LhsExpr,
|
||||||
) -> PResult<'a, P<Expr>> {
|
) -> PResult<'a, P<Expr>> {
|
||||||
let mut starts_stmt = false;
|
let mut starts_stmt = false;
|
||||||
let mut lhs = if let LhsExpr::AlreadyParsed(expr, starts_statement) = lhs {
|
let mut lhs = if let LhsExpr::AlreadyParsed { expr, starts_statement } = lhs {
|
||||||
starts_stmt = starts_statement;
|
starts_stmt = starts_statement;
|
||||||
expr
|
expr
|
||||||
} else {
|
} else {
|
||||||
|
@ -562,17 +562,23 @@ impl<'a> Parser<'a> {
|
||||||
|
|
||||||
// Note: when adding new unary operators, don't forget to adjust TokenKind::can_begin_expr()
|
// Note: when adding new unary operators, don't forget to adjust TokenKind::can_begin_expr()
|
||||||
match this.token.uninterpolate().kind {
|
match this.token.uninterpolate().kind {
|
||||||
token::Not => make_it!(this, attrs, |this, _| this.parse_unary_expr(lo, UnOp::Not)), // `!expr`
|
// `!expr`
|
||||||
token::Tilde => make_it!(this, attrs, |this, _| this.recover_tilde_expr(lo)), // `~expr`
|
token::Not => make_it!(this, attrs, |this, _| this.parse_unary_expr(lo, UnOp::Not)),
|
||||||
|
// `~expr`
|
||||||
|
token::Tilde => make_it!(this, attrs, |this, _| this.recover_tilde_expr(lo)),
|
||||||
|
// `-expr`
|
||||||
token::BinOp(token::Minus) => {
|
token::BinOp(token::Minus) => {
|
||||||
make_it!(this, attrs, |this, _| this.parse_unary_expr(lo, UnOp::Neg))
|
make_it!(this, attrs, |this, _| this.parse_unary_expr(lo, UnOp::Neg))
|
||||||
} // `-expr`
|
}
|
||||||
|
// `*expr`
|
||||||
token::BinOp(token::Star) => {
|
token::BinOp(token::Star) => {
|
||||||
make_it!(this, attrs, |this, _| this.parse_unary_expr(lo, UnOp::Deref))
|
make_it!(this, attrs, |this, _| this.parse_unary_expr(lo, UnOp::Deref))
|
||||||
} // `*expr`
|
}
|
||||||
|
// `&expr` and `&&expr`
|
||||||
token::BinOp(token::And) | token::AndAnd => {
|
token::BinOp(token::And) | token::AndAnd => {
|
||||||
make_it!(this, attrs, |this, _| this.parse_borrow_expr(lo))
|
make_it!(this, attrs, |this, _| this.parse_borrow_expr(lo))
|
||||||
}
|
}
|
||||||
|
// `+lit`
|
||||||
token::BinOp(token::Plus) if this.look_ahead(1, |tok| tok.is_numeric_lit()) => {
|
token::BinOp(token::Plus) if this.look_ahead(1, |tok| tok.is_numeric_lit()) => {
|
||||||
let mut err =
|
let mut err =
|
||||||
LeadingPlusNotSupported { span: lo, remove_plus: None, add_parentheses: None };
|
LeadingPlusNotSupported { span: lo, remove_plus: None, add_parentheses: None };
|
||||||
|
@ -587,7 +593,7 @@ impl<'a> Parser<'a> {
|
||||||
|
|
||||||
this.bump();
|
this.bump();
|
||||||
this.parse_prefix_expr(None)
|
this.parse_prefix_expr(None)
|
||||||
} // `+expr`
|
}
|
||||||
// Recover from `++x`:
|
// Recover from `++x`:
|
||||||
token::BinOp(token::Plus)
|
token::BinOp(token::Plus)
|
||||||
if this.look_ahead(1, |t| *t == token::BinOp(token::Plus)) =>
|
if this.look_ahead(1, |t| *t == token::BinOp(token::Plus)) =>
|
||||||
|
@ -624,7 +630,7 @@ impl<'a> Parser<'a> {
|
||||||
Ok((span, self.mk_unary(op, expr)))
|
Ok((span, self.mk_unary(op, expr)))
|
||||||
}
|
}
|
||||||
|
|
||||||
// Recover on `!` suggesting for bitwise negation instead.
|
/// Recover on `~expr` in favor of `!expr`.
|
||||||
fn recover_tilde_expr(&mut self, lo: Span) -> PResult<'a, (Span, ExprKind)> {
|
fn recover_tilde_expr(&mut self, lo: Span) -> PResult<'a, (Span, ExprKind)> {
|
||||||
self.sess.emit_err(TildeAsUnaryOperator(lo));
|
self.sess.emit_err(TildeAsUnaryOperator(lo));
|
||||||
|
|
||||||
|
@ -651,7 +657,6 @@ impl<'a> Parser<'a> {
|
||||||
|
|
||||||
/// Recover on `not expr` in favor of `!expr`.
|
/// Recover on `not expr` in favor of `!expr`.
|
||||||
fn recover_not_expr(&mut self, lo: Span) -> PResult<'a, (Span, ExprKind)> {
|
fn recover_not_expr(&mut self, lo: Span) -> PResult<'a, (Span, ExprKind)> {
|
||||||
// Emit the error...
|
|
||||||
let negated_token = self.look_ahead(1, |t| t.clone());
|
let negated_token = self.look_ahead(1, |t| t.clone());
|
||||||
|
|
||||||
let sub_diag = if negated_token.is_numeric_lit() {
|
let sub_diag = if negated_token.is_numeric_lit() {
|
||||||
|
@ -672,7 +677,6 @@ impl<'a> Parser<'a> {
|
||||||
),
|
),
|
||||||
});
|
});
|
||||||
|
|
||||||
// ...and recover!
|
|
||||||
self.parse_unary_expr(lo, UnOp::Not)
|
self.parse_unary_expr(lo, UnOp::Not)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1593,7 +1597,7 @@ impl<'a> Parser<'a> {
|
||||||
vis.0
|
vis.0
|
||||||
};
|
};
|
||||||
|
|
||||||
// Suggestion involves adding a (as of time of writing this, unstable) labeled block.
|
// Suggestion involves adding a labeled block.
|
||||||
//
|
//
|
||||||
// If there are no breaks that may use this label, suggest removing the label and
|
// If there are no breaks that may use this label, suggest removing the label and
|
||||||
// recover to the unmodified expression.
|
// recover to the unmodified expression.
|
||||||
|
|
|
@ -164,7 +164,10 @@ impl<'a> Parser<'a> {
|
||||||
// Perform this outside of the `collect_tokens_trailing_token` closure,
|
// Perform this outside of the `collect_tokens_trailing_token` closure,
|
||||||
// since our outer attributes do not apply to this part of the expression
|
// since our outer attributes do not apply to this part of the expression
|
||||||
let expr = self.with_res(Restrictions::STMT_EXPR, |this| {
|
let expr = self.with_res(Restrictions::STMT_EXPR, |this| {
|
||||||
this.parse_assoc_expr_with(0, LhsExpr::AlreadyParsed(expr, true))
|
this.parse_assoc_expr_with(
|
||||||
|
0,
|
||||||
|
LhsExpr::AlreadyParsed { expr, starts_statement: true },
|
||||||
|
)
|
||||||
})?;
|
})?;
|
||||||
Ok(self.mk_stmt(lo.to(self.prev_token.span), StmtKind::Expr(expr)))
|
Ok(self.mk_stmt(lo.to(self.prev_token.span), StmtKind::Expr(expr)))
|
||||||
} else {
|
} else {
|
||||||
|
@ -198,7 +201,10 @@ impl<'a> Parser<'a> {
|
||||||
let e = self.mk_expr(lo.to(hi), ExprKind::MacCall(mac));
|
let e = self.mk_expr(lo.to(hi), ExprKind::MacCall(mac));
|
||||||
let e = self.maybe_recover_from_bad_qpath(e)?;
|
let e = self.maybe_recover_from_bad_qpath(e)?;
|
||||||
let e = self.parse_dot_or_call_expr_with(e, lo, attrs)?;
|
let e = self.parse_dot_or_call_expr_with(e, lo, attrs)?;
|
||||||
let e = self.parse_assoc_expr_with(0, LhsExpr::AlreadyParsed(e, false))?;
|
let e = self.parse_assoc_expr_with(
|
||||||
|
0,
|
||||||
|
LhsExpr::AlreadyParsed { expr: e, starts_statement: false },
|
||||||
|
)?;
|
||||||
StmtKind::Expr(e)
|
StmtKind::Expr(e)
|
||||||
};
|
};
|
||||||
Ok(self.mk_stmt(lo.to(hi), kind))
|
Ok(self.mk_stmt(lo.to(hi), kind))
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue