Sfoglia il codice sorgente

LibJS: Rename in_async_function_context to await_expression_is_valid

Since await can be valid in module code which is not an async function
the old name is not really representative for the usage.
davidot 3 anni fa
parent
commit
22174d3b7b
2 ha cambiato i file con 16 aggiunte e 16 eliminazioni
  1. 15 15
      Userland/Libraries/LibJS/Parser.cpp
  2. 1 1
      Userland/Libraries/LibJS/Parser.h

+ 15 - 15
Userland/Libraries/LibJS/Parser.cpp

@@ -597,7 +597,7 @@ bool Parser::match_invalid_escaped_keyword() const
         return false;
         return false;
     auto token_value = m_state.current_token.value();
     auto token_value = m_state.current_token.value();
     if (token_value == "await"sv)
     if (token_value == "await"sv)
-        return m_program_type == Program::Type::Module || m_state.in_async_function_context;
+        return m_program_type == Program::Type::Module || m_state.await_expression_is_valid;
     if (token_value == "async"sv)
     if (token_value == "async"sv)
         return false;
         return false;
     if (token_value == "yield"sv)
     if (token_value == "yield"sv)
@@ -673,7 +673,7 @@ RefPtr<FunctionExpression> Parser::try_parse_arrow_function_expression(bool expe
         // check if it's about a wrong token (something like duplicate parameter name must
         // check if it's about a wrong token (something like duplicate parameter name must
         // not abort), know parsing failed and rollback the parser state.
         // not abort), know parsing failed and rollback the parser state.
         auto previous_syntax_errors = m_state.errors.size();
         auto previous_syntax_errors = m_state.errors.size();
-        TemporaryChange in_async_context(m_state.in_async_function_context, is_async || m_state.in_async_function_context);
+        TemporaryChange in_async_context(m_state.await_expression_is_valid, is_async || m_state.await_expression_is_valid);
 
 
         parameters = parse_formal_parameters(function_length, FunctionNodeParseOptions::IsArrowFunction | (is_async ? FunctionNodeParseOptions::IsAsyncFunction : 0));
         parameters = parse_formal_parameters(function_length, FunctionNodeParseOptions::IsArrowFunction | (is_async ? FunctionNodeParseOptions::IsAsyncFunction : 0));
         if (m_state.errors.size() > previous_syntax_errors && m_state.errors[previous_syntax_errors].message.starts_with("Unexpected token"))
         if (m_state.errors.size() > previous_syntax_errors && m_state.errors[previous_syntax_errors].message.starts_with("Unexpected token"))
@@ -712,7 +712,7 @@ RefPtr<FunctionExpression> Parser::try_parse_arrow_function_expression(bool expe
 
 
     auto function_body_result = [&]() -> RefPtr<FunctionBody> {
     auto function_body_result = [&]() -> RefPtr<FunctionBody> {
         TemporaryChange change(m_state.in_arrow_function_context, true);
         TemporaryChange change(m_state.in_arrow_function_context, true);
-        TemporaryChange async_context_change(m_state.in_async_function_context, is_async);
+        TemporaryChange async_context_change(m_state.await_expression_is_valid, is_async);
         TemporaryChange in_class_static_init_block_change(m_state.in_class_static_init_block, false);
         TemporaryChange in_class_static_init_block_change(m_state.in_class_static_init_block, false);
 
 
         if (match(TokenType::CurlyOpen)) {
         if (match(TokenType::CurlyOpen)) {
@@ -780,7 +780,7 @@ RefPtr<Statement> Parser::try_parse_labelled_statement(AllowLabelledFunction all
         return {};
         return {};
     }
     }
 
 
-    if (m_state.current_token.value() == "await"sv && (m_program_type == Program::Type::Module || m_state.in_async_function_context || m_state.in_class_static_init_block)) {
+    if (m_state.current_token.value() == "await"sv && (m_program_type == Program::Type::Module || m_state.await_expression_is_valid || m_state.in_class_static_init_block)) {
         return {};
         return {};
     }
     }
 
 
@@ -1137,7 +1137,7 @@ NonnullRefPtr<ClassExpression> Parser::parse_class_expression(bool expect_class_
                 TemporaryChange continue_context_rollback(m_state.in_continue_context, false);
                 TemporaryChange continue_context_rollback(m_state.in_continue_context, false);
                 TemporaryChange function_context_rollback(m_state.in_function_context, false);
                 TemporaryChange function_context_rollback(m_state.in_function_context, false);
                 TemporaryChange generator_function_context_rollback(m_state.in_generator_function_context, false);
                 TemporaryChange generator_function_context_rollback(m_state.in_generator_function_context, false);
-                TemporaryChange async_function_context_rollback(m_state.in_async_function_context, false);
+                TemporaryChange async_function_context_rollback(m_state.await_expression_is_valid, false);
                 TemporaryChange class_field_initializer_rollback(m_state.in_class_field_initializer, true);
                 TemporaryChange class_field_initializer_rollback(m_state.in_class_field_initializer, true);
                 TemporaryChange class_static_init_block_rollback(m_state.in_class_static_init_block, true);
                 TemporaryChange class_static_init_block_rollback(m_state.in_class_static_init_block, true);
 
 
@@ -1380,7 +1380,7 @@ Parser::PrimaryExpressionParseResult Parser::parse_primary_expression()
             goto read_as_identifier;
             goto read_as_identifier;
         return { parse_yield_expression(), false };
         return { parse_yield_expression(), false };
     case TokenType::Await:
     case TokenType::Await:
-        if (!m_state.in_async_function_context)
+        if (!m_state.await_expression_is_valid)
             goto read_as_identifier;
             goto read_as_identifier;
         return { parse_await_expression() };
         return { parse_await_expression() };
     case TokenType::PrivateIdentifier:
     case TokenType::PrivateIdentifier:
@@ -2073,7 +2073,7 @@ RefPtr<BindingPattern> Parser::synthesize_binding_pattern(Expression const& expr
     parser.m_state.in_function_context = m_state.in_function_context;
     parser.m_state.in_function_context = m_state.in_function_context;
     parser.m_state.in_formal_parameter_context = m_state.in_formal_parameter_context;
     parser.m_state.in_formal_parameter_context = m_state.in_formal_parameter_context;
     parser.m_state.in_generator_function_context = m_state.in_generator_function_context;
     parser.m_state.in_generator_function_context = m_state.in_generator_function_context;
-    parser.m_state.in_async_function_context = m_state.in_async_function_context;
+    parser.m_state.await_expression_is_valid = m_state.await_expression_is_valid;
     parser.m_state.in_arrow_function_context = m_state.in_arrow_function_context;
     parser.m_state.in_arrow_function_context = m_state.in_arrow_function_context;
     parser.m_state.in_break_context = m_state.in_break_context;
     parser.m_state.in_break_context = m_state.in_break_context;
     parser.m_state.in_continue_context = m_state.in_continue_context;
     parser.m_state.in_continue_context = m_state.in_continue_context;
@@ -2416,7 +2416,7 @@ NonnullRefPtr<FunctionNodeType> Parser::parse_function_node(u8 parse_options)
     }
     }
     TemporaryChange class_static_initializer_rollback(m_state.in_class_static_init_block, false);
     TemporaryChange class_static_initializer_rollback(m_state.in_class_static_init_block, false);
     TemporaryChange generator_change(m_state.in_generator_function_context, function_kind == FunctionKind::Generator || function_kind == FunctionKind::AsyncGenerator);
     TemporaryChange generator_change(m_state.in_generator_function_context, function_kind == FunctionKind::Generator || function_kind == FunctionKind::AsyncGenerator);
-    TemporaryChange async_change(m_state.in_async_function_context, function_kind == FunctionKind::Async || function_kind == FunctionKind::AsyncGenerator);
+    TemporaryChange async_change(m_state.await_expression_is_valid, function_kind == FunctionKind::Async || function_kind == FunctionKind::AsyncGenerator);
 
 
     consume(TokenType::ParenOpen);
     consume(TokenType::ParenOpen);
     i32 function_length = -1;
     i32 function_length = -1;
@@ -2786,7 +2786,7 @@ NonnullRefPtr<VariableDeclaration> Parser::parse_variable_declaration(bool for_l
             target = create_ast_node<Identifier>(
             target = create_ast_node<Identifier>(
                 { m_state.current_token.filename(), rule_start.position(), position() },
                 { m_state.current_token.filename(), rule_start.position(), position() },
                 consume().value());
                 consume().value());
-        } else if (!m_state.in_async_function_context && match(TokenType::Async)) {
+        } else if (!m_state.await_expression_is_valid && match(TokenType::Async)) {
             if (m_program_type == Program::Type::Module)
             if (m_program_type == Program::Type::Module)
                 syntax_error("Identifier must not be a reserved word in modules ('async')");
                 syntax_error("Identifier must not be a reserved word in modules ('async')");
 
 
@@ -3148,7 +3148,7 @@ NonnullRefPtr<CatchClause> Parser::parse_catch_clause()
         consume();
         consume();
         if (match_identifier_name()
         if (match_identifier_name()
             && (!match(TokenType::Yield) || !m_state.in_generator_function_context)
             && (!match(TokenType::Yield) || !m_state.in_generator_function_context)
-            && (!match(TokenType::Async) || !m_state.in_async_function_context)
+            && (!match(TokenType::Async) || !m_state.await_expression_is_valid)
             && (!match(TokenType::Await) || !m_state.in_class_static_init_block))
             && (!match(TokenType::Await) || !m_state.in_class_static_init_block))
             parameter = consume().value();
             parameter = consume().value();
         else
         else
@@ -3256,7 +3256,7 @@ NonnullRefPtr<Statement> Parser::parse_for_statement()
         if (is_await_loop == IsForAwaitLoop::Yes) {
         if (is_await_loop == IsForAwaitLoop::Yes) {
             if (!is_of)
             if (!is_of)
                 syntax_error("for await loop is only valid with 'of'");
                 syntax_error("for await loop is only valid with 'of'");
-            else if (!m_state.in_async_function_context)
+            else if (!m_state.await_expression_is_valid)
                 syntax_error("for await loop is only valid in async function or generator");
                 syntax_error("for await loop is only valid in async function or generator");
             return true;
             return true;
         }
         }
@@ -3268,7 +3268,7 @@ NonnullRefPtr<Statement> Parser::parse_for_statement()
 
 
     if (match(TokenType::Await)) {
     if (match(TokenType::Await)) {
         consume();
         consume();
-        if (!m_state.in_async_function_context)
+        if (!m_state.await_expression_is_valid)
             syntax_error("for-await-of is only allowed in async function context");
             syntax_error("for-await-of is only allowed in async function context");
         is_await_loop = IsForAwaitLoop::Yes;
         is_await_loop = IsForAwaitLoop::Yes;
     }
     }
@@ -3603,14 +3603,14 @@ bool Parser::match_identifier() const
         if (m_state.current_token.value() == "yield"sv)
         if (m_state.current_token.value() == "yield"sv)
             return !m_state.strict_mode && !m_state.in_generator_function_context;
             return !m_state.strict_mode && !m_state.in_generator_function_context;
         if (m_state.current_token.value() == "await"sv)
         if (m_state.current_token.value() == "await"sv)
-            return m_program_type != Program::Type::Module && !m_state.in_async_function_context && !m_state.in_class_static_init_block;
+            return m_program_type != Program::Type::Module && !m_state.await_expression_is_valid && !m_state.in_class_static_init_block;
         return true;
         return true;
     }
     }
 
 
     return m_state.current_token.type() == TokenType::Identifier
     return m_state.current_token.type() == TokenType::Identifier
         || m_state.current_token.type() == TokenType::Async
         || m_state.current_token.type() == TokenType::Async
         || (m_state.current_token.type() == TokenType::Let && !m_state.strict_mode)
         || (m_state.current_token.type() == TokenType::Let && !m_state.strict_mode)
-        || (m_state.current_token.type() == TokenType::Await && m_program_type != Program::Type::Module && !m_state.in_async_function_context && !m_state.in_class_static_init_block)
+        || (m_state.current_token.type() == TokenType::Await && m_program_type != Program::Type::Module && !m_state.await_expression_is_valid && !m_state.in_class_static_init_block)
         || (m_state.current_token.type() == TokenType::Yield && !m_state.in_generator_function_context && !m_state.strict_mode); // See note in Parser::parse_identifier().
         || (m_state.current_token.type() == TokenType::Yield && !m_state.in_generator_function_context && !m_state.strict_mode); // See note in Parser::parse_identifier().
 }
 }
 
 
@@ -3692,7 +3692,7 @@ Token Parser::consume_identifier()
     }
     }
 
 
     if (match(TokenType::Await)) {
     if (match(TokenType::Await)) {
-        if (m_program_type == Program::Type::Module || m_state.in_async_function_context || m_state.in_class_static_init_block)
+        if (m_program_type == Program::Type::Module || m_state.await_expression_is_valid || m_state.in_class_static_init_block)
             syntax_error("Identifier must not be a reserved word in modules ('await')");
             syntax_error("Identifier must not be a reserved word in modules ('await')");
         return consume();
         return consume();
     }
     }

+ 1 - 1
Userland/Libraries/LibJS/Parser.h

@@ -261,7 +261,7 @@ private:
         bool in_function_context { false };
         bool in_function_context { false };
         bool in_formal_parameter_context { false };
         bool in_formal_parameter_context { false };
         bool in_generator_function_context { false };
         bool in_generator_function_context { false };
-        bool in_async_function_context { false };
+        bool await_expression_is_valid { false };
         bool in_arrow_function_context { false };
         bool in_arrow_function_context { false };
         bool in_break_context { false };
         bool in_break_context { false };
         bool in_continue_context { false };
         bool in_continue_context { false };