aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/parse/mod.rs2
-rw-r--r--src/parse/test.rs39
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 }"),