Bladeren bron

LibJS: Always insert semicolon after do-while statement if missing

https://tc39.es/ecma262/#sec-additions-and-changes-that-introduce-incompatibilities-with-prior-editions

11.9.1: In ECMAScript 2015, Automatic Semicolon Insertion adds a
semicolon at the end of a do-while statement if the semicolon is
missing. This change aligns the specification with the actual behaviour
of most existing implementations.
Linus Groh 4 jaren geleden
bovenliggende
commit
b4e51249e9
2 gewijzigde bestanden met toevoegingen van 8 en 1 verwijderingen
  1. 4 1
      Libraries/LibJS/Parser.cpp
  2. 4 0
      Libraries/LibJS/Tests/loops/do-while-basic.js

+ 4 - 1
Libraries/LibJS/Parser.cpp

@@ -1524,7 +1524,10 @@ NonnullRefPtr<DoWhileStatement> Parser::parse_do_while_statement()
     auto test = parse_expression(0);
     auto test = parse_expression(0);
 
 
     consume(TokenType::ParenClose);
     consume(TokenType::ParenClose);
-    consume_or_insert_semicolon();
+
+    // Since ES 2015 a missing semicolon is inserted here, despite the regular ASI rules not applying
+    if (match(TokenType::Semicolon))
+        consume();
 
 
     return create_ast_node<DoWhileStatement>(move(test), move(body));
     return create_ast_node<DoWhileStatement>(move(test), move(body));
 }
 }

+ 4 - 0
Libraries/LibJS/Tests/loops/do-while-basic.js

@@ -18,3 +18,7 @@ test("exception in test expression", () => {
         do {} while (foo);
         do {} while (foo);
     }).toThrow(ReferenceError);
     }).toThrow(ReferenceError);
 });
 });
+
+test("automatic semicolon insertion", () => {
+    expect("do {} while (false) foo").toEval();
+});