From fbdabace8eb508ce0139676062e062655299ea54 Mon Sep 17 00:00:00 2001 From: Sam Atkins Date: Wed, 26 Mar 2025 17:06:33 +0000 Subject: [PATCH] CodeGenerators: Move some utilities out of GenerateCSSStyleProperties These will be used by a similar generator for CSS at-rule descriptors. For `get_snake_case_function_name_for_css_property_name()`, I've rolled its behaviour into `snake_casify()` with an optional ability to trim leading underscores. --- .../LibWeb/GenerateCSSStyleProperties.cpp | 27 ++--------------- .../CodeGenerators/LibWeb/GeneratorUtil.h | 29 +++++++++++++++++-- 2 files changed, 29 insertions(+), 27 deletions(-) diff --git a/Meta/Lagom/Tools/CodeGenerators/LibWeb/GenerateCSSStyleProperties.cpp b/Meta/Lagom/Tools/CodeGenerators/LibWeb/GenerateCSSStyleProperties.cpp index 1d162d9f6ef..952a3aaf57b 100644 --- a/Meta/Lagom/Tools/CodeGenerators/LibWeb/GenerateCSSStyleProperties.cpp +++ b/Meta/Lagom/Tools/CodeGenerators/LibWeb/GenerateCSSStyleProperties.cpp @@ -43,27 +43,6 @@ ErrorOr serenity_main(Main::Arguments arguments) return 0; } -static String get_snake_case_function_name_for_css_property_name(StringView name) -{ - auto snake_case_name = snake_casify(name); - if (snake_case_name.starts_with('_')) - return MUST(snake_case_name.substring_from_byte_offset(1)); - - return snake_case_name; -} - -static String make_name_acceptable_cpp(String const& name) -{ - if (name.is_one_of("float")) { - StringBuilder builder; - builder.append(name); - builder.append('_'); - return MUST(builder.to_string()); - } - - return name; -} - ErrorOr generate_header_file(JsonObject& properties, Core::File& file) { StringBuilder builder; @@ -83,7 +62,7 @@ public: properties.for_each_member([&](auto& name, auto&) { auto declaration_generator = generator.fork(); - auto snake_case_name = get_snake_case_function_name_for_css_property_name(name); + auto snake_case_name = snake_casify(name, TrimLeadingUnderscores::Yes); declaration_generator.set("name:acceptable_cpp", make_name_acceptable_cpp(snake_case_name)); declaration_generator.append(R"~~~( @@ -125,7 +104,7 @@ namespace Web::Bindings { auto definition_generator = generator.fork(); definition_generator.set("name", name); - auto snake_case_name = get_snake_case_function_name_for_css_property_name(name); + auto snake_case_name = snake_casify(name, TrimLeadingUnderscores::Yes); definition_generator.set("name:acceptable_cpp", make_name_acceptable_cpp(snake_case_name)); definition_generator.append(R"~~~( @@ -163,7 +142,7 @@ interface mixin GeneratedCSSStyleProperties { member_generator.set("name", name); - auto snake_case_name = get_snake_case_function_name_for_css_property_name(name); + auto snake_case_name = snake_casify(name, TrimLeadingUnderscores::Yes); member_generator.set("name:snakecase", snake_case_name); member_generator.set("name:acceptable_cpp", make_name_acceptable_cpp(snake_case_name)); diff --git a/Meta/Lagom/Tools/CodeGenerators/LibWeb/GeneratorUtil.h b/Meta/Lagom/Tools/CodeGenerators/LibWeb/GeneratorUtil.h index 8cb9fe0d174..9a8b3261f85 100644 --- a/Meta/Lagom/Tools/CodeGenerators/LibWeb/GeneratorUtil.h +++ b/Meta/Lagom/Tools/CodeGenerators/LibWeb/GeneratorUtil.h @@ -1,6 +1,7 @@ /* * Copyright (c) 2019-2021, Andreas Kling - * Copyright (c) 2022-2023, Sam Atkins + * Copyright (c) 2022-2025, Sam Atkins + * Copyright (c) 2024, Luke Wilde * * SPDX-License-Identifier: BSD-2-Clause */ @@ -49,11 +50,33 @@ inline String camel_casify(StringView dashy_name) return MUST(builder.to_string()); } -inline String snake_casify(StringView dashy_name) +enum class TrimLeadingUnderscores : u8 { + No, + Yes, +}; +inline String snake_casify(StringView dashy_name, TrimLeadingUnderscores trim_leading_underscores = TrimLeadingUnderscores::No) { // FIXME: We don't really need to convert dashy_name to a String first, but currently // all the `replace` functions that take a StringView return ByteString. - return MUST(MUST(String::from_utf8(dashy_name)).replace("-"sv, "_"sv, ReplaceMode::All)); + auto snake_case = MUST(MUST(String::from_utf8(dashy_name)).replace("-"sv, "_"sv, ReplaceMode::All)); + + if (trim_leading_underscores == TrimLeadingUnderscores::Yes && snake_case.starts_with('_')) { + return MUST(snake_case.trim("_"sv, TrimMode::Left)); + } + + return snake_case; +} + +inline String make_name_acceptable_cpp(String const& name) +{ + if (name.is_one_of("float")) { + StringBuilder builder; + builder.append(name); + builder.append('_'); + return MUST(builder.to_string()); + } + + return name; } inline ErrorOr read_entire_file_as_json(StringView filename)