Implement Temporal.PlainDateTime.toZonedDateTime

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
This commit is contained in:
Seonghyun Kim 2025-11-10 15:34:21 +09:00 committed by Patrick Kim
commit 1c3248ce35
4 changed files with 25 additions and 33 deletions

View file

@ -788,6 +788,12 @@ static Value builtinTemporalPlainDateTimeToPlainTime(ExecutionState& state, Valu
return plainDateTime->toPlainTime(state);
}
static Value builtinTemporalPlainDateTimeToZonedDateTime(ExecutionState& state, Value thisValue, size_t argc, Value* argv, Optional<Object*> newTarget)
{
RESOLVE_THIS_BINDING_TO_PLAINDATETIME(plainDateTime, ToZonedDateTime);
return plainDateTime->toZonedDateTime(state, argv[0], argc > 1 ? argv[1] : Value());
}
static Value builtinTemporalPlainYearMonthConstructor(ExecutionState& state, Value thisValue, size_t argc, Value* argv, Optional<Object*> newTarget)
{
// If NewTarget is undefined, throw a TypeError exception.
@ -1501,6 +1507,7 @@ void GlobalObject::installTemporal(ExecutionState& state)
m_temporalPlainDateTimePrototype->directDefineOwnProperty(state, ObjectPropertyName(strings->lazyEquals()), ObjectPropertyDescriptor(new NativeFunctionObject(state, NativeFunctionInfo(strings->lazyEquals(), builtinTemporalPlainDateTimeEquals, 1, NativeFunctionInfo::Strict)), (ObjectPropertyDescriptor::PresentAttribute)(ObjectPropertyDescriptor::WritablePresent | ObjectPropertyDescriptor::ConfigurablePresent)));
m_temporalPlainDateTimePrototype->directDefineOwnProperty(state, ObjectPropertyName(strings->lazyToPlainDate()), ObjectPropertyDescriptor(new NativeFunctionObject(state, NativeFunctionInfo(strings->lazyToPlainDate(), builtinTemporalPlainDateTimeToPlainDate, 0, NativeFunctionInfo::Strict)), (ObjectPropertyDescriptor::PresentAttribute)(ObjectPropertyDescriptor::WritablePresent | ObjectPropertyDescriptor::ConfigurablePresent)));
m_temporalPlainDateTimePrototype->directDefineOwnProperty(state, ObjectPropertyName(strings->lazyToPlainTime()), ObjectPropertyDescriptor(new NativeFunctionObject(state, NativeFunctionInfo(strings->lazyToPlainTime(), builtinTemporalPlainDateTimeToPlainTime, 0, NativeFunctionInfo::Strict)), (ObjectPropertyDescriptor::PresentAttribute)(ObjectPropertyDescriptor::WritablePresent | ObjectPropertyDescriptor::ConfigurablePresent)));
m_temporalPlainDateTimePrototype->directDefineOwnProperty(state, ObjectPropertyName(strings->lazyToZonedDateTime()), ObjectPropertyDescriptor(new NativeFunctionObject(state, NativeFunctionInfo(strings->lazyToZonedDateTime(), builtinTemporalPlainDateTimeToZonedDateTime, 1, NativeFunctionInfo::Strict)), (ObjectPropertyDescriptor::PresentAttribute)(ObjectPropertyDescriptor::WritablePresent | ObjectPropertyDescriptor::ConfigurablePresent)));
{
AtomicString name(state.context(), "get calendarId");

View file

@ -46,6 +46,7 @@
#include "TemporalPlainDateTimeObject.h"
#include "TemporalPlainDateObject.h"
#include "TemporalPlainTimeObject.h"
#include "TemporalZonedDateTimeObject.h"
#include "TemporalDurationObject.h"
#include "intl/Intl.h"
#include "util/ISO8601.h"
@ -145,9 +146,10 @@ String* TemporalPlainDateTimeObject::toString(ExecutionState& state, Value optio
// If ISODateTimeWithinLimits(result) is false, throw a RangeError exception.
// Return ISODateTimeToString(result, plainDateTime.[[Calendar]], precision.[[Precision]], showCalendar).
StringBuilder sb;
sb.appendString(TemporalPlainDateObject::temporalDateToString(result.plainDate(), m_calendarID, showCalendar));
sb.appendString(TemporalPlainDateObject::temporalDateToString(result.plainDate(), m_calendarID, TemporalShowCalendarNameOption::Never));
sb.appendChar('T');
sb.appendString(TemporalPlainTimeObject::temporalTimeToString(result.plainTime(), precision.precision));
Temporal::formatCalendarAnnotation(sb, m_calendarID, showCalendar);
return sb.finalize();
}
@ -385,6 +387,20 @@ TemporalPlainTimeObject* TemporalPlainDateTimeObject::toPlainTime(ExecutionState
return new TemporalPlainTimeObject(state, state.context()->globalObject()->temporalPlainTimePrototype(), plainTime());
}
TemporalZonedDateTimeObject* TemporalPlainDateTimeObject::toZonedDateTime(ExecutionState& state, Value temporalTimeZoneLike, Value options)
{
// Let timeZone be ? ToTemporalTimeZoneIdentifier(temporalTimeZoneLike).
auto timeZone = Temporal::toTemporalTimezoneIdentifier(state, temporalTimeZoneLike);
// Let resolvedOptions be ? GetOptionsObject(options).
auto resolvedOptions = Intl::getOptionsObject(state, options);
// Let disambiguation be ? GetTemporalDisambiguationOption(resolvedOptions).
auto disambiguation = Temporal::getTemporalDisambiguationOption(state, resolvedOptions);
// Let epochNs be ? GetEpochNanosecondsFor(timeZone, plainDateTime.[[ISODateTime]], disambiguation).
auto epochNs = Temporal::getEpochNanosecondsFor(state, timeZone, plainDateTime(), disambiguation);
// Return ! CreateTemporalZonedDateTime(epochNs, timeZone, plainDateTime.[[Calendar]]).
return new TemporalZonedDateTimeObject(state, state.context()->globalObject()->temporalZonedDateTimePrototype(), epochNs, timeZone, calendarID());
}
int TemporalPlainDateTimeObject::compare(ExecutionState& state, Value oneInput, Value twoInput)
{
auto one = Temporal::toTemporalDateTime(state, oneInput, Value());

View file

@ -145,6 +145,7 @@ public:
TemporalPlainDateObject* toPlainDate(ExecutionState& state);
TemporalPlainTimeObject* toPlainTime(ExecutionState& state);
TemporalZonedDateTimeObject* toZonedDateTime(ExecutionState& state, Value temporalTimeZoneLike, Value options);
// https://tc39.es/proposal-temporal/#sec-temporal.plaindatetime.compare
static int compare(ExecutionState& state, Value one, Value two);

View file

@ -431,33 +431,9 @@
<test id="built-ins/Temporal/PlainDate/prototype/with/overflow-undefined"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/since/argument-plaindate"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/since/order-of-operations"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/toString/calendarname-always"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/toString/calendarname-critical"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/toString/rounding-edge-of-range"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/basic"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/branding"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/builtin"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/constant-offset"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/disambiguation"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/disambiguation-invalid-string"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/disambiguation-wrong-type"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/fixed-offset-near-date-time-limits"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/invalid-instant"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/length"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/name"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/negative-year"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/not-a-constructor"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/options-object"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/order-of-operations"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/plain-date-time-near-limits"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/prop-desc"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/timezone-case-insensitive"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/timezone-string"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/timezone-string-datetime"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/timezone-string-leap-second"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/timezone-string-multiple-offsets"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/timezone-string-year-zero"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/timezone-wrong-type"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/two-digit-year"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/year-zero"><reason>TODO</reason></test>
<test id="built-ins/Temporal/PlainDateTime/prototype/until/argument-plaindate"><reason>TODO</reason></test>
@ -1091,16 +1067,8 @@
<test id="intl402/Temporal/PlainDateTime/prototype/toLocaleString/options-conflict"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/toLocaleString/options-undefined"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/toLocaleString/resolved-time-zone"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/toString/calendarname-always"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/toString/calendarname-auto"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/toString/calendarname-critical"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/toString/calendarname-undefined"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/toString/calendarname-wrong-type"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/toString/options-undefined"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/toZonedDateTime/disambiguation-undefined"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/toZonedDateTime/dst-disambiguation"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/toZonedDateTime/multiple-instants"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/toZonedDateTime/options-undefined"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/toZonedDateTime/order-of-operations"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/toZonedDateTime/timezone-string-datetime"><reason>TODO</reason></test>
<test id="intl402/Temporal/PlainDateTime/prototype/with/non-iso-calendar-fields"><reason>TODO</reason></test>