Sfoglia il codice sorgente

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.
Ali Mohammad Pur 1 anno fa
parent
commit
0214e9b905
1 ha cambiato i file con 7 aggiunte e 3 eliminazioni
  1. 7 3
      Userland/Shell/PosixParser.cpp

+ 7 - 3
Userland/Shell/PosixParser.cpp

@@ -1372,7 +1372,7 @@ ErrorOr<RefPtr<AST::Node>> Parser::parse_term()
 
 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 IN 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;
     Optional<AST::Position> in_kw_position;
+    RefPtr<AST::Node> iterated_expression;
+
     if (peek().type == Token::Type::In) {
         saw_in = true;
         in_kw_position = peek().position;
         skip();
     } else if (!saw_newline) {
         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_newline)
+    if (saw_in && !saw_newline)
         iterated_expression = parse_word_list();
 
     if (saw_in) {