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.
This commit is contained in:
Sam Atkins 2025-03-26 17:06:33 +00:00
parent 2b67cb5f98
commit fbdabace8e
Notes: github-actions[bot] 2025-03-27 11:54:06 +00:00
2 changed files with 29 additions and 27 deletions

View file

@ -43,27 +43,6 @@ ErrorOr<int> 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<void> 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));

View file

@ -1,6 +1,7 @@
/*
* Copyright (c) 2019-2021, Andreas Kling <andreas@ladybird.org>
* Copyright (c) 2022-2023, Sam Atkins <atkinssj@serenityos.org>
* Copyright (c) 2022-2025, Sam Atkins <sam@ladybird.org>
* Copyright (c) 2024, Luke Wilde <luke@ladybird.org>
*
* 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<JsonValue> read_entire_file_as_json(StringView filename)