diff --git a/Userland/Libraries/LibIDL/IDLParser.cpp b/Userland/Libraries/LibIDL/IDLParser.cpp index 7948b0e8fe..d320a1e36f 100644 --- a/Userland/Libraries/LibIDL/IDLParser.cpp +++ b/Userland/Libraries/LibIDL/IDLParser.cpp @@ -599,6 +599,33 @@ void Parser::parse_interface(Interface& interface) consume_whitespace(); } +void Parser::parse_namespace(Interface& interface) +{ + consume_whitespace(); + + interface.name = lexer.consume_until([](auto ch) { return is_ascii_space(ch); }); + interface.is_namespace = true; + + consume_whitespace(); + assert_specific('{'); + + for (;;) { + consume_whitespace(); + + if (lexer.consume_specific('}')) { + consume_whitespace(); + assert_specific(';'); + break; + } + + HashMap extended_attributes; + parse_function(extended_attributes, interface); + } + + interface.namespace_class = DeprecatedString::formatted("{}Namespace", interface.name); + consume_whitespace(); +} + void Parser::parse_enumeration(Interface& interface) { assert_string("enum"sv); @@ -802,7 +829,7 @@ void Parser::parse_non_interface_entities(bool allow_interface, Interface& inter parse_interface_mixin(interface); } else if (lexer.next_is("callback")) { parse_callback_function(extended_attributes, interface); - } else if ((allow_interface && !lexer.next_is("interface")) || !allow_interface) { + } else if ((allow_interface && !lexer.next_is("interface") && !lexer.next_is("namespace")) || !allow_interface) { auto current_offset = lexer.tell(); auto name = lexer.consume_until([](auto ch) { return is_ascii_space(ch); }); consume_whitespace(); @@ -920,6 +947,8 @@ Interface& Parser::parse() if (lexer.consume_specific("interface")) parse_interface(interface); + else if (lexer.consume_specific("namespace")) + parse_namespace(interface); parse_non_interface_entities(false, interface); diff --git a/Userland/Libraries/LibIDL/IDLParser.h b/Userland/Libraries/LibIDL/IDLParser.h index 69b3b2ec04..2acd5fd897 100644 --- a/Userland/Libraries/LibIDL/IDLParser.h +++ b/Userland/Libraries/LibIDL/IDLParser.h @@ -40,6 +40,7 @@ private: HashMap parse_extended_attributes(); void parse_attribute(HashMap& extended_attributes, Interface&); void parse_interface(Interface&); + void parse_namespace(Interface&); void parse_non_interface_entities(bool allow_interface, Interface&); void parse_enumeration(Interface&); void parse_typedef(Interface&); diff --git a/Userland/Libraries/LibIDL/Types.h b/Userland/Libraries/LibIDL/Types.h index f8f871527e..dab0884e47 100644 --- a/Userland/Libraries/LibIDL/Types.h +++ b/Userland/Libraries/LibIDL/Types.h @@ -256,6 +256,7 @@ public: DeprecatedString name; DeprecatedString parent_name; + bool is_namespace { false }; bool is_mixin { false }; HashMap extended_attributes; @@ -291,6 +292,7 @@ public: DeprecatedString constructor_class; DeprecatedString prototype_class; DeprecatedString prototype_base_class; + DeprecatedString namespace_class; DeprecatedString global_mixin_class; HashMap> included_mixins;