diff --git a/Userland/Libraries/LibJS/AST.cpp b/Userland/Libraries/LibJS/AST.cpp index 814d35ac67..5bf9938c3d 100644 --- a/Userland/Libraries/LibJS/AST.cpp +++ b/Userland/Libraries/LibJS/AST.cpp @@ -4377,16 +4377,6 @@ ThrowCompletionOr ScopeNode::for_each_lexically_declared_identifier(ThrowC return {}; } -ThrowCompletionOr ScopeNode::for_each_var_declared_name(ThrowCompletionOrVoidCallback&& callback) const -{ - for (auto& declaration : m_var_declarations) { - TRY(declaration->for_each_bound_identifier([&](auto const& identifier) { - return callback(identifier.string()); - })); - } - return {}; -} - ThrowCompletionOr ScopeNode::for_each_var_declared_identifier(ThrowCompletionOrVoidCallback&& callback) const { for (auto& declaration : m_var_declarations) { @@ -4690,10 +4680,10 @@ ThrowCompletionOr Program::global_declaration_instantiation(VM& vm, Global })); // 4. For each element name of varNames, do - TRY(for_each_var_declared_name([&](auto const& name) -> ThrowCompletionOr { + TRY(for_each_var_declared_identifier([&](auto const& identifier) -> ThrowCompletionOr { // a. If env.HasLexicalDeclaration(name) is true, throw a SyntaxError exception. - if (global_environment.has_lexical_declaration(name)) - return vm.throw_completion(ErrorType::TopLevelVariableAlreadyDeclared, name); + if (global_environment.has_lexical_declaration(identifier.string())) + return vm.throw_completion(ErrorType::TopLevelVariableAlreadyDeclared, identifier.string()); return {}; })); diff --git a/Userland/Libraries/LibJS/AST.h b/Userland/Libraries/LibJS/AST.h index 4a41a649d8..e0dfd28480 100644 --- a/Userland/Libraries/LibJS/AST.h +++ b/Userland/Libraries/LibJS/AST.h @@ -309,7 +309,6 @@ public: ThrowCompletionOr for_each_lexically_scoped_declaration(ThrowCompletionOrVoidCallback&& callback) const; ThrowCompletionOr for_each_lexically_declared_identifier(ThrowCompletionOrVoidCallback&& callback) const; - ThrowCompletionOr for_each_var_declared_name(ThrowCompletionOrVoidCallback&& callback) const; ThrowCompletionOr for_each_var_declared_identifier(ThrowCompletionOrVoidCallback&& callback) const; ThrowCompletionOr for_each_var_function_declaration_in_reverse_order(ThrowCompletionOrVoidCallback&& callback) const; diff --git a/Userland/Libraries/LibJS/Parser.cpp b/Userland/Libraries/LibJS/Parser.cpp index 9e0bd1d574..8e850d49b1 100644 --- a/Userland/Libraries/LibJS/Parser.cpp +++ b/Userland/Libraries/LibJS/Parser.cpp @@ -769,8 +769,8 @@ void Parser::parse_module(Program& program) if (found) continue; // NOTE: Nothing in the callback throws an exception. - MUST(program.for_each_var_declared_name([&](auto const& name) { - if (name == exported_name) + MUST(program.for_each_var_declared_identifier([&](auto const& identifier) { + if (identifier.string() == exported_name) found = true; })); for (auto& import : program.imports()) { diff --git a/Userland/Libraries/LibJS/Runtime/AbstractOperations.cpp b/Userland/Libraries/LibJS/Runtime/AbstractOperations.cpp index dac78811a9..eca40da080 100644 --- a/Userland/Libraries/LibJS/Runtime/AbstractOperations.cpp +++ b/Userland/Libraries/LibJS/Runtime/AbstractOperations.cpp @@ -743,10 +743,10 @@ ThrowCompletionOr eval_declaration_instantiation(VM& vm, Program const& pr // a. If varEnv is a global Environment Record, then if (global_var_environment) { // i. For each element name of varNames, do - TRY(program.for_each_var_declared_name([&](auto const& name) -> ThrowCompletionOr { + TRY(program.for_each_var_declared_identifier([&](auto const& identifier) -> ThrowCompletionOr { // 1. If varEnv.HasLexicalDeclaration(name) is true, throw a SyntaxError exception. - if (global_var_environment->has_lexical_declaration(name)) - return vm.throw_completion(ErrorType::TopLevelVariableAlreadyDeclared, name); + if (global_var_environment->has_lexical_declaration(identifier.string())) + return vm.throw_completion(ErrorType::TopLevelVariableAlreadyDeclared, identifier.string()); // 2. NOTE: eval will not create a global var declaration that would be shadowed by a global lexical declaration. return {}; @@ -763,7 +763,8 @@ ThrowCompletionOr eval_declaration_instantiation(VM& vm, Program const& pr if (!is(*this_environment)) { // 1. NOTE: The environment of with statements cannot contain any lexical declaration so it doesn't need to be checked for var/let hoisting conflicts. // 2. For each element name of varNames, do - TRY(program.for_each_var_declared_name([&](auto const& name) -> ThrowCompletionOr { + TRY(program.for_each_var_declared_identifier([&](auto const& identifier) -> ThrowCompletionOr { + auto const& name = identifier.string(); // a. If ! thisEnv.HasBinding(name) is true, then if (MUST(this_environment->has_binding(name))) { // i. Throw a SyntaxError exception. diff --git a/Userland/Libraries/LibJS/SourceTextModule.cpp b/Userland/Libraries/LibJS/SourceTextModule.cpp index 3ac2a36f2e..ad1061f496 100644 --- a/Userland/Libraries/LibJS/SourceTextModule.cpp +++ b/Userland/Libraries/LibJS/SourceTextModule.cpp @@ -438,8 +438,9 @@ ThrowCompletionOr SourceTextModule::initialize_environment(VM& vm) // 21. For each element d of varDeclarations, do // a. For each element dn of the BoundNames of d, do // NOTE: Due to the use of MUST with `create_mutable_binding` and `initialize_binding` below, - // an exception should not result from `for_each_var_declared_name`. - MUST(m_ecmascript_code->for_each_var_declared_name([&](auto const& name) { + // an exception should not result from `for_each_var_declared_identifier`. + MUST(m_ecmascript_code->for_each_var_declared_identifier([&](auto const& identifier) { + auto const& name = identifier.string(); // i. If dn is not an element of declaredVarNames, then if (!declared_var_names.contains_slow(name)) { // 1. Perform ! env.CreateMutableBinding(dn, false).