parser/expr: Don't next() the precedences in bind; it makes everything less readable.

This commit is contained in:
2025-11-02 00:37:28 -04:00
parent 6c4c58dc2e
commit 30871013cd

View File

@@ -499,18 +499,15 @@ fn parse_for(p: &mut Parser<'_>, _level: ()) -> PResult<Expr> {
/// Returns the [BindOp], [pattern precedence](PPrec), [arrow TKind](TKind), [body precedence](Prec),
/// and [else precedence](Prec), (if applicable,) which controls the parsing of Bind expressions.
///
/// The returned expression [Prec]edences are expected to be [`Prec::next`]ed, so they may
/// be one level of precedence lower than would be intuitive (i.e. [Prec::Assign] instead of [Prec::Tuple])
#[rustfmt::skip]
#[allow(clippy::type_complexity)]
fn from_bind(p: &mut Parser<'_>) -> PResult<(BindOp, PPrec, Option<TKind>, Option<Prec>, Option<Prec>)> {
let bk = match p.peek()?.kind {
// Token Operator Pat prec Body Token Body prec Else prec
TKind::Let => (BindOp::Let, PPrec::Tuple, Some(TKind::Eq), Some(Prec::Assign), Some(Prec::Body)),
TKind::Const => (BindOp::Const, PPrec::Tuple, Some(TKind::Eq), Some(Prec::Assign), None),
TKind::Static => (BindOp::Static, PPrec::Tuple, Some(TKind::Eq), Some(Prec::Assign), None),
TKind::Type => (BindOp::Type, PPrec::Tuple, Some(TKind::Eq), Some(Prec::Project), None),
TKind::Let => (BindOp::Let, PPrec::Tuple, Some(TKind::Eq), Some(Prec::Tuple), Some(Prec::Body)),
TKind::Const => (BindOp::Const, PPrec::Tuple, Some(TKind::Eq), Some(Prec::Tuple), None),
TKind::Static => (BindOp::Static, PPrec::Tuple, Some(TKind::Eq), Some(Prec::Tuple), None),
TKind::Type => (BindOp::Type, PPrec::Tuple, Some(TKind::Eq), Some(Prec::Extend), None),
TKind::Struct => (BindOp::Struct, PPrec::Tuple, None, None, None),
TKind::Enum => (BindOp::Enum, PPrec::Tuple, None, None, None),
TKind::Fn => (BindOp::Fn, PPrec::Fn, None, Some(Prec::Body), None),
@@ -559,7 +556,7 @@ impl<'t> Parse<'t> for Bind {
}
// `=` Expr
let body = p.parse(bodyp.next())?;
let body = p.parse(bodyp.value())?;
let Some(failp) = failp else {
return Ok(Self(level, generics, pat, vec![body]));
@@ -573,7 +570,7 @@ impl<'t> Parse<'t> for Bind {
return Ok(Self(level, generics, pat, vec![body]));
}
let fail = p.parse(failp.next())?;
let fail = p.parse(failp.value())?;
Ok(Self(level, generics, pat, vec![body, fail]))
}