From a13fa15a30cda3fe282a57bd7583252c25ccca9c Mon Sep 17 00:00:00 2001 From: Timothy Flynn Date: Wed, 17 Nov 2021 08:20:19 -0500 Subject: [PATCH] LibUnicode: Generate default-content locales as aliases Previously, we were just copying the locale data into default-content locales (for example, copying the "en" data into "en-US"). Instead, we can just define the default-content locales as aliases to their main locales. --- .../LibUnicode/GenerateUnicodeLocale.cpp | 43 +++++++++++++++-- .../GenerateUnicodeNumberFormat.cpp | 2 - .../CodeGenerators/LibUnicode/GeneratorUtil.h | 47 ++++--------------- 3 files changed, 49 insertions(+), 43 deletions(-) diff --git a/Meta/Lagom/Tools/CodeGenerators/LibUnicode/GenerateUnicodeLocale.cpp b/Meta/Lagom/Tools/CodeGenerators/LibUnicode/GenerateUnicodeLocale.cpp index 5da4bf4371..78e64a861c 100644 --- a/Meta/Lagom/Tools/CodeGenerators/LibUnicode/GenerateUnicodeLocale.cpp +++ b/Meta/Lagom/Tools/CodeGenerators/LibUnicode/GenerateUnicodeLocale.cpp @@ -55,7 +55,10 @@ struct LanguageMapping { struct UnicodeLocaleData { UniqueStringStorage unique_strings; + HashMap locales; + Vector locale_aliases; + Vector languages; Vector territories; Vector scripts; @@ -392,6 +395,38 @@ static void parse_numeric_keywords(String locale_numbers_path, UnicodeLocaleData locale_data.keywords.append(key); } +static void parse_default_content_locales(String core_path, UnicodeLocaleData& locale_data) +{ + LexicalPath default_content_path(move(core_path)); + default_content_path = default_content_path.append("defaultContent.json"sv); + VERIFY(Core::File::exists(default_content_path.string())); + + auto default_content_file_or_error = Core::File::open(default_content_path.string(), Core::OpenMode::ReadOnly); + VERIFY(!default_content_file_or_error.is_error()); + + auto default_content = JsonValue::from_string(default_content_file_or_error.value()->read_all()).release_value_but_fixme_should_propagate_errors(); + auto const& default_content_array = default_content.as_object().get("defaultContent"sv); + + default_content_array.as_array().for_each([&](JsonValue const& value) { + auto locale = value.as_string(); + StringView default_locale = locale; + + while (true) { + if (locale_data.locales.contains(default_locale)) + break; + + auto pos = default_locale.find_last('-'); + if (!pos.has_value()) + return; + + default_locale = default_locale.substring_view(0, *pos); + } + + if (default_locale != locale) + locale_data.locale_aliases.append({ default_locale, move(locale) }); + }); +} + static void parse_all_locales(String core_path, String locale_names_path, String misc_path, String numbers_path, UnicodeLocaleData& locale_data) { auto identity_iterator = path_to_dir_iterator(locale_names_path); @@ -504,7 +539,7 @@ namespace Unicode { )~~~"); auto locales = locale_data.locales.keys(); - generate_enum(generator, format_identifier, "Locale"sv, "None"sv, locales); + generate_enum(generator, format_identifier, "Locale"sv, "None"sv, locales, locale_data.locale_aliases); generate_enum(generator, format_identifier, "Language"sv, {}, locale_data.languages); generate_enum(generator, format_identifier, "Territory"sv, {}, locale_data.territories); generate_enum(generator, format_identifier, "ScriptTag"sv, {}, locale_data.scripts); @@ -885,12 +920,14 @@ Optional get_locale_@enum_snake@_mapping(StringView locale, StringVi )~~~"); }; - auto append_from_string = [&](StringView enum_title, StringView enum_snake, auto const& values) { + auto append_from_string = [&](StringView enum_title, StringView enum_snake, auto const& values, Vector const& aliases = {}) { HashValueMap hashes; hashes.ensure_capacity(values.size()); for (auto const& value : values) hashes.set(value.hash(), format_identifier(enum_title, value)); + for (auto const& alias : aliases) + hashes.set(alias.alias.hash(), format_identifier(enum_title, alias.alias)); generate_value_from_string(generator, "{}_from_string"sv, enum_title, enum_snake, move(hashes)); }; @@ -905,7 +942,7 @@ Optional get_locale_@enum_snake@_mapping(StringView locale, StringVi generate_value_from_string(generator, "resolve_{}_alias"sv, s_string_index_type, enum_snake, move(hashes), "StringView"sv, "s_string_list[{}]"sv); }; - append_from_string("Locale"sv, "locale"sv, locale_data.locales.keys()); + append_from_string("Locale"sv, "locale"sv, locale_data.locales.keys(), locale_data.locale_aliases); append_mapping_search("language"sv, "language"sv, "s_languages"sv); append_from_string("Language"sv, "language"sv, locale_data.languages); diff --git a/Meta/Lagom/Tools/CodeGenerators/LibUnicode/GenerateUnicodeNumberFormat.cpp b/Meta/Lagom/Tools/CodeGenerators/LibUnicode/GenerateUnicodeNumberFormat.cpp index 6d54fe120f..b7b354874a 100644 --- a/Meta/Lagom/Tools/CodeGenerators/LibUnicode/GenerateUnicodeNumberFormat.cpp +++ b/Meta/Lagom/Tools/CodeGenerators/LibUnicode/GenerateUnicodeNumberFormat.cpp @@ -488,8 +488,6 @@ static void parse_all_locales(String core_path, String numbers_path, String unit auto& locale = locale_data.locales.ensure(*language); parse_units(units_path, locale_data, locale); } - - parse_default_content_locales(move(core_path), locale_data); } static String format_identifier(StringView owner, String identifier) diff --git a/Meta/Lagom/Tools/CodeGenerators/LibUnicode/GeneratorUtil.h b/Meta/Lagom/Tools/CodeGenerators/LibUnicode/GeneratorUtil.h index 5e2b83df5d..95637379bf 100644 --- a/Meta/Lagom/Tools/CodeGenerators/LibUnicode/GeneratorUtil.h +++ b/Meta/Lagom/Tools/CodeGenerators/LibUnicode/GeneratorUtil.h @@ -8,10 +8,6 @@ #include #include -#include -#include -#include -#include #include #include #include @@ -156,39 +152,6 @@ inline Core::DirIterator path_to_dir_iterator(String path) return iterator; } -template -void parse_default_content_locales(String core_path, LocaleDataType& locale_data) -{ - LexicalPath default_content_path(move(core_path)); - default_content_path = default_content_path.append("defaultContent.json"sv); - VERIFY(Core::File::exists(default_content_path.string())); - - auto default_content_file_or_error = Core::File::open(default_content_path.string(), Core::OpenMode::ReadOnly); - VERIFY(!default_content_file_or_error.is_error()); - - auto default_content = JsonValue::from_string(default_content_file_or_error.value()->read_all()).release_value_but_fixme_should_propagate_errors(); - - auto const& default_content_array = default_content.as_object().get("defaultContent"sv); - - default_content_array.as_array().for_each([&](JsonValue const& value) { - auto locale = value.as_string(); - StringView default_locale = locale; - - while (true) { - if (locale_data.locales.contains(default_locale)) - break; - - auto pos = default_locale.find_last('-'); - if (!pos.has_value()) - return; - - default_locale = default_locale.substring_view(0, *pos); - } - - locale_data.locales.set(locale, locale_data.locales.get(default_locale).value()); - }); -} - inline void ensure_from_string_types_are_generated(SourceGenerator& generator) { static bool generated_from_string_types = false; @@ -275,9 +238,10 @@ Optional<@return_type@> @method_name@(StringView key) } template -void generate_enum(SourceGenerator& generator, IdentifierFormatter&& format_identifier, StringView name, StringView default_, Vector& values) +void generate_enum(SourceGenerator& generator, IdentifierFormatter&& format_identifier, StringView name, StringView default_, Vector& values, Vector aliases = {}) { quick_sort(values); + quick_sort(aliases, [](auto const& alias1, auto const& alias2) { return alias1.alias < alias2.alias; }); generator.set("name", name); generator.set("underlying", ((values.size() + !default_.is_empty()) < 256) ? "u8"sv : "u16"sv); @@ -297,6 +261,13 @@ enum class @name@ : @underlying@ {)~~~"); @value@,)~~~"); } + for (auto const& alias : aliases) { + generator.set("alias", format_identifier(name, alias.alias)); + generator.set("value", format_identifier(name, alias.name)); + generator.append(R"~~~( + @alias@ = @value@,)~~~"); + } + generator.append(R"~~~( }; )~~~");