From a85d0d6fcedb703c65f2dd2f86cfe5695b2395ce Mon Sep 17 00:00:00 2001
From: Roland Kovacs <zen3ger@gmail.com>
Date: Sun, 13 Jan 2019 15:43:57 +0100
Subject: [PATCH] Remove comma from method syntax

---
 src/lib/parser/shell_expand/mod.rs         |  2 +-
 src/lib/parser/shell_expand/words/mod.rs   | 14 ++++++++++++--
 src/lib/parser/shell_expand/words/tests.rs |  2 +-
 3 files changed, 14 insertions(+), 4 deletions(-)

diff --git a/src/lib/parser/shell_expand/mod.rs b/src/lib/parser/shell_expand/mod.rs
index 2104d20d..71bdab10 100644
--- a/src/lib/parser/shell_expand/mod.rs
+++ b/src/lib/parser/shell_expand/mod.rs
@@ -904,7 +904,7 @@ mod test {
     fn inline_expression() {
         let cases = vec![
             (array!["5"], "$len([0 1 2 3 4])"),
-            (array!["FxOxO"], "$join(@chars(FOO), 'x')"),
+            (array!["FxOxO"], "$join(@chars('FOO') 'x')"),
         ];
         for (expected, input) in cases {
             assert_eq!(expected, expand_string(input, &VariableExpander, false));
diff --git a/src/lib/parser/shell_expand/words/mod.rs b/src/lib/parser/shell_expand/words/mod.rs
index 79d6cfc8..88f974cf 100644
--- a/src/lib/parser/shell_expand/words/mod.rs
+++ b/src/lib/parser/shell_expand/words/mod.rs
@@ -359,7 +359,12 @@ impl<'a, E: Expander + 'a> WordIterator<'a, E> {
                     let mut depth = 0;
                     while let Some(character) = iterator.next() {
                         match character {
-                            b',' if depth == 0 => {
+                            b'\'' => self.flags ^= Flags::SQUOTE,
+                            b'"' => self.flags ^= Flags::DQUOTE,
+                            b'[' if !self.flags.intersects(Flags::SQUOTE | Flags::DQUOTE) => depth += 1,
+                            b']' if !self.flags.intersects(Flags::SQUOTE | Flags::DQUOTE) => depth -= 1,
+                            b' ' if depth == 0
+                                && !self.flags.intersects(Flags::SQUOTE | Flags::DQUOTE) => {
                                 let variable = &self.data[start..self.read];
                                 self.read += 1;
                                 start = self.read;
@@ -486,7 +491,12 @@ impl<'a, E: Expander + 'a> WordIterator<'a, E> {
                     let mut depth = 0;
                     while let Some(character) = iterator.next() {
                         match character {
-                            b',' if depth == 0 => {
+                            b'\'' => self.flags ^= Flags::SQUOTE,
+                            b'"' => self.flags ^= Flags::DQUOTE,
+                            b'[' if !self.flags.intersects(Flags::SQUOTE | Flags::DQUOTE) => depth += 1,
+                            b']' if !self.flags.intersects(Flags::SQUOTE | Flags::DQUOTE) => depth -= 1,
+                            b' ' if depth == 0
+                                && !self.flags.intersects(Flags::SQUOTE | Flags::DQUOTE) => {
                                 let variable = &self.data[start..self.read];
                                 self.read += 1;
                                 start = self.read;
diff --git a/src/lib/parser/shell_expand/words/tests.rs b/src/lib/parser/shell_expand/words/tests.rs
index 1c74638c..723958e3 100644
--- a/src/lib/parser/shell_expand/words/tests.rs
+++ b/src/lib/parser/shell_expand/words/tests.rs
@@ -17,7 +17,7 @@ fn compare(input: &str, expected: Vec<WordToken>) {
 
 #[test]
 fn string_method() {
-    let input = "$join(array, 'pattern') $join(array, 'pattern')";
+    let input = "$join(array 'pattern') $join(array 'pattern')";
     let expected = vec![
         WordToken::StringMethod(StringMethod {
             method:    "join",
-- 
GitLab