From 3522ff16c0a84e04455c6e93770f03f1984d90a0 Mon Sep 17 00:00:00 2001 From: Jelle Raaijmakers Date: Mon, 25 Aug 2025 16:35:53 +0200 Subject: [PATCH] Meta: Reuse "define the operations" algorithm for generated namespaces This is one step closer to the spec. No functional changes. --- .../BindingsGenerator/IDLGenerators.cpp | 55 ++++++++----------- 1 file changed, 22 insertions(+), 33 deletions(-) diff --git a/Meta/Lagom/Tools/CodeGenerators/LibWeb/BindingsGenerator/IDLGenerators.cpp b/Meta/Lagom/Tools/CodeGenerators/LibWeb/BindingsGenerator/IDLGenerators.cpp index 5906f008726..93a97443ca8 100644 --- a/Meta/Lagom/Tools/CodeGenerators/LibWeb/BindingsGenerator/IDLGenerators.cpp +++ b/Meta/Lagom/Tools/CodeGenerators/LibWeb/BindingsGenerator/IDLGenerators.cpp @@ -4904,6 +4904,27 @@ using namespace Web::XHR; )~~~"sv); } +// https://webidl.spec.whatwg.org/#define-the-operations +static void define_the_operations(SourceGenerator& generator, OrderedHashMap> const& operations) +{ + for (auto const& operation : operations) { + auto function_generator = generator.fork(); + function_generator.set("function.name", operation.key); + function_generator.set("function.name:snakecase", make_input_acceptable_cpp(operation.key.to_snakecase())); + function_generator.set("function.length", ByteString::number(get_shortest_function_length(operation.value))); + + // NOTE: This assumes that every function in the overload set has the same attribute set. + if (operation.value[0].extended_attributes.contains("LegacyUnforgable"sv)) + function_generator.set("function.attributes", "JS::Attribute::Enumerable"); + else + function_generator.set("function.attributes", "JS::Attribute::Writable | JS::Attribute::Enumerable | JS::Attribute::Configurable"); + + function_generator.append(R"~~~( + define_native_function(realm, "@function.name@"_utf16_fly_string, @function.name:snakecase@, @function.length@, @function.attributes@); +)~~~"); + } +} + void generate_namespace_implementation(IDL::Interface const& interface, StringBuilder& builder) { SourceGenerator generator { builder }; @@ -4958,7 +4979,6 @@ GC_DEFINE_ALLOCATOR(@namespace_class@); void @namespace_class@::initialize(JS::Realm& realm) { [[maybe_unused]] auto& vm = this->vm(); - [[maybe_unused]] u8 default_attributes = JS::Attribute::Enumerable | JS::Attribute::Configurable | JS::Attribute::Writable; Base::initialize(realm); @@ -4966,17 +4986,7 @@ void @namespace_class@::initialize(JS::Realm& realm) )~~~"); - // https://webidl.spec.whatwg.org/#es-operations - for (auto const& overload_set : interface.overload_sets) { - auto function_generator = generator.fork(); - function_generator.set("function.name", overload_set.key); - function_generator.set("function.name:snakecase", make_input_acceptable_cpp(overload_set.key.to_snakecase())); - function_generator.set("function.length", ByteString::number(get_shortest_function_length(overload_set.value))); - - function_generator.append(R"~~~( - define_native_function(realm, "@function.name@"_utf16_fly_string, @function.name:snakecase@, @function.length@, default_attributes); -)~~~"); - } + define_the_operations(generator, interface.overload_sets); if (interface.extended_attributes.contains("WithInitializer"sv)) { generator.append(R"~~~( @@ -5101,27 +5111,6 @@ private: )~~~"); } -// https://webidl.spec.whatwg.org/#define-the-operations -static void define_the_operations(SourceGenerator& generator, HashMap> const& operations) -{ - for (auto const& operation : operations) { - auto function_generator = generator.fork(); - function_generator.set("function.name", operation.key); - function_generator.set("function.name:snakecase", make_input_acceptable_cpp(operation.key.to_snakecase())); - function_generator.set("function.length", ByteString::number(get_shortest_function_length(operation.value))); - - // NOTE: This assumes that every function in the overload set has the same attribute set. - if (operation.value[0].extended_attributes.contains("LegacyUnforgable"sv)) - function_generator.set("function.attributes", "JS::Attribute::Enumerable"); - else - function_generator.set("function.attributes", "JS::Attribute::Writable | JS::Attribute::Enumerable | JS::Attribute::Configurable"); - - function_generator.append(R"~~~( - define_native_function(realm, "@function.name@"_utf16_fly_string, @function.name:snakecase@, @function.length@, @function.attributes@); -)~~~"); - } -} - void generate_constructor_implementation(IDL::Interface const& interface, StringBuilder& builder) { SourceGenerator generator { builder };