Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions common/define-grammar.js
Original file line number Diff line number Diff line change
Expand Up @@ -694,7 +694,7 @@ module.exports = function defineGrammar(dialect) {
_type_query_member_expression_in_type_annotation: $ => seq(
field('object', choice(
$.import,
alias($._type_query_member_expression_in_type_annotation, $.member_expression),
prec.left(1, alias($._type_query_member_expression_in_type_annotation, $.member_expression)),
alias($._type_query_call_expression_in_type_annotation, $.call_expression),
)),
'.',
Expand Down Expand Up @@ -847,7 +847,7 @@ module.exports = function defineGrammar(dialect) {
$.identifier,
$.this,
alias($._type_query_subscript_expression, $.subscript_expression),
alias($._type_query_member_expression, $.member_expression),
prec.left(1, alias($._type_query_member_expression, $.member_expression)),
alias($._type_query_call_expression, $.call_expression),
)),
choice('.', '?.'),
Expand All @@ -860,7 +860,7 @@ module.exports = function defineGrammar(dialect) {
field('object', choice(
$.identifier,
$.this,
alias($._type_query_subscript_expression, $.subscript_expression),
prec.left(1, alias($._type_query_subscript_expression, $.subscript_expression)),
alias($._type_query_member_expression, $.member_expression),
alias($._type_query_call_expression, $.call_expression),
)),
Expand Down
256 changes: 256 additions & 0 deletions test/corpus/type-query-regression.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,256 @@
==================
Type query with ReturnType and typeof (regression test)
==================

interface LoggerInstance {
debug: ReturnType<typeof vi.fn>;
info: ReturnType<typeof vi.fn>;
warn: ReturnType<typeof vi.fn>;
error: ReturnType<typeof vi.fn>;
}

---

(program
(interface_declaration
name: (type_identifier)
body: (interface_body
(property_signature
name: (property_identifier)
type: (type_annotation
(generic_type
name: (type_identifier)
type_arguments: (type_arguments
(type_query
(member_expression
object: (identifier)
property: (property_identifier)))))))
(property_signature
name: (property_identifier)
type: (type_annotation
(generic_type
name: (type_identifier)
type_arguments: (type_arguments
(type_query
(member_expression
object: (identifier)
property: (property_identifier)))))))
(property_signature
name: (property_identifier)
type: (type_annotation
(generic_type
name: (type_identifier)
type_arguments: (type_arguments
(type_query
(member_expression
object: (identifier)
property: (property_identifier)))))))
(property_signature
name: (property_identifier)
type: (type_annotation
(generic_type
name: (type_identifier)
type_arguments: (type_arguments
(type_query
(member_expression
object: (identifier)
property: (property_identifier))))))))))

==================
Complex nested member expressions
==================

type T1 = typeof obj.prop.nested;
type T2 = typeof this.method.result;

---

(program
(type_alias_declaration
name: (type_identifier)
value: (type_query
(member_expression
object: (member_expression
object: (identifier)
property: (property_identifier))
property: (property_identifier))))
(type_alias_declaration
name: (type_identifier)
value: (type_query
(member_expression
object: (member_expression
object: (this)
property: (property_identifier))
property: (property_identifier)))))

==================
Nested object access
==================

type Obj = typeof foo.bar.baz.qux;

---

(program
(type_alias_declaration
name: (type_identifier)
value: (type_query
(member_expression
object: (member_expression
object: (member_expression
object: (identifier)
property: (property_identifier))
property: (property_identifier))
property: (property_identifier)))))

==================
Optional chaining in type queries
==================

type T = typeof obj?.prop;

---

(program
(type_alias_declaration
name: (type_identifier)
value: (type_query
(member_expression
object: (identifier)
property: (property_identifier)))))

==================
Array subscript in type queries
==================

type T = typeof arr[0];

---

(program
(type_alias_declaration
name: (type_identifier)
value: (lookup_type
(type_query
(identifier))
(literal_type
(number)))))

==================
Call expression with import in type query
==================

type T = typeof import("module").default;

---

(program
(type_alias_declaration
name: (type_identifier)
value: (type_query
(member_expression
object: (call_expression
function: (import)
arguments: (arguments
(string
(string_fragment))))
property: (property_identifier)))))

==================
Real-world vitest mock interface (full reproduction)
==================

interface LoggerInstance {
debug: ReturnType<typeof vi.fn>;
info: ReturnType<typeof vi.fn>;
warn: ReturnType<typeof vi.fn>;
error: ReturnType<typeof vi.fn>;
}

const mockLogger: LoggerInstance = {
debug: vi.fn(),
info: vi.fn(),
warn: vi.fn(),
error: vi.fn(),
};

---

(program
(interface_declaration
name: (type_identifier)
body: (interface_body
(property_signature
name: (property_identifier)
type: (type_annotation
(generic_type
name: (type_identifier)
type_arguments: (type_arguments
(type_query
(member_expression
object: (identifier)
property: (property_identifier)))))))
(property_signature
name: (property_identifier)
type: (type_annotation
(generic_type
name: (type_identifier)
type_arguments: (type_arguments
(type_query
(member_expression
object: (identifier)
property: (property_identifier)))))))
(property_signature
name: (property_identifier)
type: (type_annotation
(generic_type
name: (type_identifier)
type_arguments: (type_arguments
(type_query
(member_expression
object: (identifier)
property: (property_identifier)))))))
(property_signature
name: (property_identifier)
type: (type_annotation
(generic_type
name: (type_identifier)
type_arguments: (type_arguments
(type_query
(member_expression
object: (identifier)
property: (property_identifier)))))))))
(lexical_declaration
(variable_declarator
name: (identifier)
type: (type_annotation
(type_identifier))
value: (object
(pair
key: (property_identifier)
value: (call_expression
function: (member_expression
object: (identifier)
property: (property_identifier))
arguments: (arguments)))
(pair
key: (property_identifier)
value: (call_expression
function: (member_expression
object: (identifier)
property: (property_identifier))
arguments: (arguments)))
(pair
key: (property_identifier)
value: (call_expression
function: (member_expression
object: (identifier)
property: (property_identifier))
arguments: (arguments)))
(pair
key: (property_identifier)
value: (call_expression
function: (member_expression
object: (identifier)
property: (property_identifier))
arguments: (arguments)))))))
48 changes: 30 additions & 18 deletions tsx/src/grammar.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading