summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Userland/Libraries/LibJS/Runtime/Temporal/AbstractOperations.cpp47
-rw-r--r--Userland/Libraries/LibJS/Runtime/Temporal/ISO8601.cpp21
-rw-r--r--Userland/Libraries/LibJS/Runtime/Temporal/ISO8601.h3
3 files changed, 20 insertions, 51 deletions
diff --git a/Userland/Libraries/LibJS/Runtime/Temporal/AbstractOperations.cpp b/Userland/Libraries/LibJS/Runtime/Temporal/AbstractOperations.cpp
index 8c026c6e08..026354dc24 100644
--- a/Userland/Libraries/LibJS/Runtime/Temporal/AbstractOperations.cpp
+++ b/Userland/Libraries/LibJS/Runtime/Temporal/AbstractOperations.cpp
@@ -1666,41 +1666,30 @@ ThrowCompletionOr<TemporalTime> parse_temporal_time_string(VM& vm, String const&
return TemporalTime { .hour = result.hour, .minute = result.minute, .second = result.second, .millisecond = result.millisecond, .microsecond = result.microsecond, .nanosecond = result.nanosecond, .calendar = move(result.calendar) };
}
-// 13.38 ParseTemporalTimeZoneString ( isoString ), https://tc39.es/proposal-temporal/#sec-temporal-parsetemporaltimezonestring
-ThrowCompletionOr<TemporalTimeZone> parse_temporal_time_zone_string(VM& vm, String const& iso_string)
+// 13.38 ParseTemporalTimeZoneString ( timeZoneString ), https://tc39.es/proposal-temporal/#sec-temporal-parsetemporaltimezonestring
+ThrowCompletionOr<TemporalTimeZone> parse_temporal_time_zone_string(VM& vm, String const& time_zone_string)
{
- // 1. Let parseResult be ParseText(StringToCodePoints(isoString), TemporalTimeZoneString).
- auto parse_result = parse_iso8601(Production::TemporalTimeZoneString, iso_string);
+ // 1. Let parseResult be ParseText(StringToCodePoints(timeZoneString), TimeZoneIdentifier).
+ auto parse_result = parse_iso8601(Production::TimeZoneIdentifier, time_zone_string);
- // 2. If parseResult is a List of errors, throw a RangeError exception.
- if (!parse_result.has_value())
- return vm.throw_completion<RangeError>(ErrorType::TemporalInvalidTimeZoneString, iso_string);
-
- // 3. Let each of z, offsetString, and name be the source text matched by the respective UTCDesignator, TimeZoneNumericUTCOffset, and TimeZoneIdentifier Parse Nodes contained within parseResult, or an empty sequence of code points if not present.
- auto z = parse_result->utc_designator;
- auto offset_string = parse_result->time_zone_numeric_utc_offset;
- auto name = parse_result->time_zone_identifier;
+ // 2. If parseResult is a Parse Node, then
+ if (parse_result.has_value()) {
+ // a. Return the Record { [[Z]]: false, [[OffsetString]]: undefined, [[Name]]: timeZoneString }.
+ return TemporalTimeZone { .z = false, .offset_string = {}, .name = time_zone_string };
+ }
- // 4. If name is empty, then
- // a. Set name to undefined.
- // 5. Else,
- // a. Set name to CodePointsToString(name).
- // NOTE: No-op.
+ // 3. Let result be ? ParseISODateTime(timeZoneString).
+ auto result = TRY(parse_iso_date_time(vm, time_zone_string));
- // 6. If z is not empty, then
- if (z.has_value()) {
- // a. Return the Record { [[Z]]: true, [[OffsetString]]: undefined, [[Name]]: name }.
- return TemporalTimeZone { .z = true, .offset_string = {}, .name = Optional<String>(move(name)) };
- }
+ // 4. Let timeZoneResult be result.[[TimeZone]].
+ auto const& time_zone_result = result.time_zone;
- // 7. If offsetString is empty, then
- // a. Set offsetString to undefined.
- // 8. Else,
- // a. Set offsetString to CodePointsToString(offsetString).
- // NOTE: No-op.
+ // 5. If timeZoneResult.[[Z]] is false, timeZoneResult.[[OffsetString]] is undefined, and timeZoneResult.[[Name]] is undefined, throw a RangeError exception.
+ if (!time_zone_result.z && !time_zone_result.offset_string.has_value() && !time_zone_result.name.has_value())
+ return vm.throw_completion<RangeError>(ErrorType::TemporalInvalidTimeZoneString, time_zone_string);
- // 9. Return the Record { [[Z]]: false, [[OffsetString]]: offsetString, [[Name]]: name }.
- return TemporalTimeZone { .z = false, .offset_string = Optional<String>(move(offset_string)), .name = Optional<String>(move(name)) };
+ // 6. Return timeZoneResult.
+ return time_zone_result;
}
// 13.39 ParseTemporalYearMonthString ( isoString ), https://tc39.es/proposal-temporal/#sec-temporal-parsetemporalyearmonthstring
diff --git a/Userland/Libraries/LibJS/Runtime/Temporal/ISO8601.cpp b/Userland/Libraries/LibJS/Runtime/Temporal/ISO8601.cpp
index 0bd683dcac..311528fb4c 100644
--- a/Userland/Libraries/LibJS/Runtime/Temporal/ISO8601.cpp
+++ b/Userland/Libraries/LibJS/Runtime/Temporal/ISO8601.cpp
@@ -1400,25 +1400,6 @@ bool ISO8601Parser::parse_temporal_time_string()
|| parse_calendar_time();
}
-// https://tc39.es/proposal-temporal/#prod-TemporalTimeZoneString
-bool ISO8601Parser::parse_temporal_time_zone_string()
-{
- // TemporalTimeZoneString :
- // TimeZoneIdentifier
- // Date TimeSpecSeparator[opt] TimeZone Calendar[opt]
- StateTransaction transaction { *this };
- if (!parse_time_zone_identifier()) {
- if (!parse_date())
- return false;
- (void)parse_time_spec_separator();
- if (!parse_time_zone())
- return false;
- (void)parse_calendar();
- }
- transaction.commit();
- return true;
-}
-
// https://tc39.es/proposal-temporal/#prod-TemporalYearMonthString
bool ISO8601Parser::parse_temporal_year_month_string()
{
@@ -1455,9 +1436,9 @@ bool ISO8601Parser::parse_temporal_zoned_date_time_string()
__JS_ENUMERATE(TemporalDurationString, parse_temporal_duration_string) \
__JS_ENUMERATE(TemporalMonthDayString, parse_temporal_month_day_string) \
__JS_ENUMERATE(TemporalTimeString, parse_temporal_time_string) \
- __JS_ENUMERATE(TemporalTimeZoneString, parse_temporal_time_zone_string) \
__JS_ENUMERATE(TemporalYearMonthString, parse_temporal_year_month_string) \
__JS_ENUMERATE(TemporalZonedDateTimeString, parse_temporal_zoned_date_time_string) \
+ __JS_ENUMERATE(TimeZoneIdentifier, parse_time_zone_identifier) \
__JS_ENUMERATE(TimeZoneNumericUTCOffset, parse_time_zone_numeric_utc_offset) \
__JS_ENUMERATE(CalendarName, parse_calendar_name) \
__JS_ENUMERATE(DateMonth, parse_date_month)
diff --git a/Userland/Libraries/LibJS/Runtime/Temporal/ISO8601.h b/Userland/Libraries/LibJS/Runtime/Temporal/ISO8601.h
index f22816ff5a..fa409b8325 100644
--- a/Userland/Libraries/LibJS/Runtime/Temporal/ISO8601.h
+++ b/Userland/Libraries/LibJS/Runtime/Temporal/ISO8601.h
@@ -50,9 +50,9 @@ enum class Production {
TemporalDurationString,
TemporalMonthDayString,
TemporalTimeString,
- TemporalTimeZoneString,
TemporalYearMonthString,
TemporalZonedDateTimeString,
+ TimeZoneIdentifier,
TimeZoneNumericUTCOffset,
CalendarName,
DateMonth,
@@ -165,7 +165,6 @@ public:
[[nodiscard]] bool parse_temporal_duration_string();
[[nodiscard]] bool parse_temporal_month_day_string();
[[nodiscard]] bool parse_temporal_time_string();
- [[nodiscard]] bool parse_temporal_time_zone_string();
[[nodiscard]] bool parse_temporal_year_month_string();
[[nodiscard]] bool parse_temporal_zoned_date_time_string();