Browse Source

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.
Timothy Flynn 3 years ago
parent
commit
a13fa15a30

+ 40 - 3
Meta/Lagom/Tools/CodeGenerators/LibUnicode/GenerateUnicodeLocale.cpp

@@ -55,7 +55,10 @@ struct LanguageMapping {
 
 
 struct UnicodeLocaleData {
 struct UnicodeLocaleData {
     UniqueStringStorage<StringIndexType> unique_strings;
     UniqueStringStorage<StringIndexType> unique_strings;
+
     HashMap<String, Locale> locales;
     HashMap<String, Locale> locales;
+    Vector<Alias> locale_aliases;
+
     Vector<String> languages;
     Vector<String> languages;
     Vector<String> territories;
     Vector<String> territories;
     Vector<String> scripts;
     Vector<String> scripts;
@@ -392,6 +395,38 @@ static void parse_numeric_keywords(String locale_numbers_path, UnicodeLocaleData
         locale_data.keywords.append(key);
         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)
 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);
     auto identity_iterator = path_to_dir_iterator(locale_names_path);
@@ -504,7 +539,7 @@ namespace Unicode {
 )~~~");
 )~~~");
 
 
     auto locales = locale_data.locales.keys();
     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, "Language"sv, {}, locale_data.languages);
     generate_enum(generator, format_identifier, "Territory"sv, {}, locale_data.territories);
     generate_enum(generator, format_identifier, "Territory"sv, {}, locale_data.territories);
     generate_enum(generator, format_identifier, "ScriptTag"sv, {}, locale_data.scripts);
     generate_enum(generator, format_identifier, "ScriptTag"sv, {}, locale_data.scripts);
@@ -885,12 +920,14 @@ Optional<StringView> 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<Alias> const& aliases = {}) {
         HashValueMap<String> hashes;
         HashValueMap<String> hashes;
         hashes.ensure_capacity(values.size());
         hashes.ensure_capacity(values.size());
 
 
         for (auto const& value : values)
         for (auto const& value : values)
             hashes.set(value.hash(), format_identifier(enum_title, value));
             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));
         generate_value_from_string(generator, "{}_from_string"sv, enum_title, enum_snake, move(hashes));
     };
     };
@@ -905,7 +942,7 @@ Optional<StringView> 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);
         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_mapping_search("language"sv, "language"sv, "s_languages"sv);
     append_from_string("Language"sv, "language"sv, locale_data.languages);
     append_from_string("Language"sv, "language"sv, locale_data.languages);

+ 0 - 2
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);
         auto& locale = locale_data.locales.ensure(*language);
         parse_units(units_path, locale_data, locale);
         parse_units(units_path, locale_data, locale);
     }
     }
-
-    parse_default_content_locales(move(core_path), locale_data);
 }
 }
 
 
 static String format_identifier(StringView owner, String identifier)
 static String format_identifier(StringView owner, String identifier)

+ 9 - 38
Meta/Lagom/Tools/CodeGenerators/LibUnicode/GeneratorUtil.h

@@ -8,10 +8,6 @@
 
 
 #include <AK/Format.h>
 #include <AK/Format.h>
 #include <AK/HashMap.h>
 #include <AK/HashMap.h>
-#include <AK/JsonArray.h>
-#include <AK/JsonObject.h>
-#include <AK/JsonParser.h>
-#include <AK/JsonValue.h>
 #include <AK/LexicalPath.h>
 #include <AK/LexicalPath.h>
 #include <AK/Optional.h>
 #include <AK/Optional.h>
 #include <AK/QuickSort.h>
 #include <AK/QuickSort.h>
@@ -156,39 +152,6 @@ inline Core::DirIterator path_to_dir_iterator(String path)
     return iterator;
     return iterator;
 }
 }
 
 
-template<typename LocaleDataType>
-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)
 inline void ensure_from_string_types_are_generated(SourceGenerator& generator)
 {
 {
     static bool generated_from_string_types = false;
     static bool generated_from_string_types = false;
@@ -275,9 +238,10 @@ Optional<@return_type@> @method_name@(StringView key)
 }
 }
 
 
 template<typename IdentifierFormatter>
 template<typename IdentifierFormatter>
-void generate_enum(SourceGenerator& generator, IdentifierFormatter&& format_identifier, StringView name, StringView default_, Vector<String>& values)
+void generate_enum(SourceGenerator& generator, IdentifierFormatter&& format_identifier, StringView name, StringView default_, Vector<String>& values, Vector<Alias> aliases = {})
 {
 {
     quick_sort(values);
     quick_sort(values);
+    quick_sort(aliases, [](auto const& alias1, auto const& alias2) { return alias1.alias < alias2.alias; });
 
 
     generator.set("name", name);
     generator.set("name", name);
     generator.set("underlying", ((values.size() + !default_.is_empty()) < 256) ? "u8"sv : "u16"sv);
     generator.set("underlying", ((values.size() + !default_.is_empty()) < 256) ? "u8"sv : "u16"sv);
@@ -297,6 +261,13 @@ enum class @name@ : @underlying@ {)~~~");
     @value@,)~~~");
     @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"~~~(
     generator.append(R"~~~(
 };
 };
 )~~~");
 )~~~");