mirror of
https://github.com/RGBCube/serenity
synced 2025-07-26 06:27:45 +00:00
LibJS: Move common code into RejectObjectWithCalendarOrTimeZone
This is an editorial change in the Temporal spec.
See: 5654fe0
This commit is contained in:
parent
bb60629d3b
commit
d129e1ff29
5 changed files with 51 additions and 51 deletions
|
@ -224,7 +224,7 @@
|
||||||
M(TemporalInvalidTimeZoneName, "Invalid time zone name") \
|
M(TemporalInvalidTimeZoneName, "Invalid time zone name") \
|
||||||
M(TemporalInvalidUnitRange, "Invalid unit range, {} is larger than {}") \
|
M(TemporalInvalidUnitRange, "Invalid unit range, {} is larger than {}") \
|
||||||
M(TemporalMissingOptionsObject, "Required options object is missing or undefined") \
|
M(TemporalMissingOptionsObject, "Required options object is missing or undefined") \
|
||||||
M(TemporalPlainTimeWithArgumentMustNotHave, "Argument must not have a defined {} property") \
|
M(TemporalObjectMustNotHave, "Object must not have a defined {} property") \
|
||||||
M(TemporalPropertyMustBeFinite, "Property must not be Infinity") \
|
M(TemporalPropertyMustBeFinite, "Property must not be Infinity") \
|
||||||
M(TemporalPropertyMustBePositiveInteger, "Property must be a positive integer") \
|
M(TemporalPropertyMustBePositiveInteger, "Property must be a positive integer") \
|
||||||
M(ThisHasNotBeenInitialized, "|this| has not been initialized") \
|
M(ThisHasNotBeenInitialized, "|this| has not been initialized") \
|
||||||
|
|
|
@ -623,8 +623,8 @@ Optional<u16> maximum_temporal_duration_rounding_increment(StringView unit)
|
||||||
return 1000;
|
return 1000;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 13.26 RejectTemporalCalendarType ( object ), https://tc39.es/proposal-temporal/#sec-temporal-rejecttemporalcalendartype
|
// 13.26 RejectObjectWithCalendarOrTimeZone ( object ), https://tc39.es/proposal-temporal/#sec-temporal-rejectobjectwithcalendarortimezone
|
||||||
ThrowCompletionOr<void> reject_temporal_calendar_type(GlobalObject& global_object, Object& object)
|
ThrowCompletionOr<void> reject_object_with_calendar_or_time_zone(GlobalObject& global_object, Object& object)
|
||||||
{
|
{
|
||||||
auto& vm = global_object.vm();
|
auto& vm = global_object.vm();
|
||||||
|
|
||||||
|
@ -633,7 +633,25 @@ ThrowCompletionOr<void> reject_temporal_calendar_type(GlobalObject& global_objec
|
||||||
// 2. If object has an [[InitializedTemporalDate]], [[InitializedTemporalDateTime]], [[InitializedTemporalMonthDay]], [[InitializedTemporalTime]], [[InitializedTemporalYearMonth]], or [[InitializedTemporalZonedDateTime]] internal slot, then
|
// 2. If object has an [[InitializedTemporalDate]], [[InitializedTemporalDateTime]], [[InitializedTemporalMonthDay]], [[InitializedTemporalTime]], [[InitializedTemporalYearMonth]], or [[InitializedTemporalZonedDateTime]] internal slot, then
|
||||||
if (is<PlainDate>(object) || is<PlainDateTime>(object) || is<PlainMonthDay>(object) || is<PlainTime>(object) || is<PlainYearMonth>(object) || is<ZonedDateTime>(object)) {
|
if (is<PlainDate>(object) || is<PlainDateTime>(object) || is<PlainMonthDay>(object) || is<PlainTime>(object) || is<PlainYearMonth>(object) || is<ZonedDateTime>(object)) {
|
||||||
// a. Throw a TypeError exception.
|
// a. Throw a TypeError exception.
|
||||||
return vm.throw_completion<TypeError>(global_object, ErrorType::TemporalPlainTimeWithArgumentMustNotHave, "calendar or timeZone");
|
return vm.throw_completion<TypeError>(global_object, ErrorType::TemporalObjectMustNotHave, "calendar or timeZone");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3. Let calendarProperty be ? Get(object, "calendar").
|
||||||
|
auto calendar_property = TRY(object.get(vm.names.calendar));
|
||||||
|
|
||||||
|
// 4. If calendarProperty is not undefined, then
|
||||||
|
if (!calendar_property.is_undefined()) {
|
||||||
|
// a. Throw a TypeError exception.
|
||||||
|
return vm.throw_completion<TypeError>(global_object, ErrorType::TemporalObjectMustNotHave, "calendar");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 5. Let timeZoneProperty be ? Get(object, "timeZone").
|
||||||
|
auto time_zone_property = TRY(object.get(vm.names.timeZone));
|
||||||
|
|
||||||
|
// 6. If timeZoneProperty is not undefined, then
|
||||||
|
if (!time_zone_property.is_undefined()) {
|
||||||
|
// a. Throw a TypeError exception.
|
||||||
|
return vm.throw_completion<TypeError>(global_object, ErrorType::TemporalObjectMustNotHave, "timeZone");
|
||||||
}
|
}
|
||||||
|
|
||||||
return {};
|
return {};
|
||||||
|
|
|
@ -102,7 +102,7 @@ ThrowCompletionOr<void> validate_temporal_unit_range(GlobalObject&, StringView l
|
||||||
String larger_of_two_temporal_units(StringView, StringView);
|
String larger_of_two_temporal_units(StringView, StringView);
|
||||||
ThrowCompletionOr<Object*> merge_largest_unit_option(GlobalObject&, Object& options, String largest_unit);
|
ThrowCompletionOr<Object*> merge_largest_unit_option(GlobalObject&, Object& options, String largest_unit);
|
||||||
Optional<u16> maximum_temporal_duration_rounding_increment(StringView unit);
|
Optional<u16> maximum_temporal_duration_rounding_increment(StringView unit);
|
||||||
ThrowCompletionOr<void> reject_temporal_calendar_type(GlobalObject&, Object&);
|
ThrowCompletionOr<void> reject_object_with_calendar_or_time_zone(GlobalObject&, Object&);
|
||||||
String format_seconds_string_part(u8 second, u16 millisecond, u16 microsecond, u16 nanosecond, Variant<StringView, u8> const& precision);
|
String format_seconds_string_part(u8 second, u16 millisecond, u16 microsecond, u16 nanosecond, Variant<StringView, u8> const& precision);
|
||||||
double constrain_to_range(double x, double minimum, double maximum);
|
double constrain_to_range(double x, double minimum, double maximum);
|
||||||
i64 round_number_to_increment(double, u64 increment, StringView rounding_mode);
|
i64 round_number_to_increment(double, u64 increment, StringView rounding_mode);
|
||||||
|
|
|
@ -195,76 +195,58 @@ JS_DEFINE_NATIVE_FUNCTION(PlainTimePrototype::with)
|
||||||
|
|
||||||
auto& temporal_time_like = temporal_time_like_argument.as_object();
|
auto& temporal_time_like = temporal_time_like_argument.as_object();
|
||||||
|
|
||||||
// 4. Perform ? RejectTemporalCalendarType(temporalTimeLike).
|
// 4. Perform ? RejectObjectWithCalendarOrTimeZone(temporalTimeLike).
|
||||||
TRY(reject_temporal_calendar_type(global_object, temporal_time_like));
|
TRY(reject_object_with_calendar_or_time_zone(global_object, temporal_time_like));
|
||||||
|
|
||||||
// 5. Let calendarProperty be ? Get(temporalTimeLike, "calendar").
|
// 5. Let partialTime be ? ToPartialTime(temporalTimeLike).
|
||||||
auto calendar_property = TRY(temporal_time_like.get(vm.names.calendar));
|
|
||||||
|
|
||||||
// 6. If calendarProperty is not undefined, then
|
|
||||||
if (!calendar_property.is_undefined()) {
|
|
||||||
// a. Throw a TypeError exception.
|
|
||||||
return vm.throw_completion<TypeError>(global_object, ErrorType::TemporalPlainTimeWithArgumentMustNotHave, "calendar");
|
|
||||||
}
|
|
||||||
|
|
||||||
// 7. Let timeZoneProperty be ? Get(temporalTimeLike, "timeZone").
|
|
||||||
auto time_zone_property = TRY(temporal_time_like.get(vm.names.timeZone));
|
|
||||||
|
|
||||||
// 8. If timeZoneProperty is not undefined, then
|
|
||||||
if (!time_zone_property.is_undefined()) {
|
|
||||||
// a. Throw a TypeError exception.
|
|
||||||
return vm.throw_completion<TypeError>(global_object, ErrorType::TemporalPlainTimeWithArgumentMustNotHave, "timeZone");
|
|
||||||
}
|
|
||||||
|
|
||||||
// 9. Let partialTime be ? ToPartialTime(temporalTimeLike).
|
|
||||||
auto partial_time = TRY(to_partial_time(global_object, temporal_time_like));
|
auto partial_time = TRY(to_partial_time(global_object, temporal_time_like));
|
||||||
|
|
||||||
// 10. Set options to ? GetOptionsObject(options).
|
// 6. Set options to ? GetOptionsObject(options).
|
||||||
auto* options = TRY(get_options_object(global_object, vm.argument(1)));
|
auto* options = TRY(get_options_object(global_object, vm.argument(1)));
|
||||||
|
|
||||||
// 11. Let overflow be ? ToTemporalOverflow(options).
|
// 7. Let overflow be ? ToTemporalOverflow(options).
|
||||||
auto overflow = TRY(to_temporal_overflow(global_object, *options));
|
auto overflow = TRY(to_temporal_overflow(global_object, *options));
|
||||||
|
|
||||||
// 12. If partialTime.[[Hour]] is not undefined, then
|
// 8. If partialTime.[[Hour]] is not undefined, then
|
||||||
// a. Let hour be partialTime.[[Hour]].
|
// a. Let hour be partialTime.[[Hour]].
|
||||||
// 13. Else,
|
// 9. Else,
|
||||||
// a. Let hour be temporalTime.[[ISOHour]].
|
// a. Let hour be temporalTime.[[ISOHour]].
|
||||||
auto hour = partial_time.hour.value_or(temporal_time->iso_hour());
|
auto hour = partial_time.hour.value_or(temporal_time->iso_hour());
|
||||||
|
|
||||||
// 14. If partialTime.[[Minute]] is not undefined, then
|
// 10. If partialTime.[[Minute]] is not undefined, then
|
||||||
// a. Let minute be partialTime.[[Minute]].
|
// a. Let minute be partialTime.[[Minute]].
|
||||||
// 15. Else,
|
// 11. Else,
|
||||||
// a. Let minute be temporalTime.[[ISOMinute]].
|
// a. Let minute be temporalTime.[[ISOMinute]].
|
||||||
auto minute = partial_time.minute.value_or(temporal_time->iso_minute());
|
auto minute = partial_time.minute.value_or(temporal_time->iso_minute());
|
||||||
|
|
||||||
// 16. If partialTime.[[Second]] is not undefined, then
|
// 12. If partialTime.[[Second]] is not undefined, then
|
||||||
// a. Let second be partialTime.[[Second]].
|
// a. Let second be partialTime.[[Second]].
|
||||||
// 17. Else,
|
// 13. Else,
|
||||||
// a. Let second be temporalTime.[[ISOSecond]].
|
// a. Let second be temporalTime.[[ISOSecond]].
|
||||||
auto second = partial_time.second.value_or(temporal_time->iso_second());
|
auto second = partial_time.second.value_or(temporal_time->iso_second());
|
||||||
|
|
||||||
// 18. If partialTime.[[Millisecond]] is not undefined, then
|
// 14. If partialTime.[[Millisecond]] is not undefined, then
|
||||||
// a. Let millisecond be partialTime.[[Millisecond]].
|
// a. Let millisecond be partialTime.[[Millisecond]].
|
||||||
// 19. Else,
|
// 15. Else,
|
||||||
// a. Let millisecond be temporalTime.[[ISOMillisecond]].
|
// a. Let millisecond be temporalTime.[[ISOMillisecond]].
|
||||||
auto millisecond = partial_time.millisecond.value_or(temporal_time->iso_millisecond());
|
auto millisecond = partial_time.millisecond.value_or(temporal_time->iso_millisecond());
|
||||||
|
|
||||||
// 20. If partialTime.[[Microsecond]] is not undefined, then
|
// 16. If partialTime.[[Microsecond]] is not undefined, then
|
||||||
// a. Let microsecond be partialTime.[[Microsecond]].
|
// a. Let microsecond be partialTime.[[Microsecond]].
|
||||||
// 21. Else,
|
// 17. Else,
|
||||||
// a. Let microsecond be temporalTime.[[ISOMicrosecond]].
|
// a. Let microsecond be temporalTime.[[ISOMicrosecond]].
|
||||||
auto microsecond = partial_time.microsecond.value_or(temporal_time->iso_microsecond());
|
auto microsecond = partial_time.microsecond.value_or(temporal_time->iso_microsecond());
|
||||||
|
|
||||||
// 22. If partialTime.[[Nanosecond]] is not undefined, then
|
// 18. If partialTime.[[Nanosecond]] is not undefined, then
|
||||||
// a. Let nanosecond be partialTime.[[Nanosecond]].
|
// a. Let nanosecond be partialTime.[[Nanosecond]].
|
||||||
// 23. Else,
|
// 19. Else,
|
||||||
// a. Let nanosecond be temporalTime.[[ISONanosecond]].
|
// a. Let nanosecond be temporalTime.[[ISONanosecond]].
|
||||||
auto nanosecond = partial_time.nanosecond.value_or(temporal_time->iso_nanosecond());
|
auto nanosecond = partial_time.nanosecond.value_or(temporal_time->iso_nanosecond());
|
||||||
|
|
||||||
// 24. Let result be ? RegulateTime(hour, minute, second, millisecond, microsecond, nanosecond, overflow).
|
// 20. Let result be ? RegulateTime(hour, minute, second, millisecond, microsecond, nanosecond, overflow).
|
||||||
auto result = TRY(regulate_time(global_object, hour, minute, second, millisecond, microsecond, nanosecond, overflow));
|
auto result = TRY(regulate_time(global_object, hour, minute, second, millisecond, microsecond, nanosecond, overflow));
|
||||||
|
|
||||||
// 25. Return ? CreateTemporalTime(result.[[Hour]], result.[[Minute]], result.[[Second]], result.[[Millisecond]], result.[[Microsecond]], result.[[Nanosecond]]).
|
// 21. Return ? CreateTemporalTime(result.[[Hour]], result.[[Minute]], result.[[Second]], result.[[Millisecond]], result.[[Microsecond]], result.[[Nanosecond]]).
|
||||||
return TRY(create_temporal_time(global_object, result.hour, result.minute, result.second, result.millisecond, result.microsecond, result.nanosecond));
|
return TRY(create_temporal_time(global_object, result.hour, result.minute, result.second, result.millisecond, result.microsecond, result.nanosecond));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -46,7 +46,7 @@ describe("correct behaviour", () => {
|
||||||
new Temporal.PlainTime().with({
|
new Temporal.PlainTime().with({
|
||||||
calendar: undefined,
|
calendar: undefined,
|
||||||
});
|
});
|
||||||
}).not.toThrowWithMessage(TypeError, "Argument must not have a defined calendar property");
|
}).not.toThrowWithMessage(TypeError, "Object must not have a defined calendar property");
|
||||||
});
|
});
|
||||||
|
|
||||||
test("argument can have a timeZone property as long as it's undefined", () => {
|
test("argument can have a timeZone property as long as it's undefined", () => {
|
||||||
|
@ -54,7 +54,7 @@ describe("correct behaviour", () => {
|
||||||
new Temporal.PlainTime().with({
|
new Temporal.PlainTime().with({
|
||||||
timeZone: undefined,
|
timeZone: undefined,
|
||||||
});
|
});
|
||||||
}).not.toThrowWithMessage(TypeError, "Argument must not have a defined timeZone property");
|
}).not.toThrowWithMessage(TypeError, "Object must not have a defined timeZone property");
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -140,12 +140,12 @@ describe("errors", () => {
|
||||||
new Temporal.PlainTime().with({
|
new Temporal.PlainTime().with({
|
||||||
calendar: null,
|
calendar: null,
|
||||||
});
|
});
|
||||||
}).toThrowWithMessage(TypeError, "Argument must not have a defined calendar property");
|
}).toThrowWithMessage(TypeError, "Object must not have a defined calendar property");
|
||||||
expect(() => {
|
expect(() => {
|
||||||
new Temporal.PlainTime().with({
|
new Temporal.PlainTime().with({
|
||||||
calendar: 1,
|
calendar: 1,
|
||||||
});
|
});
|
||||||
}).toThrowWithMessage(TypeError, "Argument must not have a defined calendar property");
|
}).toThrowWithMessage(TypeError, "Object must not have a defined calendar property");
|
||||||
});
|
});
|
||||||
|
|
||||||
test("argument must not have a defined timeZone property", () => {
|
test("argument must not have a defined timeZone property", () => {
|
||||||
|
@ -153,12 +153,12 @@ describe("errors", () => {
|
||||||
new Temporal.PlainTime().with({
|
new Temporal.PlainTime().with({
|
||||||
timeZone: null,
|
timeZone: null,
|
||||||
});
|
});
|
||||||
}).toThrowWithMessage(TypeError, "Argument must not have a defined timeZone property");
|
}).toThrowWithMessage(TypeError, "Object must not have a defined timeZone property");
|
||||||
expect(() => {
|
expect(() => {
|
||||||
new Temporal.PlainTime().with({
|
new Temporal.PlainTime().with({
|
||||||
timeZone: 1,
|
timeZone: 1,
|
||||||
});
|
});
|
||||||
}).toThrowWithMessage(TypeError, "Argument must not have a defined timeZone property");
|
}).toThrowWithMessage(TypeError, "Object must not have a defined timeZone property");
|
||||||
});
|
});
|
||||||
|
|
||||||
test("error when getting calendar", () => {
|
test("error when getting calendar", () => {
|
||||||
|
@ -187,7 +187,7 @@ describe("errors", () => {
|
||||||
new Temporal.PlainTime().with(new typeWithCalendar(1, 1, 1));
|
new Temporal.PlainTime().with(new typeWithCalendar(1, 1, 1));
|
||||||
}).toThrowWithMessage(
|
}).toThrowWithMessage(
|
||||||
TypeError,
|
TypeError,
|
||||||
"Argument must not have a defined calendar or timeZone property"
|
"Object must not have a defined calendar or timeZone property"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -196,7 +196,7 @@ describe("errors", () => {
|
||||||
new Temporal.PlainTime().with(new typeWithCalendar(1, 1));
|
new Temporal.PlainTime().with(new typeWithCalendar(1, 1));
|
||||||
}).toThrowWithMessage(
|
}).toThrowWithMessage(
|
||||||
TypeError,
|
TypeError,
|
||||||
"Argument must not have a defined calendar or timeZone property"
|
"Object must not have a defined calendar or timeZone property"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -204,7 +204,7 @@ describe("errors", () => {
|
||||||
new Temporal.PlainTime().with(new Temporal.ZonedDateTime(1n, {}));
|
new Temporal.PlainTime().with(new Temporal.ZonedDateTime(1n, {}));
|
||||||
}).toThrowWithMessage(
|
}).toThrowWithMessage(
|
||||||
TypeError,
|
TypeError,
|
||||||
"Argument must not have a defined calendar or timeZone property"
|
"Object must not have a defined calendar or timeZone property"
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue