tree-sitter / tree-sitter-typescript

TypeScript grammar for tree-sitter
MIT License
361 stars 108 forks source link

Can't parse `keyof (ObjectType[Lookup])` #149

Closed nbrahms closed 3 years ago

nbrahms commented 3 years ago

Typescript exhibits the following behavior:

type O = { [key: number]: { [key: string]: boolean } }
type NA = keyof (O[number]);          // Returns "string | number"
type NB = (keyof O)[number];          // Throws errors

But tree-sitter succeeds in parsing only the second "keyof" line:

$ tree-sitter parse <(echo 'type Foo = keyof (my_obj[number]);')
(program [0, 0] - [1, 0]
  (type_alias_declaration [0, 0] - [0, 34]
    name: (type_identifier [0, 5] - [0, 8])
    (ERROR [0, 11] - [0, 16])
    value: (parenthesized_type [0, 17] - [0, 33]
      (lookup_type [0, 18] - [0, 32]
        (type_identifier [0, 18] - [0, 24])
        (predefined_type [0, 25] - [0, 31])))))
/dev/fd/11  0 ms    (ERROR [0, 11] - [0, 16])
$ tree-sitter parse <(echo 'type Foo = (keyof my_obj)[number];')
(program [0, 0] - [1, 0]
  (type_alias_declaration [0, 0] - [0, 34]
    name: (type_identifier [0, 5] - [0, 8])
    value: (lookup_type [0, 11] - [0, 33]
      (parenthesized_type [0, 11] - [0, 25]
        (index_type_query [0, 12] - [0, 24]
          (type_identifier [0, 18] - [0, 24])))
      (predefined_type [0, 26] - [0, 32]))))