Skip to content

Commit 5366a01

Browse files
committed
fix(typescript): fix cyclic type definition check when using namespace
1 parent e2a8e90 commit 5366a01

File tree

4 files changed

+25
-15
lines changed

4 files changed

+25
-15
lines changed

docs/CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@ Semantic Versioning.
5151
* Generic call signatures are now parsed correctly when using a semicolon-free
5252
coding style.
5353
* `declare const x = 42;` no longer falsely reports [E0351][] or [E0385][].
54+
* `type T = T.thing;` no longer falsely reports [E0384][] ("cannot use type
55+
directly in its own definition").
5456

5557
## 2.18.0 (2023-11-03)
5658

src/quick-lint-js/fe/parse-type.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -277,7 +277,7 @@ void Parser::parse_and_visit_typescript_type_expression(
277277
}
278278

279279
if (parse_options.type_being_declared.has_value() &&
280-
this->peek().type != Token_Type::left_square) {
280+
this->peek().type != Token_Type::left_square && !had_dot) {
281281
// Shallow use.
282282
if (name.normalized_name() ==
283283
parse_options.type_being_declared->name.normalized_name()) {

test/test-parse-typescript-generic.cpp

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -281,13 +281,6 @@ TEST_F(Test_Parse_TypeScript_Generic, extends_cannot_be_directly_cyclic) {
281281
u8"{.kind=Variable_Kind::_generic_parameter}"_diag,
282282
typescript_options);
283283

284-
test_parse_and_visit_typescript_generic_parameters(
285-
u8"<T extends T.foo>"_sv,
286-
u8" ^ Diag_Cyclic_TypeScript_Type_Definition.use\n"_diag
287-
u8" ^ .declaration"_diag
288-
u8"{.kind=Variable_Kind::_generic_parameter}"_diag,
289-
typescript_options);
290-
291284
test_parse_and_visit_typescript_generic_parameters(
292285
u8"<T extends T<number>>"_sv,
293286
u8" ^ Diag_Cyclic_TypeScript_Type_Definition.use\n"_diag
@@ -328,6 +321,16 @@ TEST_F(Test_Parse_TypeScript_Generic, extends_cannot_be_directly_cyclic) {
328321
typescript_options);
329322
}
330323

324+
TEST_F(Test_Parse_TypeScript_Generic,
325+
extends_can_reference_namespace_with_same_name_as_declared_variable) {
326+
Spy_Visitor v = test_parse_and_visit_typescript_generic_parameters(
327+
u8"<T extends T.foo>"_sv, no_diags, typescript_options);
328+
EXPECT_THAT(v.visits, ElementsAreArray({
329+
"visit_variable_declaration", // T
330+
"visit_variable_namespace_use", // T (in T.foo)
331+
}));
332+
}
333+
331334
TEST_F(Test_Parse_TypeScript_Generic, unexpected_colon_in_parameter_extends) {
332335
{
333336
Spy_Visitor p = test_parse_and_visit_typescript_generic_parameters(

test/test-parse-typescript-type-alias.cpp

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -190,13 +190,6 @@ TEST_F(Test_Parse_TypeScript_Type_Alias, type_alias_cannot_be_directly_cyclic) {
190190
u8"{.kind=Variable_Kind::_type_alias}"_diag,
191191
typescript_options);
192192

193-
test_parse_and_visit_statement(
194-
u8"type T = T.foo;"_sv,
195-
u8" ^ Diag_Cyclic_TypeScript_Type_Definition.use\n"_diag
196-
u8" ^ .declaration"_diag
197-
u8"{.kind=Variable_Kind::_type_alias}"_diag,
198-
typescript_options);
199-
200193
test_parse_and_visit_statement(
201194
u8"type T = T<number>;"_sv,
202195
u8" ^ Diag_Cyclic_TypeScript_Type_Definition.use\n"_diag
@@ -243,6 +236,18 @@ TEST_F(Test_Parse_TypeScript_Type_Alias, type_alias_cannot_be_directly_cyclic) {
243236
typescript_options);
244237
}
245238

239+
TEST_F(Test_Parse_TypeScript_Type_Alias,
240+
type_alias_can_reference_namespace_with_same_name) {
241+
Spy_Visitor v = test_parse_and_visit_statement(u8"type T = T.foo;"_sv,
242+
no_diags, typescript_options);
243+
EXPECT_THAT(v.visits, ElementsAreArray({
244+
"visit_variable_declaration", // T
245+
"visit_enter_type_alias_scope", //
246+
"visit_variable_namespace_use", // T (in T.foo)
247+
"visit_exit_type_alias_scope", //
248+
}));
249+
}
250+
246251
TEST_F(Test_Parse_TypeScript_Type_Alias,
247252
type_alias_can_be_named_certain_contextual_keywords) {
248253
for (String8 name :

0 commit comments

Comments
 (0)