1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-26 02:27:43 +00:00

Shell: Rewrite 'FOR NAME do ... done' according to Dr.POSIX

Dr.POSIX says this form of the loop is supposed to iterate over exactly
`"$@"`, this commit makes us support that.
This commit is contained in:
Ali Mohammad Pur 2023-09-21 02:35:35 +03:30 committed by Jelle Raaijmakers
parent 764ea6104e
commit 0214e9b905

View file

@ -1372,7 +1372,7 @@ ErrorOr<RefPtr<AST::Node>> Parser::parse_term()
ErrorOr<RefPtr<AST::Node>> Parser::parse_for_clause() ErrorOr<RefPtr<AST::Node>> Parser::parse_for_clause()
{ {
// FOR NAME newline+ do_group // FOR NAME newline+ do_group //-> FOR NAME IN "$@" newline+ do_group
// FOR NAME newline+ IN separator do_group // FOR NAME newline+ IN separator do_group
// FOR NAME IN separator do_group // FOR NAME IN separator do_group
// FOR NAME IN wordlist separator do_group // FOR NAME IN wordlist separator do_group
@ -1400,16 +1400,20 @@ ErrorOr<RefPtr<AST::Node>> Parser::parse_for_clause()
auto saw_in = false; auto saw_in = false;
Optional<AST::Position> in_kw_position; Optional<AST::Position> in_kw_position;
RefPtr<AST::Node> iterated_expression;
if (peek().type == Token::Type::In) { if (peek().type == Token::Type::In) {
saw_in = true; saw_in = true;
in_kw_position = peek().position; in_kw_position = peek().position;
skip(); skip();
} else if (!saw_newline) { } else if (!saw_newline) {
error(peek(), "Expected 'in' or a newline, not {}", peek().type_name()); error(peek(), "Expected 'in' or a newline, not {}", peek().type_name());
} else {
// FOR NAME newline+ do_group //-> FOR NAME IN "$@" newline+ do_group
iterated_expression = TRY(Parser { "\"$@\""_string }.parse_word());
} }
RefPtr<AST::Node> iterated_expression; if (saw_in && !saw_newline)
if (!saw_newline)
iterated_expression = parse_word_list(); iterated_expression = parse_word_list();
if (saw_in) { if (saw_in) {