From 6e3cd7dd06bce74c8b9b9d1526e01436076773a6 Mon Sep 17 00:00:00 2001 From: Sam Atkins Date: Tue, 2 Sep 2025 15:13:22 +0100 Subject: [PATCH] LibIDL: Support partial namespaces --- Libraries/LibIDL/IDLParser.cpp | 18 ++++++++++++++++++ Libraries/LibIDL/IDLParser.h | 1 + Libraries/LibIDL/Types.h | 1 + 3 files changed, 20 insertions(+) diff --git a/Libraries/LibIDL/IDLParser.cpp b/Libraries/LibIDL/IDLParser.cpp index 4e854a9e131..3210d1b6128 100644 --- a/Libraries/LibIDL/IDLParser.cpp +++ b/Libraries/LibIDL/IDLParser.cpp @@ -858,6 +858,17 @@ void Parser::parse_namespace(Interface& interface) consume_whitespace(); } +void Parser::parse_partial_namespace(Interface& parent) +{ + assert_string("partial"sv); + consume_whitespace(); + assert_string("namespace"sv); + + auto partial_namespace = make(); + parse_namespace(*partial_namespace); + parent.partial_namespaces.append(move(partial_namespace)); +} + // https://webidl.spec.whatwg.org/#prod-Enum void Parser::parse_enumeration(HashMap extended_attributes, Interface& interface) { @@ -1077,6 +1088,8 @@ void Parser::parse_non_interface_entities(bool allow_interface, Interface& inter parse_partial_interface(extended_attributes, interface); } else if (lexer.next_is("interface mixin"sv)) { parse_interface_mixin(interface); + } else if (lexer.next_is("partial namespace"sv)) { + parse_partial_namespace(interface); } else if (lexer.next_is("callback"sv)) { parse_callback_function(extended_attributes, interface); } else if ((allow_interface && !lexer.next_is("interface"sv) && !lexer.next_is("namespace"sv)) || !allow_interface) { @@ -1229,6 +1242,11 @@ Interface& Parser::parse() interface.enumerations.set(enumeration.key, move(enumeration_copy)); } + for (auto& partial_namespace : import.partial_namespaces) { + if (partial_namespace->namespace_class == interface.namespace_class) + interface.extend_with_partial_interface(*partial_namespace); + } + interface.typedefs.update(import.typedefs); for (auto& mixin : import.mixins) { diff --git a/Libraries/LibIDL/IDLParser.h b/Libraries/LibIDL/IDLParser.h index cf6fc465db8..afa74554d1e 100644 --- a/Libraries/LibIDL/IDLParser.h +++ b/Libraries/LibIDL/IDLParser.h @@ -47,6 +47,7 @@ private: void parse_interface(Interface&); void parse_partial_interface(HashMap extended_attributes, Interface& parent); void parse_namespace(Interface&); + void parse_partial_namespace(Interface& parent); void parse_non_interface_entities(bool allow_interface, Interface&); void parse_enumeration(HashMap, Interface&); void parse_typedef(Interface&); diff --git a/Libraries/LibIDL/Types.h b/Libraries/LibIDL/Types.h index bd3ca7304cf..32851be0dba 100644 --- a/Libraries/LibIDL/Types.h +++ b/Libraries/LibIDL/Types.h @@ -323,6 +323,7 @@ public: ByteString module_own_path; Vector> partial_interfaces; + Vector> partial_namespaces; Vector imported_modules; OrderedHashMap> overload_sets;