From 79478c8153c0d9568dd0c019e726125c1edac7ca Mon Sep 17 00:00:00 2001 From: "Matthew \"strager\" Glazar" Date: Thu, 28 Dec 2023 13:59:09 -0500 Subject: [PATCH] fix(typescript): replace assertion failures with unexpected token diagnostics --- src/quick-lint-js/fe/parse-statement.cpp | 6 ++++-- test/test-parse-typescript.cpp | 15 +++++++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/quick-lint-js/fe/parse-statement.cpp b/src/quick-lint-js/fe/parse-statement.cpp index 739eb164d6..1d30bf565b 100644 --- a/src/quick-lint-js/fe/parse-statement.cpp +++ b/src/quick-lint-js/fe/parse-statement.cpp @@ -6301,11 +6301,13 @@ void Parser::parse_and_visit_declare_statement( this->parse_and_visit_declare_global(v, declare_context); break; - // declare: // Label. + // declare: // Label. // declare(); + // export declare export // Invalid? case Token_Type::colon: + case Token_Type::left_paren: default: - QLJS_ASSERT(false); + QLJS_PARSER_UNIMPLEMENTED(); break; } } diff --git a/test/test-parse-typescript.cpp b/test/test-parse-typescript.cpp index 2be4c21df9..5bc9b0989e 100644 --- a/test/test-parse-typescript.cpp +++ b/test/test-parse-typescript.cpp @@ -77,6 +77,21 @@ TEST_F(Test_Parse_TypeScript, unicode_next_line_is_whitespace) { typescript_options); EXPECT_THAT(v.variable_uses, ElementsAreArray({u8"x"_sv, u8"y"_sv})); } + +// These examples used to crash with assertion failures. +TEST_F(Test_Parse_TypeScript, no_crash) { + for (String8_View code : { + u8"export declare:"_sv, + u8"export declare export"_sv, + u8"export declare()"_sv, + }) { + Spy_Visitor v; + Padded_String code_string(code); + Parser p(&code_string, &v, typescript_options); + // Should not crash: + p.parse_and_visit_module_catching_fatal_parse_errors(v); + } +} } }