From cc5c707649eb461e47f48a87849101aa51e21d0d Mon Sep 17 00:00:00 2001 From: Timothy Flynn Date: Fri, 8 Jul 2022 07:52:54 -0400 Subject: [PATCH] LibJS+LibUnicode: Do not generate the PluralCategory enum The PluralCategory enum is currently generated for plural rules. Instead of generating it, this moves the enum to the public LibUnicode header. While it was nice to auto-discover these values, they are well defined by TR-35, and we will need their values from within the number format code generator (which can't rely on the plural rules generator having run yet). Further, number format will require additional values in the enum that plural rules doesn't know about. --- .../LibUnicode/GenerateUnicodePluralRules.cpp | 23 +-------- .../GenerateUnicodeRelativeTimeFormat.cpp | 2 +- .../LibJS/Runtime/Intl/PluralRules.cpp | 2 +- Userland/Libraries/LibUnicode/PluralRules.cpp | 22 --------- Userland/Libraries/LibUnicode/PluralRules.h | 49 ++++++++++++++++++- 5 files changed, 50 insertions(+), 48 deletions(-) diff --git a/Meta/Lagom/Tools/CodeGenerators/LibUnicode/GenerateUnicodePluralRules.cpp b/Meta/Lagom/Tools/CodeGenerators/LibUnicode/GenerateUnicodePluralRules.cpp index 8582b786f3..d1577d0a50 100644 --- a/Meta/Lagom/Tools/CodeGenerators/LibUnicode/GenerateUnicodePluralRules.cpp +++ b/Meta/Lagom/Tools/CodeGenerators/LibUnicode/GenerateUnicodePluralRules.cpp @@ -207,7 +207,6 @@ struct UnicodeLocaleData { UniqueStringStorage unique_strings; HashMap locales; - Vector categories; }; static Relation parse_relation(StringView relation) @@ -342,9 +341,6 @@ static ErrorOr parse_plural_rules(String core_supplemental_path, StringVie auto category = key.substring_view(rule_prefix.length()); parse_condition(category, condition.as_string(), locale->rules_for_form(form)); - - if (!locale_data.categories.contains_slow(category)) - locale_data.categories.append(category); }); }); }); @@ -385,7 +381,7 @@ static ErrorOr parse_all_locales(String core_path, String locale_names_pat return {}; } -static ErrorOr generate_unicode_locale_header(Core::Stream::BufferedFile& file, UnicodeLocaleData& locale_data) +static ErrorOr generate_unicode_locale_header(Core::Stream::BufferedFile& file, UnicodeLocaleData&) { StringBuilder builder; SourceGenerator generator { builder }; @@ -398,8 +394,6 @@ static ErrorOr generate_unicode_locale_header(Core::Stream::BufferedFile& namespace Unicode { )~~~"); - generate_enum(generator, format_identifier, "PluralCategory"sv, {}, locale_data.categories); - generator.append(R"~~~( } )~~~"); @@ -418,8 +412,6 @@ static ErrorOr generate_unicode_locale_implementation(Core::Stream::Buffer generator.append(R"~~~( #include -#include -#include #include #include #include @@ -437,17 +429,6 @@ static PluralCategory default_category(PluralOperands) )~~~"); - auto append_string_conversions = [&](StringView enum_title, StringView enum_snake, auto const& values) { - HashValueMap hashes; - hashes.ensure_capacity(values.size()); - - for (auto const& value : values) - hashes.set(value.hash(), format_identifier(enum_title, value)); - - generate_value_from_string(generator, "{}_from_string"sv, enum_title, enum_snake, move(hashes)); - generate_value_to_string(generator, "{}_to_string"sv, enum_title, enum_snake, format_identifier, values); - }; - auto append_rules = [&](auto form, auto const& locale, auto const& rules) { if (rules.is_empty()) return; @@ -518,8 +499,6 @@ static constexpr Array @name@ { { PluralCategory::Other) generator.append("} };"); }; - append_string_conversions("PluralCategory"sv, "plural_category"sv, locale_data.categories); - for (auto [locale, rules] : locale_data.locales) { append_rules("cardinal"sv, locale, rules.cardinal_rules); append_rules("ordinal"sv, locale, rules.ordinal_rules); diff --git a/Meta/Lagom/Tools/CodeGenerators/LibUnicode/GenerateUnicodeRelativeTimeFormat.cpp b/Meta/Lagom/Tools/CodeGenerators/LibUnicode/GenerateUnicodeRelativeTimeFormat.cpp index 03ff6c7d36..02ee5b4d54 100644 --- a/Meta/Lagom/Tools/CodeGenerators/LibUnicode/GenerateUnicodeRelativeTimeFormat.cpp +++ b/Meta/Lagom/Tools/CodeGenerators/LibUnicode/GenerateUnicodeRelativeTimeFormat.cpp @@ -203,8 +203,8 @@ static ErrorOr generate_unicode_locale_implementation(Core::Stream::Buffer #include #include #include +#include #include -#include #include namespace Unicode { diff --git a/Userland/Libraries/LibJS/Runtime/Intl/PluralRules.cpp b/Userland/Libraries/LibJS/Runtime/Intl/PluralRules.cpp index b4d4bfe963..5eaafa6c95 100644 --- a/Userland/Libraries/LibJS/Runtime/Intl/PluralRules.cpp +++ b/Userland/Libraries/LibJS/Runtime/Intl/PluralRules.cpp @@ -103,7 +103,7 @@ Unicode::PluralCategory resolve_plural(GlobalObject& global_object, PluralRules // 4. If n is not a finite Number, then if (!number.is_finite_number()) { // a. Return "other". - return Unicode::plural_category_from_string("other"sv).value(); + return Unicode::PluralCategory::Other; } // 5. Let locale be pluralRules.[[Locale]]. diff --git a/Userland/Libraries/LibUnicode/PluralRules.cpp b/Userland/Libraries/LibUnicode/PluralRules.cpp index 285a49e006..202fb57b14 100644 --- a/Userland/Libraries/LibUnicode/PluralRules.cpp +++ b/Userland/Libraries/LibUnicode/PluralRules.cpp @@ -6,18 +6,8 @@ #include -#if ENABLE_UNICODE_DATA -# include -#endif - namespace Unicode { -#if !ENABLE_UNICODE_DATA -enum class PluralCategory : u8 { - Other, -}; -#endif - PluralForm plural_form_from_string(StringView plural_form) { if (plural_form == "cardinal"sv) @@ -39,18 +29,6 @@ StringView plural_form_to_string(PluralForm plural_form) } } -Optional __attribute__((weak)) plural_category_from_string(StringView category) -{ - VERIFY(category == "other"sv); - return PluralCategory::Other; -} - -StringView __attribute__((weak)) plural_category_to_string(PluralCategory category) -{ - VERIFY(category == PluralCategory::Other); - return "other"sv; -} - PluralCategory __attribute__((weak)) determine_plural_category(StringView, PluralForm, PluralOperands) { return PluralCategory::Other; diff --git a/Userland/Libraries/LibUnicode/PluralRules.h b/Userland/Libraries/LibUnicode/PluralRules.h index f56e72321c..e1d4060e7c 100644 --- a/Userland/Libraries/LibUnicode/PluralRules.h +++ b/Userland/Libraries/LibUnicode/PluralRules.h @@ -18,6 +18,15 @@ enum class PluralForm { Ordinal, }; +enum class PluralCategory : u8 { + Other, + Zero, + One, + Two, + Few, + Many, +}; + // https://unicode.org/reports/tr35/tr35-numbers.html#Plural_Operand_Meanings struct PluralOperands { static constexpr StringView symbol_to_variable_name(char symbol) @@ -57,8 +66,44 @@ struct PluralOperands { PluralForm plural_form_from_string(StringView plural_form); StringView plural_form_to_string(PluralForm plural_form); -Optional plural_category_from_string(StringView category); -StringView plural_category_to_string(PluralCategory category); +// NOTE: This must be defined inline to be callable from the code generators. +constexpr PluralCategory plural_category_from_string(StringView category) +{ + if (category == "other"sv) + return PluralCategory::Other; + if (category == "zero"sv) + return PluralCategory::Zero; + if (category == "one"sv) + return PluralCategory::One; + if (category == "two"sv) + return PluralCategory::Two; + if (category == "few"sv) + return PluralCategory::Few; + if (category == "many"sv) + return PluralCategory::Many; + VERIFY_NOT_REACHED(); +} + +// NOTE: This must be defined inline to be callable from the code generators. +constexpr StringView plural_category_to_string(PluralCategory category) +{ + switch (category) { + case PluralCategory::Other: + return "other"sv; + case PluralCategory::Zero: + return "zero"sv; + case PluralCategory::One: + return "one"sv; + case PluralCategory::Two: + return "two"sv; + case PluralCategory::Few: + return "few"sv; + case PluralCategory::Many: + return "many"sv; + } + + VERIFY_NOT_REACHED(); +} PluralCategory determine_plural_category(StringView locale, PluralForm form, PluralOperands operands); Span available_plural_categories(StringView locale, PluralForm form);