From 1b6346ee1c25727543a530a46510079a9e1fa7e2 Mon Sep 17 00:00:00 2001 From: Shannon Booth Date: Sun, 11 Feb 2024 19:48:29 +1300 Subject: [PATCH] LibWeb: Add support for implementing an IDL class with a different name Add support for the extended attribute "ImplementedAs" for IDL interfaces too. This allows a class which implements an IDL interface to have a different class name than the interface itself. --- .../CodeGenerators/LibWeb/BindingsGenerator/main.cpp | 4 ++-- Userland/Libraries/LibIDL/IDLParser.cpp | 9 +++++++-- Userland/Libraries/LibIDL/Types.h | 1 + 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/Meta/Lagom/Tools/CodeGenerators/LibWeb/BindingsGenerator/main.cpp b/Meta/Lagom/Tools/CodeGenerators/LibWeb/BindingsGenerator/main.cpp index e09b0004787..9b4f328b728 100644 --- a/Meta/Lagom/Tools/CodeGenerators/LibWeb/BindingsGenerator/main.cpp +++ b/Meta/Lagom/Tools/CodeGenerators/LibWeb/BindingsGenerator/main.cpp @@ -77,10 +77,10 @@ ErrorOr serenity_main(Main::Arguments arguments) StringBuilder builder; builder.append(namespace_); builder.append("::"sv); - builder.append(interface.name); + builder.append(interface.implemented_name); interface.fully_qualified_name = builder.to_byte_string(); } else { - interface.fully_qualified_name = interface.name; + interface.fully_qualified_name = interface.implemented_name; } if constexpr (BINDINGS_GENERATOR_DEBUG) { diff --git a/Userland/Libraries/LibIDL/IDLParser.cpp b/Userland/Libraries/LibIDL/IDLParser.cpp index 8616e417099..fa725e99a0e 100644 --- a/Userland/Libraries/LibIDL/IDLParser.cpp +++ b/Userland/Libraries/LibIDL/IDLParser.cpp @@ -634,8 +634,13 @@ void Parser::parse_interface(Interface& interface) else interface.namespaced_name = interface.name; - interface.constructor_class = ByteString::formatted("{}Constructor", interface.name); - interface.prototype_class = ByteString::formatted("{}Prototype", interface.name); + if (auto maybe_implemented_as = interface.extended_attributes.get("ImplementedAs"); maybe_implemented_as.has_value()) + interface.implemented_name = maybe_implemented_as.release_value(); + else + interface.implemented_name = interface.name; + + interface.constructor_class = ByteString::formatted("{}Constructor", interface.implemented_name); + interface.prototype_class = ByteString::formatted("{}Prototype", interface.implemented_name); interface.prototype_base_class = ByteString::formatted("{}Prototype", interface.parent_name.is_empty() ? "Object" : interface.parent_name); interface.global_mixin_class = ByteString::formatted("{}GlobalMixin", interface.name); consume_whitespace(); diff --git a/Userland/Libraries/LibIDL/Types.h b/Userland/Libraries/LibIDL/Types.h index e40144c1ce4..588cf9a2ab0 100644 --- a/Userland/Libraries/LibIDL/Types.h +++ b/Userland/Libraries/LibIDL/Types.h @@ -260,6 +260,7 @@ public: ByteString name; ByteString parent_name; ByteString namespaced_name; + ByteString implemented_name; bool is_namespace { false }; bool is_mixin { false };