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:
parent
764ea6104e
commit
0214e9b905
1 changed files with 7 additions and 3 deletions
|
@ -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) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue