mirror of
https://github.com/storytold/figcraft.git
synced 2026-10-24 10:27:00 -06:00
Merge #1041: Keep not <var> from reading back as a variable named 'not
' (@Silvertree2010)
This commit is contained in:
@@ -169,7 +169,12 @@ impl Expr {
|
||||
})
|
||||
.collect();
|
||||
match (op, parts.as_slice()) {
|
||||
(ExprOp::Not, [x]) => format!("not {x}"),
|
||||
// `not done` reads as a variable named "not done" if there is one: then
|
||||
// `not (done)`.
|
||||
(ExprOp::Not, [x]) => {
|
||||
let bare = format!("not {x}");
|
||||
if x.starts_with('(') || Expr::parse(&bare, vars).is_ok_and(|e| e == *self) { bare } else { format!("not ({x})") }
|
||||
}
|
||||
(ExprOp::Negate, [x]) => format!("-{x}"),
|
||||
_ => parts.join(&format!(" {} ", op.symbol())),
|
||||
}
|
||||
|
||||
@@ -195,3 +195,27 @@ fn names_that_look_like_literals_read_back_as_variables() {
|
||||
assert_eq!(parse("1"), n(1.0));
|
||||
assert_eq!(parse("\"q\""), Expr::Value(VariableValue::String("q".into())));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn not_of_a_variable_reads_back_when_a_name_starts_with_not() {
|
||||
use ExprOp::*;
|
||||
let mut v = vars();
|
||||
let b = v.variables.iter().find(|x| x.id == "b").unwrap().clone();
|
||||
for (id, name) in [("done", "done"), ("nd", "not done")] {
|
||||
let mut x = b.clone();
|
||||
x.id = id.into();
|
||||
x.name = name.into();
|
||||
v.variables.push(x);
|
||||
}
|
||||
let not_done = Expr::op(Not, vec![Expr::var("done")]);
|
||||
for e in [
|
||||
not_done.clone(),
|
||||
Expr::op(And, vec![Expr::var("b"), not_done.clone()]),
|
||||
Expr::op(Equals, vec![not_done.clone(), Expr::Value(VariableValue::Boolean(true))]),
|
||||
Expr::op(Not, vec![not_done.clone()]),
|
||||
] {
|
||||
let shown = e.display(&v);
|
||||
assert_eq!(Expr::parse(&shown, &v), Ok(e.clone()), "shown as {shown:?}");
|
||||
}
|
||||
assert_eq!(Expr::op(Not, vec![Expr::var("b")]).display(&vars()), "not b-name", "plain names stay bare");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user