Skip to content

Commit

Permalink
Merge pull request #1640 from dtolnay/binoprhs
Browse files Browse the repository at this point in the history
Factor out binop right-hand-side parsing
  • Loading branch information
dtolnay committed May 11, 2024
2 parents 05665c9 + dfed804 commit 3ebe8be
Showing 1 changed file with 30 additions and 36 deletions.
66 changes: 30 additions & 36 deletions src/expr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1397,15 +1397,7 @@ pub(crate) mod parsing {
break;
}
input.advance_to(&ahead);
let mut rhs = unary_expr(input, allow_struct)?;
loop {
let next = peek_precedence(input);
if next > precedence || next == precedence && precedence == Precedence::Assign {
rhs = parse_expr(input, rhs, allow_struct, next)?;
} else {
break;
}
}
let rhs = parse_binop_rhs(input, allow_struct, precedence)?;
lhs = Expr::Binary(ExprBinary {
attrs: Vec::new(),
left: Box::new(lhs),
Expand All @@ -1415,15 +1407,7 @@ pub(crate) mod parsing {
} else if Precedence::Assign >= base && input.peek(Token![=]) && !input.peek(Token![=>])
{
let eq_token: Token![=] = input.parse()?;
let mut rhs = unary_expr(input, allow_struct)?;
loop {
let next = peek_precedence(input);
if next >= Precedence::Assign {
rhs = parse_expr(input, rhs, allow_struct, next)?;
} else {
break;
}
}
let rhs = parse_binop_rhs(input, allow_struct, Precedence::Assign)?;
lhs = Expr::Assign(ExprAssign {
attrs: Vec::new(),
left: Box::new(lhs),
Expand All @@ -1441,15 +1425,7 @@ pub(crate) mod parsing {
{
None
} else {
let mut rhs = unary_expr(input, allow_struct)?;
loop {
let next = peek_precedence(input);
if next > Precedence::Range {
rhs = parse_expr(input, rhs, allow_struct, next)?;
} else {
break;
}
}
let rhs = parse_binop_rhs(input, allow_struct, Precedence::Range)?;
Some(rhs)
};
lhs = Expr::Range(ExprRange {
Expand Down Expand Up @@ -1487,15 +1463,7 @@ pub(crate) mod parsing {
break;
}
input.advance_to(&ahead);
let mut rhs = unary_expr(input)?;
loop {
let next = peek_precedence(input);
if next > precedence || next == precedence && precedence == Precedence::Assign {
rhs = parse_expr(input, rhs, next)?;
} else {
break;
}
}
let rhs = parse_binop_rhs(input, precedence)?;
lhs = Expr::Binary(ExprBinary {
attrs: Vec::new(),
left: Box::new(lhs),
Expand All @@ -1521,6 +1489,32 @@ pub(crate) mod parsing {
Ok(lhs)
}

fn parse_binop_rhs(
input: ParseStream,
#[cfg(feature = "full")] allow_struct: AllowStruct,
precedence: Precedence,
) -> Result<Expr> {
let mut rhs = unary_expr(
input,
#[cfg(feature = "full")]
allow_struct,
)?;
loop {
let next = peek_precedence(input);
if next > precedence || next == precedence && precedence == Precedence::Assign {
rhs = parse_expr(
input,
rhs,
#[cfg(feature = "full")]
allow_struct,
next,
)?;
} else {
return Ok(rhs);
}
}
}

fn peek_precedence(input: ParseStream) -> Precedence {
if let Ok(op) = input.fork().parse() {
Precedence::of(&op)
Expand Down

0 comments on commit 3ebe8be

Please sign in to comment.