1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 14:18:12 +00:00

LibJS: Add an overload of ResolvePlural for use without PluralRules

The NumberFormat spec casually indicates the need for a PluralRules
object without explicity saying so, with text such as:

"which may depend on x in languages having different plural forms."

Other implementations actually do create a PluralRules object to resolve
those cases with ResolvePlural. However, ResolvePlural doesn't need much
from PluralRules to operate, so this can be abstracted out for use in
NumberFormat without the need to allocate a PluralRules instance.
This commit is contained in:
Timothy Flynn 2022-07-08 11:52:18 -04:00 committed by Linus Groh
parent 1fc87d1529
commit 6d9b779757
2 changed files with 9 additions and 3 deletions

View file

@ -95,6 +95,12 @@ Unicode::PluralCategory plural_rule_select(StringView locale, Unicode::PluralFor
// 16.5.3 ResolvePlural ( pluralRules, n ), https://tc39.es/ecma402/#sec-resolveplural
Unicode::PluralCategory resolve_plural(GlobalObject& global_object, PluralRules const& plural_rules, Value number)
{
return resolve_plural(global_object, plural_rules, plural_rules.type(), number);
}
// Non-standard overload of ResolvePlural to allow using the AO without an Intl.PluralRules object.
Unicode::PluralCategory resolve_plural(GlobalObject& global_object, NumberFormatBase const& number_format, Unicode::PluralForm type, Value number)
{
// 1. Assert: Type(pluralRules) is Object.
// 2. Assert: pluralRules has an [[InitializedPluralRules]] internal slot.
@ -107,13 +113,12 @@ Unicode::PluralCategory resolve_plural(GlobalObject& global_object, PluralRules
}
// 5. Let locale be pluralRules.[[Locale]].
auto const& locale = plural_rules.locale();
auto const& locale = number_format.locale();
// 6. Let type be pluralRules.[[Type]].
auto type = plural_rules.type();
// 7. Let res be ! FormatNumericToString(pluralRules, n).
auto result = format_numeric_to_string(global_object, plural_rules, number);
auto result = format_numeric_to_string(global_object, number_format, number);
// 8. Let s be res.[[FormattedString]].
auto const& string = result.formatted_string;

View file

@ -32,5 +32,6 @@ private:
Unicode::PluralOperands get_operands(String const& string);
Unicode::PluralCategory plural_rule_select(StringView locale, Unicode::PluralForm type, Value number, Unicode::PluralOperands operands);
Unicode::PluralCategory resolve_plural(GlobalObject& global_object, PluralRules const& plural_rules, Value number);
Unicode::PluralCategory resolve_plural(GlobalObject& global_object, NumberFormatBase const& number_format, Unicode::PluralForm type, Value number);
}