fix: collapse_toplevel

incorrect indexes and operation order (div before mult)

co-authored by electria
This commit is contained in:
Edeth-Baguette 2026-07-13 18:06:04 -07:00
commit 375d7eb95f

View file

@ -173,7 +173,7 @@ fn collapse_toplevel(nodes: &mut Vec<Node>, mut end: usize) {
_ => panic!("operator is missing an operand"), _ => panic!("operator is missing an operand"),
}; };
nodes.remove(operator); nodes.remove(start + operator);
end -= 1; end -= 1;
} }
while let Some(operator) = nodes[start..end] while let Some(operator) = nodes[start..end]
@ -185,7 +185,7 @@ fn collapse_toplevel(nodes: &mut Vec<Node>, mut end: usize) {
_ => panic!("operator is missing an operand"), _ => panic!("operator is missing an operand"),
}; };
nodes.remove(operator); nodes.remove(start + operator);
end -= 1; end -= 1;
} }
@ -204,31 +204,10 @@ fn collapse_toplevel(nodes: &mut Vec<Node>, mut end: usize) {
let number = lhs.pow(rhs).complete(PREC); let number = lhs.pow(rhs).complete(PREC);
nodes.remove(operator - 1); nodes.remove(start + operator - 1);
nodes.remove(operator - 1); nodes.remove(start + operator - 1);
end -= 2; end -= 2;
nodes[operator - 1] = Node::Number(number); nodes[start + operator - 1] = Node::Number(number);
}
while let Some(operator) = nodes[start..end]
.iter()
.position(|n| *n == Node::Operator(Operator::Mult))
{
let lhs = match &nodes[start..end][operator - 1] {
Node::Number(n) => n,
_ => panic!("operator is missing an operand"),
};
let rhs = match &nodes[start..end][operator + 1] {
Node::Number(n) => n,
_ => panic!("operator is missing an operand"),
};
let number = (lhs * rhs).complete(PREC);
nodes.remove(operator - 1);
nodes.remove(operator - 1);
end -= 2;
nodes[operator - 1] = Node::Number(number);
} }
while let Some(operator) = nodes[start..end] while let Some(operator) = nodes[start..end]
@ -246,10 +225,31 @@ fn collapse_toplevel(nodes: &mut Vec<Node>, mut end: usize) {
let number = (lhs / rhs).complete(PREC); let number = (lhs / rhs).complete(PREC);
nodes.remove(operator - 1); nodes.remove(start + operator - 1);
nodes.remove(operator - 1); nodes.remove(start + operator - 1);
end -= 2; end -= 2;
nodes[operator - 1] = Node::Number(number); nodes[start + operator - 1] = Node::Number(number);
}
while let Some(operator) = nodes[start..end]
.iter()
.position(|n| *n == Node::Operator(Operator::Mult))
{
let lhs = match &nodes[start..end][operator - 1] {
Node::Number(n) => n,
_ => panic!("operator is missing an operand"),
};
let rhs = match &nodes[start..end][operator + 1] {
Node::Number(n) => n,
_ => panic!("operator is missing an operand"),
};
let number = (lhs * rhs).complete(PREC);
nodes.remove(start + operator - 1);
nodes.remove(start + operator - 1);
end -= 2;
nodes[start + operator - 1] = Node::Number(number);
} }
while let Some(operator) = nodes[start..end] while let Some(operator) = nodes[start..end]
@ -267,10 +267,10 @@ fn collapse_toplevel(nodes: &mut Vec<Node>, mut end: usize) {
let number = (lhs + rhs).complete(PREC); let number = (lhs + rhs).complete(PREC);
nodes.remove(operator - 1); nodes.remove(start + operator - 1);
nodes.remove(operator - 1); nodes.remove(start + operator - 1);
end -= 2; end -= 2;
nodes[operator - 1] = Node::Number(number); nodes[start + operator - 1] = Node::Number(number);
} }
while let Some(operator) = nodes[start..end] while let Some(operator) = nodes[start..end]
@ -288,10 +288,10 @@ fn collapse_toplevel(nodes: &mut Vec<Node>, mut end: usize) {
let number = (lhs - rhs).complete(PREC); let number = (lhs - rhs).complete(PREC);
nodes.remove(operator - 1); nodes.remove(start + operator - 1);
nodes.remove(operator - 1); nodes.remove(start + operator - 1);
end -= 2; end -= 2;
nodes[operator - 1] = Node::Number(number); nodes[start + operator - 1] = Node::Number(number);
} }
if nodes.len() > 1 { if nodes.len() > 1 {