diff --git a/Meta/Lagom/Tools/CodeGenerators/LibWeb/WrapperGenerator/IDLGenerators.cpp b/Meta/Lagom/Tools/CodeGenerators/LibWeb/WrapperGenerator/IDLGenerators.cpp index fec488a0a6..1cf8c31387 100644 --- a/Meta/Lagom/Tools/CodeGenerators/LibWeb/WrapperGenerator/IDLGenerators.cpp +++ b/Meta/Lagom/Tools/CodeGenerators/LibWeb/WrapperGenerator/IDLGenerators.cpp @@ -222,6 +222,9 @@ static void emit_includes_for_all_imports(auto& interface, auto& generator, bool interfaces.enqueue(&imported_interface); } + if (!interface->will_generate_code()) + continue; + generate_include_for(generator, interface->module_own_path); if (is_iterator) { @@ -1543,7 +1546,7 @@ void generate_header(IDL::Interface const& interface) #include )~~~"); - for (auto& path : interface.imported_paths) + for (auto& path : interface.required_imported_paths) generate_include_for(generator, path); emit_includes_for_all_imports(interface, generator, true); @@ -2886,7 +2889,7 @@ void generate_prototype_implementation(IDL::Interface const& interface) )~~~"); - for (auto& path : interface.imported_paths) + for (auto& path : interface.required_imported_paths) generate_include_for(generator, path); emit_includes_for_all_imports(interface, generator, false, interface.pair_iterator_types.has_value()); @@ -3334,7 +3337,7 @@ void generate_iterator_implementation(IDL::Interface const& interface) )~~~"); - for (auto& path : interface.imported_paths) + for (auto& path : interface.required_imported_paths) generate_include_for(generator, path); emit_includes_for_all_imports(interface, generator, false, true); diff --git a/Meta/Lagom/Tools/CodeGenerators/LibWeb/WrapperGenerator/IDLParser.cpp b/Meta/Lagom/Tools/CodeGenerators/LibWeb/WrapperGenerator/IDLParser.cpp index 55ab5c3b43..e2356d3bf7 100644 --- a/Meta/Lagom/Tools/CodeGenerators/LibWeb/WrapperGenerator/IDLParser.cpp +++ b/Meta/Lagom/Tools/CodeGenerators/LibWeb/WrapperGenerator/IDLParser.cpp @@ -141,7 +141,10 @@ Optional> Parser::resolve_import(auto path) report_parsing_error(String::formatted("Failed to open {}: {}", real_path, file_or_error.error()), filename, input, lexer.tell()); auto data = file_or_error.value()->read_all(); - return Parser(real_path, data, import_base_path).parse(); + auto result = Parser(real_path, data, import_base_path).parse(); + if (result->will_generate_code()) + required_imported_paths.set(real_path); + return result; } NonnullRefPtr Parser::parse_type() @@ -745,13 +748,16 @@ NonnullOwnPtr Parser::parse() lexer.ignore(); auto maybe_interface = resolve_import(path); if (maybe_interface.has_value()) { - for (auto& entry : maybe_interface.value()->imported_paths) + for (auto& entry : maybe_interface.value()->all_imported_paths) s_all_imported_paths.set(entry); + for (auto& entry : maybe_interface.value()->required_imported_paths) + required_imported_paths.set(entry); imports.append(maybe_interface.release_value()); } consume_whitespace(); } - interface->imported_paths = s_all_imported_paths; + interface->all_imported_paths = s_all_imported_paths; + interface->required_imported_paths = required_imported_paths; if (lexer.consume_specific('[')) interface->extended_attributes = parse_extended_attributes(); @@ -828,6 +834,8 @@ NonnullOwnPtr Parser::parse() } // FIXME: Add support for overloading constructors + if (interface->will_generate_code()) + interface->required_imported_paths.set(this_module); interface->imported_modules = move(imports); return interface; diff --git a/Meta/Lagom/Tools/CodeGenerators/LibWeb/WrapperGenerator/IDLParser.h b/Meta/Lagom/Tools/CodeGenerators/LibWeb/WrapperGenerator/IDLParser.h index f2f4fe63bf..3f340dac85 100644 --- a/Meta/Lagom/Tools/CodeGenerators/LibWeb/WrapperGenerator/IDLParser.h +++ b/Meta/Lagom/Tools/CodeGenerators/LibWeb/WrapperGenerator/IDLParser.h @@ -52,6 +52,7 @@ private: void parse_constant(Interface&); static HashTable s_all_imported_paths; + HashTable required_imported_paths; String import_base_path; String filename; StringView input; diff --git a/Meta/Lagom/Tools/CodeGenerators/LibWeb/WrapperGenerator/IDLTypes.h b/Meta/Lagom/Tools/CodeGenerators/LibWeb/WrapperGenerator/IDLTypes.h index f92d3b0b1a..0c9e9044bf 100644 --- a/Meta/Lagom/Tools/CodeGenerators/LibWeb/WrapperGenerator/IDLTypes.h +++ b/Meta/Lagom/Tools/CodeGenerators/LibWeb/WrapperGenerator/IDLTypes.h @@ -196,7 +196,8 @@ struct Interface { HashMap> included_mixins; String module_own_path; - HashTable imported_paths; + HashTable all_imported_paths; + HashTable required_imported_paths; NonnullOwnPtrVector imported_modules; HashMap> overload_sets; @@ -210,6 +211,11 @@ struct Interface { // https://webidl.spec.whatwg.org/#dfn-legacy-platform-object bool is_legacy_platform_object() const { return !extended_attributes.contains("Global") && (supports_indexed_properties() || supports_named_properties()); } + + bool will_generate_code() const + { + return !name.is_empty() || any_of(enumerations, [](auto& entry) { return entry.value.is_original_definition; }); + } }; CppType idl_type_name_to_cpp_type(Type const& type, IDL::Interface const& interface);