diff --git a/Meta/Lagom/Tools/CodeGenerators/LibWeb/CMakeLists.txt b/Meta/Lagom/Tools/CodeGenerators/LibWeb/CMakeLists.txt index 330e31afd0..595523c762 100644 --- a/Meta/Lagom/Tools/CodeGenerators/LibWeb/CMakeLists.txt +++ b/Meta/Lagom/Tools/CodeGenerators/LibWeb/CMakeLists.txt @@ -3,7 +3,6 @@ set(SOURCES "") # avoid pulling SOURCES from parent scope lagom_tool(GenerateCSSMediaFeatureID SOURCES GenerateCSSMediaFeatureID.cpp LIBS LagomMain) lagom_tool(Generate_CSS_PropertyID_h SOURCES Generate_CSS_PropertyID_h.cpp LIBS LagomMain) lagom_tool(Generate_CSS_PropertyID_cpp SOURCES Generate_CSS_PropertyID_cpp.cpp LIBS LagomMain) -lagom_tool(Generate_CSS_ValueID_h SOURCES Generate_CSS_ValueID_h.cpp LIBS LagomMain) -lagom_tool(Generate_CSS_ValueID_cpp SOURCES Generate_CSS_ValueID_cpp.cpp LIBS LagomMain) +lagom_tool(GenerateCSSValueID SOURCES GenerateCSSValueID.cpp LIBS LagomMain) add_subdirectory(WrapperGenerator) diff --git a/Meta/Lagom/Tools/CodeGenerators/LibWeb/GenerateCSSValueID.cpp b/Meta/Lagom/Tools/CodeGenerators/LibWeb/GenerateCSSValueID.cpp new file mode 100644 index 0000000000..e21d33f1d2 --- /dev/null +++ b/Meta/Lagom/Tools/CodeGenerators/LibWeb/GenerateCSSValueID.cpp @@ -0,0 +1,135 @@ +/* + * Copyright (c) 2020, Andreas Kling + * Copyright (c) 2022, Sam Atkins + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include "GeneratorUtil.h" +#include +#include +#include +#include + +ErrorOr generate_header_file(JsonArray& identifier_data, Core::Stream::File& file); +ErrorOr generate_implementation_file(JsonArray& identifier_data, Core::Stream::File& file); + +ErrorOr serenity_main(Main::Arguments arguments) +{ + StringView generated_header_path; + StringView generated_implementation_path; + StringView identifiers_json_path; + + Core::ArgsParser args_parser; + args_parser.add_option(generated_header_path, "Path to the ValueID header file to generate", "generated-header-path", 'h', "generated-header-path"); + args_parser.add_option(generated_implementation_path, "Path to the ValueID implementation file to generate", "generated-implementation-path", 'c', "generated-implementation-path"); + args_parser.add_option(identifiers_json_path, "Path to the JSON file to read from", "json-path", 'j', "json-path"); + args_parser.parse(arguments); + + auto json = TRY(read_entire_file_as_json(identifiers_json_path)); + VERIFY(json.is_array()); + auto identifier_data = json.as_array(); + + auto generated_header_file = TRY(Core::Stream::File::open(generated_header_path, Core::Stream::OpenMode::Write)); + auto generated_implementation_file = TRY(Core::Stream::File::open(generated_implementation_path, Core::Stream::OpenMode::Write)); + + TRY(generate_header_file(identifier_data, *generated_header_file)); + TRY(generate_implementation_file(identifier_data, *generated_implementation_file)); + + return 0; +} + +ErrorOr generate_header_file(JsonArray& identifier_data, Core::Stream::File& file) +{ + StringBuilder builder; + SourceGenerator generator { builder }; + generator.append(R"~~~( +#pragma once + +#include +#include + +namespace Web::CSS { + +enum class ValueID { + Invalid, +)~~~"); + + identifier_data.for_each([&](auto& name) { + auto member_generator = generator.fork(); + member_generator.set("name:titlecase", title_casify(name.to_string())); + + member_generator.append(R"~~~( + @name:titlecase@, +)~~~"); + }); + + generator.append(R"~~~( +}; + +ValueID value_id_from_string(StringView); +const char* string_from_value_id(ValueID); + +} + +)~~~"); + + TRY(file.write(generator.as_string_view().bytes())); + return {}; +} + +ErrorOr generate_implementation_file(JsonArray& identifier_data, Core::Stream::File& file) +{ + StringBuilder builder; + SourceGenerator generator { builder }; + + generator.append(R"~~~( +#include +#include + +namespace Web::CSS { + +ValueID value_id_from_string(StringView string) +{ +)~~~"); + + identifier_data.for_each([&](auto& name) { + auto member_generator = generator.fork(); + member_generator.set("name", name.to_string()); + member_generator.set("name:titlecase", title_casify(name.to_string())); + member_generator.append(R"~~~( + if (string.equals_ignoring_case("@name@")) + return ValueID::@name:titlecase@; +)~~~"); + }); + + generator.append(R"~~~( + return ValueID::Invalid; +} + +const char* string_from_value_id(ValueID value_id) { + switch (value_id) { +)~~~"); + + identifier_data.for_each([&](auto& name) { + auto member_generator = generator.fork(); + member_generator.set("name", name.to_string()); + member_generator.set("name:titlecase", title_casify(name.to_string())); + member_generator.append(R"~~~( + case ValueID::@name:titlecase@: + return "@name@"; + )~~~"); + }); + + generator.append(R"~~~( + default: + return "(invalid CSS::ValueID)"; + } +} + +} // namespace Web::CSS +)~~~"); + + TRY(file.write(generator.as_string_view().bytes())); + return {}; +} diff --git a/Meta/Lagom/Tools/CodeGenerators/LibWeb/Generate_CSS_ValueID_cpp.cpp b/Meta/Lagom/Tools/CodeGenerators/LibWeb/Generate_CSS_ValueID_cpp.cpp deleted file mode 100644 index db3b671796..0000000000 --- a/Meta/Lagom/Tools/CodeGenerators/LibWeb/Generate_CSS_ValueID_cpp.cpp +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (c) 2020, Andreas Kling - * - * SPDX-License-Identifier: BSD-2-Clause - */ - -#include "GeneratorUtil.h" -#include -#include -#include - -ErrorOr serenity_main(Main::Arguments arguments) -{ - if (arguments.argc != 2) { - warnln("usage: {} ", arguments.strings[0]); - return 1; - } - - auto json = TRY(read_entire_file_as_json(arguments.strings[1])); - VERIFY(json.is_array()); - - StringBuilder builder; - SourceGenerator generator { builder }; - - generator.append(R"~~~( -#include -#include - -namespace Web::CSS { - -ValueID value_id_from_string(StringView string) -{ -)~~~"); - - json.as_array().for_each([&](auto& name) { - auto member_generator = generator.fork(); - member_generator.set("name", name.to_string()); - member_generator.set("name:titlecase", title_casify(name.to_string())); - member_generator.append(R"~~~( - if (string.equals_ignoring_case("@name@")) - return ValueID::@name:titlecase@; -)~~~"); - }); - - generator.append(R"~~~( - return ValueID::Invalid; -} - -const char* string_from_value_id(ValueID value_id) { - switch (value_id) { -)~~~"); - - json.as_array().for_each([&](auto& name) { - auto member_generator = generator.fork(); - member_generator.set("name", name.to_string()); - member_generator.set("name:titlecase", title_casify(name.to_string())); - member_generator.append(R"~~~( - case ValueID::@name:titlecase@: - return "@name@"; - )~~~"); - }); - - generator.append(R"~~~( - default: - return "(invalid CSS::ValueID)"; - } -} - -} // namespace Web::CSS -)~~~"); - - outln("{}", generator.as_string_view()); - return 0; -} diff --git a/Meta/Lagom/Tools/CodeGenerators/LibWeb/Generate_CSS_ValueID_h.cpp b/Meta/Lagom/Tools/CodeGenerators/LibWeb/Generate_CSS_ValueID_h.cpp deleted file mode 100644 index c8f1afe096..0000000000 --- a/Meta/Lagom/Tools/CodeGenerators/LibWeb/Generate_CSS_ValueID_h.cpp +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (c) 2020, Andreas Kling - * - * SPDX-License-Identifier: BSD-2-Clause - */ - -#include "GeneratorUtil.h" -#include -#include -#include - -ErrorOr serenity_main(Main::Arguments arguments) -{ - if (arguments.argc != 2) { - warnln("usage: {} ", arguments.strings[0]); - return 1; - } - - auto json = TRY(read_entire_file_as_json(arguments.strings[1])); - VERIFY(json.is_array()); - - StringBuilder builder; - SourceGenerator generator { builder }; - generator.append(R"~~~( -#pragma once - -#include -#include - -namespace Web::CSS { - -enum class ValueID { - Invalid, -)~~~"); - - json.as_array().for_each([&](auto& name) { - auto member_generator = generator.fork(); - member_generator.set("name:titlecase", title_casify(name.to_string())); - - member_generator.append(R"~~~( - @name:titlecase@, -)~~~"); - }); - - generator.append(R"~~~( -}; - -ValueID value_id_from_string(StringView); -const char* string_from_value_id(ValueID); - -} - -)~~~"); - - outln("{}", generator.as_string_view()); - return 0; -} diff --git a/Userland/Libraries/LibWeb/CMakeLists.txt b/Userland/Libraries/LibWeb/CMakeLists.txt index 0d6b393b2b..d433c8e832 100644 --- a/Userland/Libraries/LibWeb/CMakeLists.txt +++ b/Userland/Libraries/LibWeb/CMakeLists.txt @@ -638,31 +638,15 @@ add_custom_command( add_custom_target(generate_PropertyID.cpp DEPENDS CSS/PropertyID.cpp) add_dependencies(all_generated generate_PropertyID.cpp) -add_custom_command( - OUTPUT CSS/ValueID.h - COMMAND "${CMAKE_COMMAND}" -E make_directory CSS - COMMAND "$" "${CMAKE_CURRENT_SOURCE_DIR}/CSS/Identifiers.json" > CSS/ValueID.h.tmp - COMMAND "${CMAKE_COMMAND}" -E copy_if_different CSS/ValueID.h.tmp CSS/ValueID.h - COMMAND "${CMAKE_COMMAND}" -E remove CSS/ValueID.h.tmp - VERBATIM - DEPENDS Lagom::Generate_CSS_ValueID_h - MAIN_DEPENDENCY CSS/Identifiers.json +invoke_generator( + "ValueID" + Lagom::GenerateCSSValueID + "${CMAKE_CURRENT_SOURCE_DIR}/CSS/Identifiers.json" + "" + "CSS/ValueID.h" + "CSS/ValueID.cpp" + arguments -j "${CMAKE_CURRENT_SOURCE_DIR}/CSS/Identifiers.json" ) -add_custom_target(generate_ValueID.h DEPENDS CSS/ValueID.h) -add_dependencies(all_generated generate_ValueID.h) - -add_custom_command( - OUTPUT CSS/ValueID.cpp - COMMAND "${CMAKE_COMMAND}" -E make_directory CSS - COMMAND "$" "${CMAKE_CURRENT_SOURCE_DIR}/CSS/Identifiers.json" > CSS/ValueID.cpp.tmp - COMMAND "${CMAKE_COMMAND}" -E copy_if_different CSS/ValueID.cpp.tmp CSS/ValueID.cpp - COMMAND "${CMAKE_COMMAND}" -E remove CSS/ValueID.cpp.tmp - VERBATIM - DEPENDS Lagom::Generate_CSS_ValueID_cpp - MAIN_DEPENDENCY CSS/Identifiers.json -) -add_custom_target(generate_ValueID.cpp DEPENDS CSS/ValueID.cpp) -add_dependencies(all_generated generate_ValueID.cpp) add_custom_command( OUTPUT CSS/DefaultStyleSheetSource.cpp