1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 19:27:44 +00:00

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.
This commit is contained in:
Shannon Booth 2024-02-11 19:48:29 +13:00 committed by Andreas Kling
parent 62f62a0e52
commit 1b6346ee1c
3 changed files with 10 additions and 4 deletions

View file

@ -77,10 +77,10 @@ ErrorOr<int> serenity_main(Main::Arguments arguments)
StringBuilder builder; StringBuilder builder;
builder.append(namespace_); builder.append(namespace_);
builder.append("::"sv); builder.append("::"sv);
builder.append(interface.name); builder.append(interface.implemented_name);
interface.fully_qualified_name = builder.to_byte_string(); interface.fully_qualified_name = builder.to_byte_string();
} else { } else {
interface.fully_qualified_name = interface.name; interface.fully_qualified_name = interface.implemented_name;
} }
if constexpr (BINDINGS_GENERATOR_DEBUG) { if constexpr (BINDINGS_GENERATOR_DEBUG) {

View file

@ -634,8 +634,13 @@ void Parser::parse_interface(Interface& interface)
else else
interface.namespaced_name = interface.name; interface.namespaced_name = interface.name;
interface.constructor_class = ByteString::formatted("{}Constructor", interface.name); if (auto maybe_implemented_as = interface.extended_attributes.get("ImplementedAs"); maybe_implemented_as.has_value())
interface.prototype_class = ByteString::formatted("{}Prototype", interface.name); 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.prototype_base_class = ByteString::formatted("{}Prototype", interface.parent_name.is_empty() ? "Object" : interface.parent_name);
interface.global_mixin_class = ByteString::formatted("{}GlobalMixin", interface.name); interface.global_mixin_class = ByteString::formatted("{}GlobalMixin", interface.name);
consume_whitespace(); consume_whitespace();

View file

@ -260,6 +260,7 @@ public:
ByteString name; ByteString name;
ByteString parent_name; ByteString parent_name;
ByteString namespaced_name; ByteString namespaced_name;
ByteString implemented_name;
bool is_namespace { false }; bool is_namespace { false };
bool is_mixin { false }; bool is_mixin { false };