diff --git a/Userland/Shell/Parser.cpp b/Userland/Shell/Parser.cpp index 468f43288f..f5b6f7a5e7 100644 --- a/Userland/Shell/Parser.cpp +++ b/Userland/Shell/Parser.cpp @@ -718,19 +718,23 @@ RefPtr Parser::parse_if_expr() return body; }; - consume_while(is_whitespace); + consume_while(is_any_of(" \t\n")); auto true_branch = parse_braced_toplevel(); - consume_while(is_whitespace); + auto end_before_else = m_offset; + auto line_before_else = line(); + consume_while(is_any_of(" \t\n")); Optional else_position; { auto else_start = push_start(); if (expect("else")) else_position = AST::Position { else_start->offset, m_offset, else_start->line, line() }; + else + restore_to(end_before_else, line_before_else); } if (else_position.has_value()) { - consume_while(is_whitespace); + consume_while(is_any_of(" \t\n")); if (peek() == '{') { auto false_branch = parse_braced_toplevel(); return create(else_position, condition.release_nonnull(), move(true_branch), move(false_branch)); // If expr true_branch Else false_branch diff --git a/Userland/Shell/Tests/if.sh b/Userland/Shell/Tests/if.sh index 598a9471bc..68731805e2 100644 --- a/Userland/Shell/Tests/if.sh +++ b/Userland/Shell/Tests/if.sh @@ -16,6 +16,14 @@ if test 1 -eq 1 { } else { } + # Can we put `else` on a new line? + if false { + echo "if false runs true branch" + exit 2 + } + else { + } + # Basic 'if' structure, without 'else' if false { echo "Fail: 'if false' runs the branch"