Skip to content

Commit 1b6346e

Browse files
shannonboothawesomekling
authored andcommitted
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.
1 parent 62f62a0 commit 1b6346e

File tree

3 files changed

+10
-4
lines changed

3 files changed

+10
-4
lines changed

Meta/Lagom/Tools/CodeGenerators/LibWeb/BindingsGenerator/main.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,10 +77,10 @@ ErrorOr<int> serenity_main(Main::Arguments arguments)
7777
StringBuilder builder;
7878
builder.append(namespace_);
7979
builder.append("::"sv);
80-
builder.append(interface.name);
80+
builder.append(interface.implemented_name);
8181
interface.fully_qualified_name = builder.to_byte_string();
8282
} else {
83-
interface.fully_qualified_name = interface.name;
83+
interface.fully_qualified_name = interface.implemented_name;
8484
}
8585

8686
if constexpr (BINDINGS_GENERATOR_DEBUG) {

Userland/Libraries/LibIDL/IDLParser.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -634,8 +634,13 @@ void Parser::parse_interface(Interface& interface)
634634
else
635635
interface.namespaced_name = interface.name;
636636

637-
interface.constructor_class = ByteString::formatted("{}Constructor", interface.name);
638-
interface.prototype_class = ByteString::formatted("{}Prototype", interface.name);
637+
if (auto maybe_implemented_as = interface.extended_attributes.get("ImplementedAs"); maybe_implemented_as.has_value())
638+
interface.implemented_name = maybe_implemented_as.release_value();
639+
else
640+
interface.implemented_name = interface.name;
641+
642+
interface.constructor_class = ByteString::formatted("{}Constructor", interface.implemented_name);
643+
interface.prototype_class = ByteString::formatted("{}Prototype", interface.implemented_name);
639644
interface.prototype_base_class = ByteString::formatted("{}Prototype", interface.parent_name.is_empty() ? "Object" : interface.parent_name);
640645
interface.global_mixin_class = ByteString::formatted("{}GlobalMixin", interface.name);
641646
consume_whitespace();

Userland/Libraries/LibIDL/Types.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,7 @@ class Interface {
260260
ByteString name;
261261
ByteString parent_name;
262262
ByteString namespaced_name;
263+
ByteString implemented_name;
263264

264265
bool is_namespace { false };
265266
bool is_mixin { false };

0 commit comments

Comments
 (0)