From feaa5f7004c24b44db768114064595da1703224f Mon Sep 17 00:00:00 2001 From: stratact <stratact1@gmail.com> Date: Sat, 2 Jun 2018 21:53:46 -0700 Subject: [PATCH] Fix #755 (#757) * Fix #755 * Add integration test for #755 * Add unit test --- examples/inner_expansions.ion | 6 ++++++ examples/inner_expansions.out | 6 ++++++ src/lib/parser/shell_expand/words/mod.rs | 11 +++++++++++ src/lib/parser/shell_expand/words/tests.rs | 16 ++++++++++++++++ 4 files changed, 39 insertions(+) create mode 100644 examples/inner_expansions.ion create mode 100644 examples/inner_expansions.out diff --git a/examples/inner_expansions.ion b/examples/inner_expansions.ion new file mode 100644 index 00000000..15267529 --- /dev/null +++ b/examples/inner_expansions.ion @@ -0,0 +1,6 @@ +echo $(let echo_array=[@(echo me myself I)]; echo @echo_array[0] @echo_array[1] @echo_array[2]) +echo $(let echo_array=[@(echo me myself I)]; echo @echo_array[0] @echo_array[2] @echo_array[1]) +echo $(let echo_array=[@(echo me myself I)]; echo @echo_array[1] @echo_array[2] @echo_array[0]) +echo $(let echo_array=[@(echo me myself I)]; echo @echo_array[1] @echo_array[0] @echo_array[2]) +echo $(let echo_array=[@(echo me myself I)]; echo @echo_array[2] @echo_array[1] @echo_array[0]) +echo $(let echo_array=[@(echo me myself I)]; echo @echo_array[2] @echo_array[0] @echo_array[1]) diff --git a/examples/inner_expansions.out b/examples/inner_expansions.out new file mode 100644 index 00000000..7ec61636 --- /dev/null +++ b/examples/inner_expansions.out @@ -0,0 +1,6 @@ +me myself I +me I myself +myself I me +myself me I +I myself me +I me myself diff --git a/src/lib/parser/shell_expand/words/mod.rs b/src/lib/parser/shell_expand/words/mod.rs index 993a7cbd..24d686ee 100644 --- a/src/lib/parser/shell_expand/words/mod.rs +++ b/src/lib/parser/shell_expand/words/mod.rs @@ -254,6 +254,17 @@ impl<'a, E: Expander + 'a> WordIterator<'a, E> { b'"' if !self.flags.contains(Flags::SQUOTE) => self.flags ^= Flags::DQUOTE, b'$' if !self.flags.contains(Flags::SQUOTE) => { if self.data.as_bytes()[self.read + 1] == b'(' { + // Pop out the '(' char + iterator.next(); + self.read += 1; + level += 1; + } + } + b'@' if !self.flags.contains(Flags::SQUOTE) => { + if self.data.as_bytes()[self.read + 1] == b'(' { + // Pop out the '(' char + iterator.next(); + self.read += 1; level += 1; } } diff --git a/src/lib/parser/shell_expand/words/tests.rs b/src/lib/parser/shell_expand/words/tests.rs index f47e7aa5..088e26b8 100644 --- a/src/lib/parser/shell_expand/words/tests.rs +++ b/src/lib/parser/shell_expand/words/tests.rs @@ -94,6 +94,22 @@ fn array_processes() { compare(input, expected); } +#[test] +fn array_process_within_string_process() { + compare( + "echo $(let free=[@(free -h)]; echo @free[6]@free[8]/@free[7])", + vec![ + WordToken::Normal("echo", false, false), + WordToken::Whitespace(" "), + WordToken::Process( + "let free=[@(free -h)]; echo @free[6]@free[8]/@free[7]", + false, + Select::All + ) + ] + ) +} + #[test] fn indexes() { let input = "@array[0..3] @array[0...3] @array[abc] @array[..3] @array[3..]"; -- GitLab