diff options
| -rw-r--r-- | src/parse/mod.rs | 2 | ||||
| -rw-r--r-- | src/parse/test.rs | 39 |
2 files changed, 39 insertions, 2 deletions
diff --git a/src/parse/mod.rs b/src/parse/mod.rs index 0df624f..a15ad84 100644 --- a/src/parse/mod.rs +++ b/src/parse/mod.rs @@ -648,7 +648,7 @@ impl Parse for ExpString { continue; } - if delim == b' ' && x == b'~' { + if delim == b' ' && x == b'~' && p.is_empty() && (!b.has() || b" /".contains(&b.peek())) { p.push(StringPart::Var(Var { name: VarName { name: b"HOME".to_vec(), diff --git a/src/parse/test.rs b/src/parse/test.rs index 4ae6341..eab24cc 100644 --- a/src/parse/test.rs +++ b/src/parse/test.rs @@ -12,7 +12,9 @@ fn parse_test(l: Ast<PreExpansion>, r: Ast<PreExpansion>) { r.cdisplay(&mut right).unwrap(); let left = String::from_utf8_lossy(&left); let right = String::from_utf8_lossy(&right); - panic!("parse equality error\nleft: {left}\nright: {right}") + if left != right { + panic!("parse equality error\nleft: {left}\nright: {right}") + } } } @@ -80,6 +82,41 @@ fn tilde() { } #[test] +fn tilde2() { + parse_test( + parse(b"echo ~/foo/bar"), + pipes([cmd([ + estr(b"echo"), + str([var(b"HOME"), plain(b"/foo/bar")]), + ])]), + ); +} + +#[test] +fn tilde3() { + parse_test( + parse(b"echo ~ "), + pipes([cmd([estr(b"echo"), str([var(b"HOME")])])]), + ); +} + +#[test] +fn tilde4() { + parse_test( + parse(b"echo ~'x'"), + pipes([cmd([estr(b"echo"), estr(b"~x")])]), + ); +} + +#[test] +fn tilde5() { + parse_test( + parse(b"echo ~$FOO"), + pipes([cmd([estr(b"echo"), str([plain(b"~"), var(b"FOO")])])]), + ); +} + +#[test] fn set_variable_in_fun() { parse_test( parse(b"fun setter { set x = 1 }"), |
