Просмотр исходного кода

LibJS: Allow async functions named "async" as function properties

For example, https://locals.com/site/discover has a script with an
object of the form:

    var f = {
        parser: {
            sync() {},
            async async() {},
        }
    };

We were previously throwing a syntax error on the async function, as we
specifically did not allow using "async" as a function name here.
Timothy Flynn 6 месяцев назад
Родитель
Сommit
ada36e5c0a
2 измененных файлов с 9 добавлено и 1 удалено
  1. 0 1
      Libraries/LibJS/Parser.cpp
  2. 9 0
      Libraries/LibJS/Tests/object-basic.js

+ 0 - 1
Libraries/LibJS/Parser.cpp

@@ -2019,7 +2019,6 @@ NonnullRefPtr<ObjectExpression const> Parser::parse_object_expression()
 
             if (lookahead_token.type() != TokenType::ParenOpen && lookahead_token.type() != TokenType::Colon
                 && lookahead_token.type() != TokenType::Comma && lookahead_token.type() != TokenType::CurlyClose
-                && lookahead_token.type() != TokenType::Async
                 && !lookahead_token.trivia_contains_line_terminator()) {
                 consume(TokenType::Async);
                 function_kind = FunctionKind::Async;

+ 9 - 0
Libraries/LibJS/Tests/object-basic.js

@@ -207,6 +207,15 @@ describe("shorthanded properties with special names", () => {
     });
 
     test("async functions as properties", () => {
+        expect("({ async async() {} });").toEval();
+        expect('"use strict"; ({ async async() {} });').toEval();
+
+        expect("({ async async });").not.toEval();
+        expect("({ async async, });").not.toEval();
+        expect("({ async async() });").not.toEval();
+        expect("({ async async: 0 });").not.toEval();
+        expect("({ async async = 0 });").not.toEval();
+
         expect("({ async foo });").not.toEval();
         expect("({ async foo, });").not.toEval();
         expect("({ async foo() });").not.toEval();