mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-08-08 09:09:43 +00:00
LibJS: Remove usage of obsolete Duration record from Intl.DurationFormat
The Duration record no longer exists in Temporal. Implement it according to the DurationFormat spec to prepare for its removal from our Temporal implementation. We also implement the DurationSign AO here as well, as the Temporal implementation will now require a Temporal.Duration JS object.
This commit is contained in:
parent
59e0b7ccb7
commit
f88826691c
Notes:
github-actions[bot]
2024-11-18 22:48:00 +00:00
Author: https://github.com/trflynn89
Commit: f88826691c
Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/2387
2 changed files with 60 additions and 27 deletions
|
@ -16,6 +16,7 @@
|
||||||
#include <LibJS/Runtime/Intl/PluralRulesConstructor.h>
|
#include <LibJS/Runtime/Intl/PluralRulesConstructor.h>
|
||||||
#include <LibJS/Runtime/Intl/RelativeTimeFormat.h>
|
#include <LibJS/Runtime/Intl/RelativeTimeFormat.h>
|
||||||
#include <LibJS/Runtime/Temporal/AbstractOperations.h>
|
#include <LibJS/Runtime/Temporal/AbstractOperations.h>
|
||||||
|
#include <LibJS/Runtime/Temporal/Duration.h>
|
||||||
#include <LibJS/Runtime/ValueInlines.h>
|
#include <LibJS/Runtime/ValueInlines.h>
|
||||||
|
|
||||||
namespace JS::Intl {
|
namespace JS::Intl {
|
||||||
|
@ -157,7 +158,7 @@ static GC::Ref<ListFormat> construct_list_format(VM& vm, DurationFormat const& d
|
||||||
}
|
}
|
||||||
|
|
||||||
// 1.1.3 ToDurationRecord ( input ), https://tc39.es/proposal-intl-duration-format/#sec-todurationrecord
|
// 1.1.3 ToDurationRecord ( input ), https://tc39.es/proposal-intl-duration-format/#sec-todurationrecord
|
||||||
ThrowCompletionOr<Temporal::DurationRecord> to_duration_record(VM& vm, Value input)
|
ThrowCompletionOr<DurationRecord> to_duration_record(VM& vm, Value input)
|
||||||
{
|
{
|
||||||
// 1. If Type(input) is not Object, then
|
// 1. If Type(input) is not Object, then
|
||||||
if (!input.is_object()) {
|
if (!input.is_object()) {
|
||||||
|
@ -172,7 +173,7 @@ ThrowCompletionOr<Temporal::DurationRecord> to_duration_record(VM& vm, Value inp
|
||||||
auto& input_object = input.as_object();
|
auto& input_object = input.as_object();
|
||||||
|
|
||||||
// 2. Let result be a new Duration Record with each field set to 0.
|
// 2. Let result be a new Duration Record with each field set to 0.
|
||||||
Temporal::DurationRecord result = {};
|
DurationRecord result = {};
|
||||||
bool any_defined = false;
|
bool any_defined = false;
|
||||||
|
|
||||||
auto set_duration_record_value = [&](auto const& name, auto& value_slot) -> ThrowCompletionOr<void> {
|
auto set_duration_record_value = [&](auto const& name, auto& value_slot) -> ThrowCompletionOr<void> {
|
||||||
|
@ -240,6 +241,24 @@ ThrowCompletionOr<Temporal::DurationRecord> to_duration_record(VM& vm, Value inp
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 1.1.4 DurationSign ( duration ), https://tc39.es/proposal-intl-duration-format/#sec-durationsign
|
||||||
|
i8 duration_sign(DurationRecord const& duration)
|
||||||
|
{
|
||||||
|
// 1. For each value v of « duration.[[Years]], duration.[[Months]], duration.[[Weeks]], duration.[[Days]], duration.[[Hours]], duration.[[Minutes]], duration.[[Seconds]], duration.[[Milliseconds]], duration.[[Microseconds]], duration.[[Nanoseconds]] », do
|
||||||
|
for (auto value : { duration.years, duration.months, duration.weeks, duration.days, duration.hours, duration.minutes, duration.seconds, duration.milliseconds, duration.microseconds, duration.nanoseconds }) {
|
||||||
|
// a. If v < 0, return -1.
|
||||||
|
if (value < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
// b. If v > 0, return 1.
|
||||||
|
if (value > 0)
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. Return 0.
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
// 1.1.6 GetDurationUnitOptions ( unit, options, baseStyle, stylesList, digitalBase, prevStyle, twoDigitHours ), https://tc39.es/proposal-intl-duration-format/#sec-getdurationunitoptions
|
// 1.1.6 GetDurationUnitOptions ( unit, options, baseStyle, stylesList, digitalBase, prevStyle, twoDigitHours ), https://tc39.es/proposal-intl-duration-format/#sec-getdurationunitoptions
|
||||||
ThrowCompletionOr<DurationUnitOptions> get_duration_unit_options(VM& vm, String const& unit, Object const& options, StringView base_style, ReadonlySpan<StringView> styles_list, StringView digital_base, StringView previous_style, bool two_digit_hours)
|
ThrowCompletionOr<DurationUnitOptions> get_duration_unit_options(VM& vm, String const& unit, Object const& options, StringView base_style, ReadonlySpan<StringView> styles_list, StringView digital_base, StringView previous_style, bool two_digit_hours)
|
||||||
{
|
{
|
||||||
|
@ -349,7 +368,7 @@ ThrowCompletionOr<DurationUnitOptions> get_duration_unit_options(VM& vm, String
|
||||||
}
|
}
|
||||||
|
|
||||||
// 1.1.7 AddFractionalDigits ( durationFormat, duration ), https://tc39.es/proposal-intl-duration-format/#sec-addfractionaldigits
|
// 1.1.7 AddFractionalDigits ( durationFormat, duration ), https://tc39.es/proposal-intl-duration-format/#sec-addfractionaldigits
|
||||||
double add_fractional_digits(DurationFormat const& duration_format, Temporal::DurationRecord const& duration)
|
double add_fractional_digits(DurationFormat const& duration_format, DurationRecord const& duration)
|
||||||
{
|
{
|
||||||
// 1. Let result be 0.
|
// 1. Let result be 0.
|
||||||
double result = 0;
|
double result = 0;
|
||||||
|
@ -625,7 +644,7 @@ Vector<DurationFormatPart> format_numeric_seconds(VM& vm, DurationFormat const&
|
||||||
}
|
}
|
||||||
|
|
||||||
// 1.1.12 FormatNumericUnits ( durationFormat, duration, firstNumericUnit, signDisplayed ), https://tc39.es/proposal-intl-duration-format/#sec-formatnumericunits
|
// 1.1.12 FormatNumericUnits ( durationFormat, duration, firstNumericUnit, signDisplayed ), https://tc39.es/proposal-intl-duration-format/#sec-formatnumericunits
|
||||||
Vector<DurationFormatPart> format_numeric_units(VM& vm, DurationFormat const& duration_format, Temporal::DurationRecord const& duration, StringView first_numeric_unit, bool sign_displayed)
|
Vector<DurationFormatPart> format_numeric_units(VM& vm, DurationFormat const& duration_format, DurationRecord const& duration, StringView first_numeric_unit, bool sign_displayed)
|
||||||
{
|
{
|
||||||
// 1. Assert: firstNumericUnit is "hours", "minutes", or "seconds".
|
// 1. Assert: firstNumericUnit is "hours", "minutes", or "seconds".
|
||||||
VERIFY(first_numeric_unit.is_one_of("hours"sv, "minutes"sv, "seconds"sv));
|
VERIFY(first_numeric_unit.is_one_of("hours"sv, "minutes"sv, "seconds"sv));
|
||||||
|
@ -696,8 +715,8 @@ Vector<DurationFormatPart> format_numeric_units(VM& vm, DurationFormat const& du
|
||||||
if (hours_formatted) {
|
if (hours_formatted) {
|
||||||
// a. If signDisplayed is true, then
|
// a. If signDisplayed is true, then
|
||||||
if (sign_displayed) {
|
if (sign_displayed) {
|
||||||
// i. If hoursValue is 0 and DurationSign(duration.[[Years]], duration.[[Months]], duration.[[Weeks]], duration.[[Days]], duration.[[Hours]], duration.[[Minutes]], duration.[[Seconds]], duration.[[Milliseconds]], duration.[[Microseconds]], duration.[[Nanoseconds]]) is -1, then
|
// i. If hoursValue is 0 and DurationSign(duration) is -1, then
|
||||||
if (hours_value == 0 && Temporal::duration_sign(duration.years, duration.months, duration.weeks, duration.days, duration.hours, duration.minutes, duration.seconds, duration.milliseconds, duration.microseconds, duration.nanoseconds) == -1) {
|
if (hours_value == 0 && duration_sign(duration) == -1) {
|
||||||
// 1. Set hoursValue to negative-zero.
|
// 1. Set hoursValue to negative-zero.
|
||||||
hours_value = -0.0;
|
hours_value = -0.0;
|
||||||
}
|
}
|
||||||
|
@ -714,8 +733,8 @@ Vector<DurationFormatPart> format_numeric_units(VM& vm, DurationFormat const& du
|
||||||
if (minutes_formatted) {
|
if (minutes_formatted) {
|
||||||
// a. If signDisplayed is true, then
|
// a. If signDisplayed is true, then
|
||||||
if (sign_displayed) {
|
if (sign_displayed) {
|
||||||
// i. If minutesValue is 0 and DurationSign(duration.[[Years]], duration.[[Months]], duration.[[Weeks]], duration.[[Days]], duration.[[Hours]], duration.[[Minutes]], duration.[[Seconds]], duration.[[Milliseconds]], duration.[[Microseconds]], duration.[[Nanoseconds]]) is -1, then
|
// i. If minutesValue is 0 and DurationSign(duration) is -1, then
|
||||||
if (minutes_value == 0 && Temporal::duration_sign(duration.years, duration.months, duration.weeks, duration.days, duration.hours, duration.minutes, duration.seconds, duration.milliseconds, duration.microseconds, duration.nanoseconds) == -1) {
|
if (minutes_value == 0 && duration_sign(duration) == -1) {
|
||||||
// 1. Set minutesValue to negative-zero.
|
// 1. Set minutesValue to negative-zero.
|
||||||
minutes_value = -0.0;
|
minutes_value = -0.0;
|
||||||
}
|
}
|
||||||
|
@ -833,7 +852,7 @@ Vector<DurationFormatPart> list_format_parts(VM& vm, DurationFormat const& durat
|
||||||
}
|
}
|
||||||
|
|
||||||
// 1.1.7 PartitionDurationFormatPattern ( durationFormat, duration ), https://tc39.es/proposal-intl-duration-format/#sec-partitiondurationformatpattern
|
// 1.1.7 PartitionDurationFormatPattern ( durationFormat, duration ), https://tc39.es/proposal-intl-duration-format/#sec-partitiondurationformatpattern
|
||||||
Vector<DurationFormatPart> partition_duration_format_pattern(VM& vm, DurationFormat const& duration_format, Temporal::DurationRecord const& duration)
|
Vector<DurationFormatPart> partition_duration_format_pattern(VM& vm, DurationFormat const& duration_format, DurationRecord const& duration)
|
||||||
{
|
{
|
||||||
auto& realm = *vm.current_realm();
|
auto& realm = *vm.current_realm();
|
||||||
|
|
||||||
|
@ -930,8 +949,8 @@ Vector<DurationFormatPart> partition_duration_format_pattern(VM& vm, DurationFor
|
||||||
// a. Set signDisplayed to false.
|
// a. Set signDisplayed to false.
|
||||||
sign_displayed = false;
|
sign_displayed = false;
|
||||||
|
|
||||||
// b. If value is 0 and DurationSign(duration.[[Years]], duration.[[Months]], duration.[[Weeks]], duration.[[Days]], duration.[[Hours]], duration.[[Minutes]], duration.[[Seconds]], duration.[[Milliseconds]], duration.[[Microseconds]], duration.[[Nanoseconds]]) is -1, then
|
// b. If value is 0 and DurationSign(duration) is -1, then
|
||||||
if (value == 0 && Temporal::duration_sign(duration.years, duration.months, duration.weeks, duration.days, duration.hours, duration.minutes, duration.seconds, duration.milliseconds, duration.microseconds, duration.nanoseconds) == -1) {
|
if (value == 0 && duration_sign(duration) == -1) {
|
||||||
// i. Set value to negative-zero.
|
// i. Set value to negative-zero.
|
||||||
value = -0.0;
|
value = -0.0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,7 +11,6 @@
|
||||||
#include <AK/String.h>
|
#include <AK/String.h>
|
||||||
#include <LibJS/Runtime/Intl/AbstractOperations.h>
|
#include <LibJS/Runtime/Intl/AbstractOperations.h>
|
||||||
#include <LibJS/Runtime/Object.h>
|
#include <LibJS/Runtime/Object.h>
|
||||||
#include <LibJS/Runtime/Temporal/Duration.h>
|
|
||||||
#include <LibUnicode/Locale.h>
|
#include <LibUnicode/Locale.h>
|
||||||
|
|
||||||
namespace JS::Intl {
|
namespace JS::Intl {
|
||||||
|
@ -199,8 +198,22 @@ private:
|
||||||
Optional<u8> m_fractional_digits; // [[FractionalDigits]]
|
Optional<u8> m_fractional_digits; // [[FractionalDigits]]
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// 1.1.1 Duration Records, https://tc39.es/proposal-intl-duration-format/#sec-duration-records
|
||||||
|
struct DurationRecord {
|
||||||
|
double years { 0 };
|
||||||
|
double months { 0 };
|
||||||
|
double weeks { 0 };
|
||||||
|
double days { 0 };
|
||||||
|
double hours { 0 };
|
||||||
|
double minutes { 0 };
|
||||||
|
double seconds { 0 };
|
||||||
|
double milliseconds { 0 };
|
||||||
|
double microseconds { 0 };
|
||||||
|
double nanoseconds { 0 };
|
||||||
|
};
|
||||||
|
|
||||||
struct DurationInstanceComponent {
|
struct DurationInstanceComponent {
|
||||||
double Temporal::DurationRecord::*value_slot;
|
double DurationRecord::*value_slot;
|
||||||
DurationFormat::ValueStyle (DurationFormat::*get_style_slot)() const;
|
DurationFormat::ValueStyle (DurationFormat::*get_style_slot)() const;
|
||||||
void (DurationFormat::*set_style_slot)(StringView);
|
void (DurationFormat::*set_style_slot)(StringView);
|
||||||
DurationFormat::Display (DurationFormat::*get_display_slot)() const;
|
DurationFormat::Display (DurationFormat::*get_display_slot)() const;
|
||||||
|
@ -216,16 +229,16 @@ static constexpr AK::Array<StringView, 3> date_values = { "long"sv, "short"sv, "
|
||||||
static constexpr AK::Array<StringView, 5> time_values = { "long"sv, "short"sv, "narrow"sv, "numeric"sv, "2-digit"sv };
|
static constexpr AK::Array<StringView, 5> time_values = { "long"sv, "short"sv, "narrow"sv, "numeric"sv, "2-digit"sv };
|
||||||
static constexpr AK::Array<StringView, 4> sub_second_values = { "long"sv, "short"sv, "narrow"sv, "numeric"sv };
|
static constexpr AK::Array<StringView, 4> sub_second_values = { "long"sv, "short"sv, "narrow"sv, "numeric"sv };
|
||||||
static constexpr AK::Array<DurationInstanceComponent, 10> duration_instances_components {
|
static constexpr AK::Array<DurationInstanceComponent, 10> duration_instances_components {
|
||||||
DurationInstanceComponent { &Temporal::DurationRecord::years, &DurationFormat::years_style, &DurationFormat::set_years_style, &DurationFormat::years_display, &DurationFormat::set_years_display, "years"sv, "year"sv, date_values, "short"sv },
|
DurationInstanceComponent { &DurationRecord::years, &DurationFormat::years_style, &DurationFormat::set_years_style, &DurationFormat::years_display, &DurationFormat::set_years_display, "years"sv, "year"sv, date_values, "short"sv },
|
||||||
DurationInstanceComponent { &Temporal::DurationRecord::months, &DurationFormat::months_style, &DurationFormat::set_months_style, &DurationFormat::months_display, &DurationFormat::set_months_display, "months"sv, "month"sv, date_values, "short"sv },
|
DurationInstanceComponent { &DurationRecord::months, &DurationFormat::months_style, &DurationFormat::set_months_style, &DurationFormat::months_display, &DurationFormat::set_months_display, "months"sv, "month"sv, date_values, "short"sv },
|
||||||
DurationInstanceComponent { &Temporal::DurationRecord::weeks, &DurationFormat::weeks_style, &DurationFormat::set_weeks_style, &DurationFormat::weeks_display, &DurationFormat::set_weeks_display, "weeks"sv, "week"sv, date_values, "short"sv },
|
DurationInstanceComponent { &DurationRecord::weeks, &DurationFormat::weeks_style, &DurationFormat::set_weeks_style, &DurationFormat::weeks_display, &DurationFormat::set_weeks_display, "weeks"sv, "week"sv, date_values, "short"sv },
|
||||||
DurationInstanceComponent { &Temporal::DurationRecord::days, &DurationFormat::days_style, &DurationFormat::set_days_style, &DurationFormat::days_display, &DurationFormat::set_days_display, "days"sv, "day"sv, date_values, "short"sv },
|
DurationInstanceComponent { &DurationRecord::days, &DurationFormat::days_style, &DurationFormat::set_days_style, &DurationFormat::days_display, &DurationFormat::set_days_display, "days"sv, "day"sv, date_values, "short"sv },
|
||||||
DurationInstanceComponent { &Temporal::DurationRecord::hours, &DurationFormat::hours_style, &DurationFormat::set_hours_style, &DurationFormat::hours_display, &DurationFormat::set_hours_display, "hours"sv, "hour"sv, time_values, "numeric"sv },
|
DurationInstanceComponent { &DurationRecord::hours, &DurationFormat::hours_style, &DurationFormat::set_hours_style, &DurationFormat::hours_display, &DurationFormat::set_hours_display, "hours"sv, "hour"sv, time_values, "numeric"sv },
|
||||||
DurationInstanceComponent { &Temporal::DurationRecord::minutes, &DurationFormat::minutes_style, &DurationFormat::set_minutes_style, &DurationFormat::minutes_display, &DurationFormat::set_minutes_display, "minutes"sv, "minute"sv, time_values, "numeric"sv },
|
DurationInstanceComponent { &DurationRecord::minutes, &DurationFormat::minutes_style, &DurationFormat::set_minutes_style, &DurationFormat::minutes_display, &DurationFormat::set_minutes_display, "minutes"sv, "minute"sv, time_values, "numeric"sv },
|
||||||
DurationInstanceComponent { &Temporal::DurationRecord::seconds, &DurationFormat::seconds_style, &DurationFormat::set_seconds_style, &DurationFormat::seconds_display, &DurationFormat::set_seconds_display, "seconds"sv, "second"sv, time_values, "numeric"sv },
|
DurationInstanceComponent { &DurationRecord::seconds, &DurationFormat::seconds_style, &DurationFormat::set_seconds_style, &DurationFormat::seconds_display, &DurationFormat::set_seconds_display, "seconds"sv, "second"sv, time_values, "numeric"sv },
|
||||||
DurationInstanceComponent { &Temporal::DurationRecord::milliseconds, &DurationFormat::milliseconds_style, &DurationFormat::set_milliseconds_style, &DurationFormat::milliseconds_display, &DurationFormat::set_milliseconds_display, "milliseconds"sv, "millisecond"sv, sub_second_values, "numeric"sv },
|
DurationInstanceComponent { &DurationRecord::milliseconds, &DurationFormat::milliseconds_style, &DurationFormat::set_milliseconds_style, &DurationFormat::milliseconds_display, &DurationFormat::set_milliseconds_display, "milliseconds"sv, "millisecond"sv, sub_second_values, "numeric"sv },
|
||||||
DurationInstanceComponent { &Temporal::DurationRecord::microseconds, &DurationFormat::microseconds_style, &DurationFormat::set_microseconds_style, &DurationFormat::microseconds_display, &DurationFormat::set_microseconds_display, "microseconds"sv, "microsecond"sv, sub_second_values, "numeric"sv },
|
DurationInstanceComponent { &DurationRecord::microseconds, &DurationFormat::microseconds_style, &DurationFormat::set_microseconds_style, &DurationFormat::microseconds_display, &DurationFormat::set_microseconds_display, "microseconds"sv, "microsecond"sv, sub_second_values, "numeric"sv },
|
||||||
DurationInstanceComponent { &Temporal::DurationRecord::nanoseconds, &DurationFormat::nanoseconds_style, &DurationFormat::set_nanoseconds_style, &DurationFormat::nanoseconds_display, &DurationFormat::set_nanoseconds_display, "nanoseconds"sv, "nanosecond"sv, sub_second_values, "numeric"sv },
|
DurationInstanceComponent { &DurationRecord::nanoseconds, &DurationFormat::nanoseconds_style, &DurationFormat::set_nanoseconds_style, &DurationFormat::nanoseconds_display, &DurationFormat::set_nanoseconds_display, "nanoseconds"sv, "nanosecond"sv, sub_second_values, "numeric"sv },
|
||||||
};
|
};
|
||||||
|
|
||||||
struct DurationUnitOptions {
|
struct DurationUnitOptions {
|
||||||
|
@ -239,15 +252,16 @@ struct DurationFormatPart {
|
||||||
StringView unit;
|
StringView unit;
|
||||||
};
|
};
|
||||||
|
|
||||||
ThrowCompletionOr<Temporal::DurationRecord> to_duration_record(VM&, Value input);
|
ThrowCompletionOr<DurationRecord> to_duration_record(VM&, Value input);
|
||||||
|
i8 duration_sign(DurationRecord const&);
|
||||||
ThrowCompletionOr<DurationUnitOptions> get_duration_unit_options(VM&, String const& unit, Object const& options, StringView base_style, ReadonlySpan<StringView> styles_list, StringView digital_base, StringView previous_style, bool two_digit_hours);
|
ThrowCompletionOr<DurationUnitOptions> get_duration_unit_options(VM&, String const& unit, Object const& options, StringView base_style, ReadonlySpan<StringView> styles_list, StringView digital_base, StringView previous_style, bool two_digit_hours);
|
||||||
double add_fractional_digits(DurationFormat const&, Temporal::DurationRecord const&);
|
double add_fractional_digits(DurationFormat const&, DurationRecord const&);
|
||||||
bool next_unit_fractional(DurationFormat const&, StringView unit);
|
bool next_unit_fractional(DurationFormat const&, StringView unit);
|
||||||
Vector<DurationFormatPart> format_numeric_hours(VM&, DurationFormat const&, double hours_value, bool sign_displayed);
|
Vector<DurationFormatPart> format_numeric_hours(VM&, DurationFormat const&, double hours_value, bool sign_displayed);
|
||||||
Vector<DurationFormatPart> format_numeric_minutes(VM&, DurationFormat const&, double minutes_value, bool hours_displayed, bool sign_displayed);
|
Vector<DurationFormatPart> format_numeric_minutes(VM&, DurationFormat const&, double minutes_value, bool hours_displayed, bool sign_displayed);
|
||||||
Vector<DurationFormatPart> format_numeric_seconds(VM&, DurationFormat const&, double seconds_value, bool minutes_displayed, bool sign_displayed);
|
Vector<DurationFormatPart> format_numeric_seconds(VM&, DurationFormat const&, double seconds_value, bool minutes_displayed, bool sign_displayed);
|
||||||
Vector<DurationFormatPart> format_numeric_units(VM&, DurationFormat const&, Temporal::DurationRecord const&, StringView first_numeric_unit, bool sign_displayed);
|
Vector<DurationFormatPart> format_numeric_units(VM&, DurationFormat const&, DurationRecord const&, StringView first_numeric_unit, bool sign_displayed);
|
||||||
Vector<DurationFormatPart> list_format_parts(VM&, DurationFormat const&, Vector<Vector<DurationFormatPart>>& partitioned_parts_list);
|
Vector<DurationFormatPart> list_format_parts(VM&, DurationFormat const&, Vector<Vector<DurationFormatPart>>& partitioned_parts_list);
|
||||||
Vector<DurationFormatPart> partition_duration_format_pattern(VM&, DurationFormat const&, Temporal::DurationRecord const&);
|
Vector<DurationFormatPart> partition_duration_format_pattern(VM&, DurationFormat const&, DurationRecord const&);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue