1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-27 12:17:44 +00:00

LibJS: Support IANA legacy names in the Temporal ISO 8601 grammar

This is a normative change in the Temporal spec.

See: 2419680
This commit is contained in:
Linus Groh 2022-07-30 11:00:08 +02:00
parent 41791146fd
commit 6850f25840
3 changed files with 30 additions and 0 deletions

View file

@ -895,12 +895,37 @@ bool ISO8601Parser::parse_time_zone_iana_name_tail()
return true; return true;
} }
// https://tc39.es/proposal-temporal/#prod-TimeZoneIANALegacyName
bool ISO8601Parser::parse_time_zone_iana_legacy_name()
{
// TimeZoneIANALegacyName :
// Etc/GMT0
// GMT0
// GMT-0
// GMT+0
// EST5EDT
// CST6CDT
// MST7MDT
// PST8PDT
return m_state.lexer.consume_specific("Etc/GMT0"sv)
|| m_state.lexer.consume_specific("GMT0"sv)
|| m_state.lexer.consume_specific("GMT-0"sv)
|| m_state.lexer.consume_specific("GMT+0"sv)
|| m_state.lexer.consume_specific("EST5EDT"sv)
|| m_state.lexer.consume_specific("CST6CDT"sv)
|| m_state.lexer.consume_specific("MST7MDT"sv)
|| m_state.lexer.consume_specific("PST8PDT"sv);
}
// https://tc39.es/proposal-temporal/#prod-TimeZoneIANAName // https://tc39.es/proposal-temporal/#prod-TimeZoneIANAName
bool ISO8601Parser::parse_time_zone_iana_name() bool ISO8601Parser::parse_time_zone_iana_name()
{ {
// TimeZoneIANAName : // TimeZoneIANAName :
// Etc/GMT ASCIISign UnpaddedHour // Etc/GMT ASCIISign UnpaddedHour
// TimeZoneIANANameTail but not Etc/GMT ASCIISign UnpaddedHour // TimeZoneIANANameTail but not Etc/GMT ASCIISign UnpaddedHour
// TimeZoneIANALegacyName
// NOTE: Reverse order here because `TimeZoneIANANameTail` can be a subset of `TimeZoneIANALegacyName`,
// so we'd not attempt to parse that but may not exhaust the input string.
auto parse_etc_gmt_with_offset = [this] { auto parse_etc_gmt_with_offset = [this] {
StateTransaction transaction { *this }; StateTransaction transaction { *this };
if (!m_state.lexer.consume_specific("Etc/GMT"sv)) if (!m_state.lexer.consume_specific("Etc/GMT"sv))
@ -913,6 +938,7 @@ bool ISO8601Parser::parse_time_zone_iana_name()
return true; return true;
}; };
return parse_etc_gmt_with_offset() return parse_etc_gmt_with_offset()
|| parse_time_zone_iana_legacy_name()
|| parse_time_zone_iana_name_tail(); || parse_time_zone_iana_name_tail();
} }

View file

@ -136,6 +136,7 @@ public:
[[nodiscard]] bool parse_tz_char(); [[nodiscard]] bool parse_tz_char();
[[nodiscard]] bool parse_time_zone_iana_component(); [[nodiscard]] bool parse_time_zone_iana_component();
[[nodiscard]] bool parse_time_zone_iana_name_tail(); [[nodiscard]] bool parse_time_zone_iana_name_tail();
[[nodiscard]] bool parse_time_zone_iana_legacy_name();
[[nodiscard]] bool parse_time_zone_iana_name(); [[nodiscard]] bool parse_time_zone_iana_name();
[[nodiscard]] bool parse_time_zone_identifier(); [[nodiscard]] bool parse_time_zone_identifier();
[[nodiscard]] bool parse_time_zone_bracketed_annotation(); [[nodiscard]] bool parse_time_zone_bracketed_annotation();

View file

@ -18,6 +18,9 @@ describe("normal behavior", () => {
["GMT", "UTC"], ["GMT", "UTC"],
["Etc/UTC", "UTC"], ["Etc/UTC", "UTC"],
["Etc/GMT", "UTC"], ["Etc/GMT", "UTC"],
["Etc/GMT0", "UTC"], // IANA legacy name
["Etc/GMT+0", "UTC"], // IANA legacy name
["Etc/GMT-0", "UTC"], // IANA legacy name
["Etc/GMT+6", "Etc/GMT+6"], ["Etc/GMT+6", "Etc/GMT+6"],
["Etc/GMT-6", "Etc/GMT-6"], ["Etc/GMT-6", "Etc/GMT-6"],
["Etc/GMT+12", "Etc/GMT+12"], ["Etc/GMT+12", "Etc/GMT+12"],