LibJS: Simplify DaysUntil

This is an editorial change in the Temporal spec.

See: https://github.com/tc39/proposal-temporal/commit/b2254b4
This commit is contained in:
Linus Groh 2022-05-06 21:03:49 +02:00
parent de0ea331cd
commit 6a2b73a4a9
2 changed files with 23 additions and 13 deletions

View file

@ -1063,8 +1063,8 @@ ThrowCompletionOr<MoveRelativeDateResult> move_relative_date(GlobalObject& globa
// 1. Let newDate be ? CalendarDateAdd(calendar, relativeTo, duration, options).
auto* new_date = TRY(calendar_date_add(global_object, calendar, &relative_to, duration));
// 2. Let days be ! DaysUntil(relativeTo, newDate).
auto days = days_until(global_object, relative_to, *new_date);
// 2. Let days be DaysUntil(relativeTo, newDate).
auto days = days_until(relative_to, *new_date);
// 3. Return the Record { [[RelativeTo]]: newDate, [[Days]]: days }.
return MoveRelativeDateResult { .relative_to = make_handle(new_date), .days = days };
@ -1190,8 +1190,8 @@ ThrowCompletionOr<RoundedDuration> round_duration(GlobalObject& global_object, d
// e. Let yearsMonthsWeeksLater be ? CalendarDateAdd(calendar, relativeTo, yearsMonthsWeeks, undefined, dateAdd).
auto* years_months_weeks_later = TRY(calendar_date_add(global_object, *calendar, relative_to, *years_months_weeks, nullptr, date_add));
// f. Let monthsWeeksInDays be ? DaysUntil(yearsLater, yearsMonthsWeeksLater).
auto months_weeks_in_days = days_until(global_object, *years_later, *years_months_weeks_later);
// f. Let monthsWeeksInDays be DaysUntil(yearsLater, yearsMonthsWeeksLater).
auto months_weeks_in_days = days_until(*years_later, *years_months_weeks_later);
// g. Set relativeTo to yearsLater.
relative_to = years_later;
@ -1229,8 +1229,8 @@ ThrowCompletionOr<RoundedDuration> round_duration(GlobalObject& global_object, d
// r. Set relativeTo to ? CalendarDateAdd(calendar, relativeTo, yearsDuration, undefined, dateAdd).
relative_to = TRY(calendar_date_add(global_object, *calendar, relative_to, *years_duration, nullptr, date_add));
// s. Let daysPassed be ? DaysUntil(oldRelativeTo, relativeTo).
auto days_passed = days_until(global_object, *old_relative_to, *relative_to);
// s. Let daysPassed be DaysUntil(oldRelativeTo, relativeTo).
auto days_passed = days_until(*old_relative_to, *relative_to);
// t. Set days to days - daysPassed.
days -= days_passed;
@ -1280,8 +1280,8 @@ ThrowCompletionOr<RoundedDuration> round_duration(GlobalObject& global_object, d
// e. Let yearsMonthsWeeksLater be ? CalendarDateAdd(calendar, relativeTo, yearsMonthsWeeks, undefined, dateAdd).
auto* years_months_weeks_later = TRY(calendar_date_add(global_object, *calendar, relative_to, *years_months_weeks, nullptr, date_add));
// f. Let weeksInDays be ? DaysUntil(yearsMonthsLater, yearsMonthsWeeksLater).
auto weeks_in_days = days_until(global_object, *years_months_later, *years_months_weeks_later);
// f. Let weeksInDays be DaysUntil(yearsMonthsLater, yearsMonthsWeeksLater).
auto weeks_in_days = days_until(*years_months_later, *years_months_weeks_later);
// g. Set relativeTo to yearsMonthsLater.
relative_to = years_months_later;

View file

@ -9,6 +9,7 @@
#include <AK/Optional.h>
#include <LibJS/Heap/Handle.h>
#include <LibJS/Runtime/Completion.h>
#include <LibJS/Runtime/Date.h>
#include <LibJS/Runtime/Object.h>
#include <LibJS/Runtime/Temporal/PlainDate.h>
#include <LibJS/Runtime/Temporal/PlainDateTime.h>
@ -163,13 +164,22 @@ ThrowCompletionOr<Duration*> add_duration_to_or_subtract_duration_from_duration(
// 7.5.22 DaysUntil ( earlier, later ), https://tc39.es/proposal-temporal/#sec-temporal-daysuntil
template<typename EarlierObjectType, typename LaterObjectType>
double days_until(GlobalObject& global_object, EarlierObjectType& earlier, LaterObjectType& later)
double days_until(EarlierObjectType& earlier, LaterObjectType& later)
{
// 1. Let difference be ! DifferenceISODate(earlier.[[ISOYear]], earlier.[[ISOMonth]], earlier.[[ISODay]], later.[[ISOYear]], later.[[ISOMonth]], later.[[ISODay]], "day").
auto difference = difference_iso_date(global_object, earlier.iso_year(), earlier.iso_month(), earlier.iso_day(), later.iso_year(), later.iso_month(), later.iso_day(), "day"sv);
// 1. Let epochDays1 be MakeDay(𝔽(earlier.[[ISOYear]]), 𝔽(earlier.[[ISOMonth]] - 1), 𝔽(earlier.[[ISODay]])).
auto epoch_days_1 = make_day(earlier.iso_year(), earlier.iso_month() - 1, earlier.iso_day());
// 2. Return difference.[[Days]].
return difference.days;
// 2. Assert: epochDays1 is finite.
VERIFY(isfinite(epoch_days_1));
// 3. Let epochDays2 be MakeDay(𝔽(later.[[ISOYear]]), 𝔽(later.[[ISOMonth]] - 1), 𝔽(later.[[ISODay]])).
auto epoch_days_2 = make_day(later.iso_year(), later.iso_month() - 1, later.iso_day());
// 4. Assert: epochDays2 is finite.
VERIFY(isfinite(epoch_days_2));
// 5. Return (epochDays2) - (epochDays1).
return epoch_days_2 - epoch_days_1;
}
}