From 8d1ad592a131fce32bdde424302d149a80fd670d Mon Sep 17 00:00:00 2001 From: Daniel Bertalan Date: Sat, 5 Nov 2022 10:47:44 +0100 Subject: [PATCH] BindingsGenerator: Write generated code to disk instead of stdout This commit adds the `-o` option for specifying an output path to BindingsGenerator. --- Meta/CMake/libweb_generators.cmake | 2 +- .../LibWeb/BindingsGenerator/CMakeLists.txt | 2 +- .../BindingsGenerator/IDLGenerators.cpp | 30 +++---------- .../LibWeb/BindingsGenerator/main.cpp | 43 ++++++++++--------- 4 files changed, 31 insertions(+), 46 deletions(-) diff --git a/Meta/CMake/libweb_generators.cmake b/Meta/CMake/libweb_generators.cmake index d8fc6ec67b..d593f82537 100644 --- a/Meta/CMake/libweb_generators.cmake +++ b/Meta/CMake/libweb_generators.cmake @@ -113,7 +113,7 @@ function (generate_js_bindings target) list(TRANSFORM include_paths PREPEND -i) add_custom_command( OUTPUT "${bindings_src}" - COMMAND "$" "--${bindings_type}" ${include_paths} "${LIBWEB_INPUT_FOLDER}/${class}.idl" "${LIBWEB_INPUT_FOLDER}" > "${bindings_src}.tmp" + COMMAND "$" "--${bindings_type}" -o "${bindings_src}.tmp" ${include_paths} "${LIBWEB_INPUT_FOLDER}/${class}.idl" "${LIBWEB_INPUT_FOLDER}" COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${bindings_src}.tmp" "${bindings_src}" COMMAND "${CMAKE_COMMAND}" -E remove "${bindings_src}.tmp" VERBATIM diff --git a/Meta/Lagom/Tools/CodeGenerators/LibWeb/BindingsGenerator/CMakeLists.txt b/Meta/Lagom/Tools/CodeGenerators/LibWeb/BindingsGenerator/CMakeLists.txt index bfc8a4da0a..98e74e4583 100644 --- a/Meta/Lagom/Tools/CodeGenerators/LibWeb/BindingsGenerator/CMakeLists.txt +++ b/Meta/Lagom/Tools/CodeGenerators/LibWeb/BindingsGenerator/CMakeLists.txt @@ -3,5 +3,5 @@ set(SOURCES main.cpp ) -lagom_tool(BindingsGenerator LIBS LibIDL) +lagom_tool(BindingsGenerator LIBS LibIDL LibMain) target_compile_options(BindingsGenerator PUBLIC -g) diff --git a/Meta/Lagom/Tools/CodeGenerators/LibWeb/BindingsGenerator/IDLGenerators.cpp b/Meta/Lagom/Tools/CodeGenerators/LibWeb/BindingsGenerator/IDLGenerators.cpp index bae238f75f..754b217a5f 100644 --- a/Meta/Lagom/Tools/CodeGenerators/LibWeb/BindingsGenerator/IDLGenerators.cpp +++ b/Meta/Lagom/Tools/CodeGenerators/LibWeb/BindingsGenerator/IDLGenerators.cpp @@ -1980,9 +1980,8 @@ JS_DEFINE_NATIVE_FUNCTION(@class_name@::@function.name:snakecase@) )~~~"); } -void generate_constructor_header(IDL::Interface const& interface) +void generate_constructor_header(IDL::Interface const& interface, StringBuilder& builder) { - StringBuilder builder; SourceGenerator generator { builder }; generator.set("name", interface.name); @@ -2032,13 +2031,10 @@ private: } // namespace Web::Bindings )~~~"); - - outln("{}", generator.as_string_view()); } -void generate_constructor_implementation(IDL::Interface const& interface) +void generate_constructor_implementation(IDL::Interface const& interface, StringBuilder& builder) { - StringBuilder builder; SourceGenerator generator { builder }; generator.set("name", interface.name); @@ -2236,13 +2232,10 @@ void @constructor_class@::initialize(JS::Realm& realm) generator.append(R"~~~( } // namespace Web::Bindings )~~~"); - - outln("{}", generator.as_string_view()); } -void generate_prototype_header(IDL::Interface const& interface) +void generate_prototype_header(IDL::Interface const& interface, StringBuilder& builder) { - StringBuilder builder; SourceGenerator generator { builder }; generator.set("name", interface.name); @@ -2356,13 +2349,10 @@ inline DeprecatedString idl_enum_to_deprecated_string(@enum.type.name@ value) { generator.append(R"~~~( } // namespace Web::Bindings )~~~"); - - outln("{}", generator.as_string_view()); } -void generate_prototype_implementation(IDL::Interface const& interface) +void generate_prototype_implementation(IDL::Interface const& interface, StringBuilder& builder) { - StringBuilder builder; SourceGenerator generator { builder }; generator.set("name", interface.name); @@ -2801,14 +2791,11 @@ JS_DEFINE_NATIVE_FUNCTION(@prototype_class@::values) generator.append(R"~~~( } // namespace Web::Bindings )~~~"); - - outln("{}", generator.as_string_view()); } -void generate_iterator_prototype_header(IDL::Interface const& interface) +void generate_iterator_prototype_header(IDL::Interface const& interface, StringBuilder& builder) { VERIFY(interface.pair_iterator_types.has_value()); - StringBuilder builder; SourceGenerator generator { builder }; generator.set("prototype_class", DeprecatedString::formatted("{}IteratorPrototype", interface.name)); @@ -2833,14 +2820,11 @@ private: } // namespace Web::Bindings )~~~"); - - outln("{}", generator.as_string_view()); } -void generate_iterator_prototype_implementation(IDL::Interface const& interface) +void generate_iterator_prototype_implementation(IDL::Interface const& interface, StringBuilder& builder) { VERIFY(interface.pair_iterator_types.has_value()); - StringBuilder builder; SourceGenerator generator { builder }; generator.set("name", DeprecatedString::formatted("{}Iterator", interface.name)); @@ -2922,7 +2906,5 @@ JS_DEFINE_NATIVE_FUNCTION(@prototype_class@::next) } // namespace Web::Bindings )~~~"); - - outln("{}", generator.as_string_view()); } } diff --git a/Meta/Lagom/Tools/CodeGenerators/LibWeb/BindingsGenerator/main.cpp b/Meta/Lagom/Tools/CodeGenerators/LibWeb/BindingsGenerator/main.cpp index 4f2c19d7b1..07de0db313 100644 --- a/Meta/Lagom/Tools/CodeGenerators/LibWeb/BindingsGenerator/main.cpp +++ b/Meta/Lagom/Tools/CodeGenerators/LibWeb/BindingsGenerator/main.cpp @@ -12,25 +12,27 @@ #include #include #include +#include #include #include extern Vector s_header_search_paths; namespace IDL { -void generate_constructor_header(IDL::Interface const&); -void generate_constructor_implementation(IDL::Interface const&); -void generate_prototype_header(IDL::Interface const&); -void generate_prototype_implementation(IDL::Interface const&); -void generate_iterator_prototype_header(IDL::Interface const&); -void generate_iterator_prototype_implementation(IDL::Interface const&); +void generate_constructor_header(IDL::Interface const&, StringBuilder&); +void generate_constructor_implementation(IDL::Interface const&, StringBuilder&); +void generate_prototype_header(IDL::Interface const&, StringBuilder&); +void generate_prototype_implementation(IDL::Interface const&, StringBuilder&); +void generate_iterator_prototype_header(IDL::Interface const&, StringBuilder&); +void generate_iterator_prototype_implementation(IDL::Interface const&, StringBuilder&); } -int main(int argc, char** argv) +ErrorOr serenity_main(Main::Arguments arguments) { Core::ArgsParser args_parser; StringView path; StringView import_base_path; + StringView output_path = "-"sv; bool constructor_header_mode = false; bool constructor_implementation_mode = false; bool prototype_header_mode = false; @@ -54,24 +56,23 @@ int main(int argc, char** argv) return true; }, }); + args_parser.add_option(output_path, "Path to output generated file into", "output-path", 'o', "output-path"); args_parser.add_positional_argument(path, "IDL file", "idl-file"); args_parser.add_positional_argument(import_base_path, "Import base path", "import-base-path", Core::ArgsParser::Required::No); - args_parser.parse(argc, argv); + args_parser.parse(arguments); - auto file_or_error = Core::File::open(path, Core::OpenMode::ReadOnly); - if (file_or_error.is_error()) { - warnln("Failed to open {}: {}", path, file_or_error.error()); - return 1; - } + auto file = TRY(Core::Stream::File::open(path, Core::Stream::OpenMode::Read)); LexicalPath lexical_path(path); auto& namespace_ = lexical_path.parts_view().at(lexical_path.parts_view().size() - 2); - auto data = file_or_error.value()->read_all(); + auto data = TRY(file->read_all()); if (import_base_path.is_null()) import_base_path = lexical_path.dirname(); + auto output_file = TRY(Core::Stream::File::open_file_or_standard_stream(output_path, Core::Stream::OpenMode::Write)); + IDL::Parser parser(path, data, import_base_path); auto& interface = parser.parse(); @@ -125,23 +126,25 @@ int main(int argc, char** argv) } } + StringBuilder output_builder; if (constructor_header_mode) - IDL::generate_constructor_header(interface); + IDL::generate_constructor_header(interface, output_builder); if (constructor_implementation_mode) - IDL::generate_constructor_implementation(interface); + IDL::generate_constructor_implementation(interface, output_builder); if (prototype_header_mode) - IDL::generate_prototype_header(interface); + IDL::generate_prototype_header(interface, output_builder); if (prototype_implementation_mode) - IDL::generate_prototype_implementation(interface); + IDL::generate_prototype_implementation(interface, output_builder); if (iterator_prototype_header_mode) - IDL::generate_iterator_prototype_header(interface); + IDL::generate_iterator_prototype_header(interface, output_builder); if (iterator_prototype_implementation_mode) - IDL::generate_iterator_prototype_implementation(interface); + IDL::generate_iterator_prototype_implementation(interface, output_builder); + TRY(output_file->write(output_builder.string_view().bytes())); return 0; }