Remove From impls for LhsExpr.

The `Option<AttrWrapper>` one maps to the first two variants, and the
`P<Expr>` one maps to the third. Weird. The code is shorter and clearer
without them.
This commit is contained in:
Nicholas Nethercote 2024-06-18 20:21:05 +10:00
parent 1c28229ada
commit 42e47dfe82
2 changed files with 10 additions and 25 deletions

View File

@ -75,25 +75,6 @@ pub(super) enum LhsExpr {
AlreadyParsed { expr: P<Expr>, starts_statement: bool }, AlreadyParsed { expr: P<Expr>, starts_statement: bool },
} }
impl From<Option<AttrWrapper>> for LhsExpr {
/// Converts `Some(attrs)` into `LhsExpr::AttributesParsed(attrs)`
/// and `None` into `LhsExpr::NotYetParsed`.
///
/// This conversion does not allocate.
fn from(o: Option<AttrWrapper>) -> Self {
if let Some(attrs) = o { LhsExpr::AttributesParsed(attrs) } else { LhsExpr::NotYetParsed }
}
}
impl From<P<Expr>> for LhsExpr {
/// Converts the `expr: P<Expr>` into `LhsExpr::AlreadyParsed { expr, starts_statement: false }`.
///
/// This conversion does not allocate.
fn from(expr: P<Expr>) -> Self {
LhsExpr::AlreadyParsed { expr, starts_statement: false }
}
}
#[derive(Debug)] #[derive(Debug)]
enum DestructuredFloat { enum DestructuredFloat {
/// 1e2 /// 1e2
@ -166,7 +147,11 @@ impl<'a> Parser<'a> {
&mut self, &mut self,
already_parsed_attrs: Option<AttrWrapper>, already_parsed_attrs: Option<AttrWrapper>,
) -> PResult<'a, P<Expr>> { ) -> PResult<'a, P<Expr>> {
self.parse_expr_assoc_with(0, already_parsed_attrs.into()) let lhs = match already_parsed_attrs {
Some(attrs) => LhsExpr::AttributesParsed(attrs),
None => LhsExpr::NotYetParsed,
};
self.parse_expr_assoc_with(0, lhs)
} }
/// Parses an associative expression with operators of at least `min_prec` precedence. /// Parses an associative expression with operators of at least `min_prec` precedence.
@ -2660,7 +2645,8 @@ impl<'a> Parser<'a> {
} else { } else {
self.expect(&token::Eq)?; self.expect(&token::Eq)?;
} }
let expr = self.parse_expr_assoc_with(1 + prec_let_scrutinee_needs_par(), None.into())?; let expr =
self.parse_expr_assoc_with(1 + prec_let_scrutinee_needs_par(), LhsExpr::NotYetParsed)?;
let span = lo.to(expr.span); let span = lo.to(expr.span);
Ok(self.mk_expr(span, ExprKind::Let(pat, expr, span, recovered))) Ok(self.mk_expr(span, ExprKind::Let(pat, expr, span, recovered)))
} }

View File

@ -10,7 +10,7 @@ use crate::errors::{
UnexpectedParenInRangePatSugg, UnexpectedVertVertBeforeFunctionParam, UnexpectedParenInRangePatSugg, UnexpectedVertVertBeforeFunctionParam,
UnexpectedVertVertInPattern, UnexpectedVertVertInPattern,
}; };
use crate::parser::expr::could_be_unclosed_char_literal; use crate::parser::expr::{could_be_unclosed_char_literal, LhsExpr};
use crate::{maybe_recover_from_interpolated_ty_qpath, maybe_whole}; use crate::{maybe_recover_from_interpolated_ty_qpath, maybe_whole};
use rustc_ast::mut_visit::{noop_visit_pat, MutVisitor}; use rustc_ast::mut_visit::{noop_visit_pat, MutVisitor};
use rustc_ast::ptr::P; use rustc_ast::ptr::P;
@ -398,9 +398,8 @@ impl<'a> Parser<'a> {
// Parse an associative expression such as `+ expr`, `% expr`, ... // Parse an associative expression such as `+ expr`, `% expr`, ...
// Assignements, ranges and `|` are disabled by [`Restrictions::IS_PAT`]. // Assignements, ranges and `|` are disabled by [`Restrictions::IS_PAT`].
if let Ok(expr) = let lhs = LhsExpr::AlreadyParsed { expr, starts_statement: false };
snapshot.parse_expr_assoc_with(0, expr.into()).map_err(|err| err.cancel()) if let Ok(expr) = snapshot.parse_expr_assoc_with(0, lhs).map_err(|err| err.cancel()) {
{
// We got a valid expression. // We got a valid expression.
self.restore_snapshot(snapshot); self.restore_snapshot(snapshot);
self.restrictions.remove(Restrictions::IS_PAT); self.restrictions.remove(Restrictions::IS_PAT);