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);