Meta: Don't assume how each generator wants to generate keyed map names

The generate_mapping helper generates a series of structs like:

    Array<SomeType, 1> s_mapping_key_0 {};
    Array<SomeType, 2> s_mapping_key_1 {};
    Array<SomeType, 3> s_mapping_key_2 {};
    Array<Span<SomeType const>> s_mapping { {
        s_mapping_key_0.span(),
        s_mapping_key_1.span(),
        s_mapping_key_2.span(),
    } };

Where the names of the struct were generated by the format_mapping_name
lambda inside the helper. Rather than this lambda making assumptions on
how each generator wants to name its structs, add a parameter for the
caller to provide a naming formatter.

This is because the TimeZoneData generator will want pretty specific
identifier formatting rules.
This commit is contained in:
Timothy Flynn 2022-01-10 16:34:55 -05:00 committed by Linus Groh
parent 6da1bfeeea
commit b543c3e490
Notes: sideshowbarker 2024-07-17 21:13:47 +09:00
3 changed files with 14 additions and 8 deletions

View file

@ -399,12 +399,18 @@ enum class @name@ : @underlying@ {)~~~");
)~~~");
}
template<typename LocalesType, typename ListFormatter>
void generate_mapping(SourceGenerator& generator, LocalesType const& locales, StringView type, StringView name, StringView format, ListFormatter&& format_list)
template<typename LocalesType, typename IdentifierFormatter, typename ListFormatter>
void generate_mapping(SourceGenerator& generator, LocalesType const& locales, StringView type, StringView name, StringView format, IdentifierFormatter&& format_identifier, ListFormatter&& format_list)
{
auto format_mapping_name = [](StringView format, StringView name) {
auto mapping_name = name.to_lowercase_string().replace("-"sv, "_"sv, true).replace("/"sv, "_"sv, true);
return String::formatted(format, mapping_name);
auto format_mapping_name = [&](StringView format, StringView name) {
String mapping_name;
if constexpr (IsNullPointer<IdentifierFormatter>)
mapping_name = name.replace("-"sv, "_"sv, true);
else
mapping_name = format_identifier(type, name);
return String::formatted(format, mapping_name.to_lowercase());
};
Vector<String> mapping_names;