mirror of
https://github.com/RGBCube/serenity
synced 2025-07-28 03:07:35 +00:00
LibJS: Use Intl.PluralRules within Intl.RelativeFormat
The Polish test cases added here cover previous failures from test262, due to the way that 0 is specified to be "many" in Polish.
This commit is contained in:
parent
36abcd820d
commit
bf85bf2a9e
6 changed files with 119 additions and 67 deletions
|
@ -10,8 +10,8 @@
|
|||
#include <LibJS/Runtime/GlobalObject.h>
|
||||
#include <LibJS/Runtime/Intl/NumberFormat.h>
|
||||
#include <LibJS/Runtime/Intl/NumberFormatConstructor.h>
|
||||
#include <LibJS/Runtime/Intl/PluralRules.h>
|
||||
#include <LibJS/Runtime/Intl/RelativeTimeFormat.h>
|
||||
#include <LibUnicode/NumberFormat.h>
|
||||
|
||||
namespace JS::Intl {
|
||||
|
||||
|
@ -26,6 +26,8 @@ void RelativeTimeFormat::visit_edges(Cell::Visitor& visitor)
|
|||
Base::visit_edges(visitor);
|
||||
if (m_number_format)
|
||||
visitor.visit(m_number_format);
|
||||
if (m_plural_rules)
|
||||
visitor.visit(m_plural_rules);
|
||||
}
|
||||
|
||||
void RelativeTimeFormat::set_numeric(StringView numeric)
|
||||
|
@ -179,10 +181,11 @@ ThrowCompletionOr<Vector<PatternPartitionWithUnit>> partition_relative_time_patt
|
|||
auto value_partitions = partition_number_pattern(global_object, relative_time_format.number_format(), Value(value));
|
||||
|
||||
// 21. Let pr be ! ResolvePlural(relativeTimeFormat.[[PluralRules]], value).
|
||||
auto plurality = resolve_plural(global_object, relative_time_format.plural_rules(), Value(value));
|
||||
|
||||
// 22. Let pattern be po.[[<pr>]].
|
||||
// FIXME: Use ResolvePlural when Intl.PluralRules is implemented.
|
||||
auto pattern = Unicode::select_pattern_with_plurality(patterns, value);
|
||||
if (!pattern.has_value())
|
||||
auto pattern = patterns.find_if([&](auto& p) { return p.plurality == plurality; });
|
||||
if (pattern == patterns.end())
|
||||
return Vector<PatternPartitionWithUnit> {};
|
||||
|
||||
// 23. Return ! MakePartsList(pattern, unit, fv).
|
||||
|
|
|
@ -56,6 +56,9 @@ public:
|
|||
NumberFormat& number_format() const { return *m_number_format; }
|
||||
void set_number_format(NumberFormat* number_format) { m_number_format = number_format; }
|
||||
|
||||
PluralRules& plural_rules() const { return *m_plural_rules; }
|
||||
void set_plural_rules(PluralRules* plural_rules) { m_plural_rules = plural_rules; }
|
||||
|
||||
private:
|
||||
virtual void visit_edges(Cell::Visitor&) override;
|
||||
|
||||
|
@ -65,6 +68,7 @@ private:
|
|||
Unicode::Style m_style { Unicode::Style::Long }; // [[Style]]
|
||||
Numeric m_numeric { Numeric::Always }; // [[Numeric]]
|
||||
NumberFormat* m_number_format { nullptr }; // [[NumberFormat]]
|
||||
PluralRules* m_plural_rules { nullptr }; // [[PluralRules]]
|
||||
};
|
||||
|
||||
struct PatternPartitionWithUnit : public PatternPartition {
|
||||
|
|
|
@ -10,6 +10,8 @@
|
|||
#include <LibJS/Runtime/Intl/AbstractOperations.h>
|
||||
#include <LibJS/Runtime/Intl/NumberFormat.h>
|
||||
#include <LibJS/Runtime/Intl/NumberFormatConstructor.h>
|
||||
#include <LibJS/Runtime/Intl/PluralRules.h>
|
||||
#include <LibJS/Runtime/Intl/PluralRulesConstructor.h>
|
||||
#include <LibJS/Runtime/Intl/RelativeTimeFormat.h>
|
||||
#include <LibJS/Runtime/Intl/RelativeTimeFormatConstructor.h>
|
||||
#include <LibUnicode/Locale.h>
|
||||
|
@ -141,7 +143,8 @@ ThrowCompletionOr<RelativeTimeFormat*> initialize_relative_time_format(GlobalObj
|
|||
relative_time_format.set_number_format(static_cast<NumberFormat*>(number_format));
|
||||
|
||||
// 20. Let relativeTimeFormat.[[PluralRules]] be ! Construct(%PluralRules%, « locale »).
|
||||
// FIXME: We do not yet support Intl.PluralRules.
|
||||
auto* plural_rules = MUST(construct(global_object, *global_object.intl_plural_rules_constructor(), js_string(vm, locale)));
|
||||
relative_time_format.set_plural_rules(static_cast<PluralRules*>(plural_rules));
|
||||
|
||||
// 21. Return relativeTimeFormat.
|
||||
return &relative_time_format;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue