From 9bf81463f5ea9810602609485a85673c1d9b6057 Mon Sep 17 00:00:00 2001 From: Ali Mohammad Pur Date: Tue, 14 Dec 2021 17:24:53 +0330 Subject: [PATCH] Shell: Don't skip over the first brace expansion entry if it's empty Previously we were simply ignoring the empty entry in '{,x}', making it resolve to a list with a single element '(x)', this commit makes that work as expected and resolve to '("" x)'. --- Userland/Shell/Parser.cpp | 38 ++++++++++++++++++++++---------------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/Userland/Shell/Parser.cpp b/Userland/Shell/Parser.cpp index 2aea756487..e70fe6ea6d 100644 --- a/Userland/Shell/Parser.cpp +++ b/Userland/Shell/Parser.cpp @@ -1919,23 +1919,29 @@ RefPtr Parser::parse_brace_expansion_spec() m_extra_chars_not_allowed_in_barewords.append(','); auto rule_start = push_start(); - auto start_expr = parse_expression(); - if (start_expr) { - if (expect("..")) { - if (auto end_expr = parse_expression()) { - if (end_expr->position().start_offset != start_expr->position().end_offset + 2) - end_expr->set_is_syntax_error(create("Expected no whitespace between '..' and the following expression in brace expansion")); - - return create(start_expr.release_nonnull(), end_expr.release_nonnull()); - } - - return create(start_expr.release_nonnull(), create("Expected an expression to end range brace expansion with", true)); - } - } - NonnullRefPtrVector subexpressions; - if (start_expr) - subexpressions.append(start_expr.release_nonnull()); + + if (next_is(",")) { + // Note that we don't consume the ',' here. + subexpressions.append(create("")); + } else { + auto start_expr = parse_expression(); + if (start_expr) { + if (expect("..")) { + if (auto end_expr = parse_expression()) { + if (end_expr->position().start_offset != start_expr->position().end_offset + 2) + end_expr->set_is_syntax_error(create("Expected no whitespace between '..' and the following expression in brace expansion")); + + return create(start_expr.release_nonnull(), end_expr.release_nonnull()); + } + + return create(start_expr.release_nonnull(), create("Expected an expression to end range brace expansion with", true)); + } + } + + if (start_expr) + subexpressions.append(start_expr.release_nonnull()); + } while (expect(',')) { auto expr = parse_expression();