Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Query time is much worse if grammar is generated with tree-sitter-cli > 0.16.9 #109

Open
resolritter opened this issue Nov 14, 2020 · 5 comments
Labels
performance parsing takes longer than expected priority:low low priority for the project maintainers, contributions welcome

Comments

@resolritter
Copy link
Contributor

resolritter commented Nov 14, 2020

I'm opening the issue here, specifically, because I'm not seeing such drastic slowdown with other grammars (i.e. they apparently have similar query performance regardless of the version).

I have this huge and really repetitive query which I use for querying identifiers inside specific constructs. When generating the grammar with tree-sitter-cli > 0.16.9, the timings get much worse. I've observed that it's not related to the file size, nor due to how complex the file is, nor due to recent commits in this repository... After experimenting a bit, my gut impression is that "query optimization" got worse > 0.16.9 - the timings stay pretty much the same between different versions if I remove the deeply-nested s-expressions.

ts_query
(function_declaration
    parameters: (formal_parameters
      (required_parameter (object_pattern
  (shorthand_property_identifier) @identifier))))
(function_declaration
    parameters: (formal_parameters
      (required_parameter (object_pattern
  (pair
    value: (object
      (shorthand_property_identifier) @identifier))))))
(function_declaration
    parameters: (formal_parameters
      (required_parameter (object_pattern
  (pair
    value: (object
      (pair
        value: (object
          (pair
            value: (object
              (shorthand_property_identifier) @identifier))))))))))
(function_declaration
    parameters: (formal_parameters
      (optional_parameter (object_pattern
  (shorthand_property_identifier) @identifier))))
(function_declaration
    parameters: (formal_parameters
      (optional_parameter (object_pattern
  (pair
    value: (object
      (shorthand_property_identifier) @identifier))))))
(function_declaration
    parameters: (formal_parameters
      (optional_parameter (object_pattern
  (pair
    value: (object
      (pair
        value: (object
          (pair
            value: (object
              (shorthand_property_identifier) @identifier))))))))))
(arrow_function
    parameters: (formal_parameters
      (required_parameter (object_pattern
  (shorthand_property_identifier) @identifier))))
(arrow_function
    parameters: (formal_parameters
      (required_parameter (object_pattern
  (pair
    value: (object
      (shorthand_property_identifier) @identifier))))))
(arrow_function
    parameters: (formal_parameters
      (required_parameter (object_pattern
  (pair
    value: (object
      (pair
        value: (object
          (pair
            value: (object
              (shorthand_property_identifier) @identifier))))))))))
(arrow_function
    parameters: (formal_parameters
      (optional_parameter (object_pattern
  (shorthand_property_identifier) @identifier))))
(arrow_function
    parameters: (formal_parameters
      (optional_parameter (object_pattern
  (pair
    value: (object
      (shorthand_property_identifier) @identifier))))))
(arrow_function
    parameters: (formal_parameters
      (optional_parameter (object_pattern
  (pair
    value: (object
      (pair
        value: (object
          (pair
            value: (object
              (shorthand_property_identifier) @identifier))))))))))
(arrow_function
    parameters: (formal_parameters
      (required_parameter (object_pattern
  (shorthand_property_identifier) @identifier))))
(arrow_function
    parameters: (formal_parameters
      (required_parameter (object_pattern
  (pair
    value: (object
      (shorthand_property_identifier) @identifier))))))
(arrow_function
    parameters: (formal_parameters
      (required_parameter (object_pattern
  (pair
    value: (object
      (pair
        value: (object
          (pair
            value: (object
              (shorthand_property_identifier) @identifier))))))))))
(arrow_function
    parameters: (formal_parameters
      (optional_parameter (object_pattern
  (shorthand_property_identifier) @identifier))))
(arrow_function
    parameters: (formal_parameters
      (optional_parameter (object_pattern
  (pair
    value: (object
      (shorthand_property_identifier) @identifier))))))
(arrow_function
    parameters: (formal_parameters
      (optional_parameter (object_pattern
  (pair
    value: (object
      (pair
        value: (object
          (pair
            value: (object
              (shorthand_property_identifier) @identifier))))))))))
(function_declaration
    parameters: (formal_parameters
      (required_parameter ((array_pattern
      (identifier) @identifier)))))
(function_declaration
    parameters: (formal_parameters
      (required_parameter (array_pattern (* ((shorthand_property_identifier) @identifier))))))
(function_declaration
    parameters: (formal_parameters
      (required_parameter (array_pattern (* ((identifier) @identifier))))))
(function_declaration
    parameters: (formal_parameters
      (required_parameter (array_pattern (* (* ((shorthand_property_identifier) @identifier)))))))
(function_declaration
    parameters: (formal_parameters
      (required_parameter (array_pattern (* (* ((identifier) @identifier)))))))
(function_declaration
    parameters: (formal_parameters
      (required_parameter (array_pattern (* (* (* ((shorthand_property_identifier) @identifier))))))))
(function_declaration
    parameters: (formal_parameters
      (required_parameter (array_pattern (* (* (* ((identifier) @identifier))))))))
(function_declaration
    parameters: (formal_parameters
      (required_parameter (array_pattern (* (* (* (* ((shorthand_property_identifier) @identifier)))))))))
(function_declaration
    parameters: (formal_parameters
      (required_parameter (array_pattern (* (* (* (* ((identifier) @identifier)))))))))
(function_declaration
    parameters: (formal_parameters
      (optional_parameter ((array_pattern
      (identifier) @identifier)))))
(function_declaration
    parameters: (formal_parameters
      (optional_parameter (array_pattern (* ((shorthand_property_identifier) @identifier))))))
(function_declaration
    parameters: (formal_parameters
      (optional_parameter (array_pattern (* ((identifier) @identifier))))))
(function_declaration
    parameters: (formal_parameters
      (optional_parameter (array_pattern (* (* ((shorthand_property_identifier) @identifier)))))))
(function_declaration
    parameters: (formal_parameters
      (optional_parameter (array_pattern (* (* ((identifier) @identifier)))))))
(function_declaration
    parameters: (formal_parameters
      (optional_parameter (array_pattern (* (* (* ((shorthand_property_identifier) @identifier))))))))
(function_declaration
    parameters: (formal_parameters
      (optional_parameter (array_pattern (* (* (* ((identifier) @identifier))))))))
(function_declaration
    parameters: (formal_parameters
      (optional_parameter (array_pattern (* (* (* (* ((shorthand_property_identifier) @identifier)))))))))
(function_declaration
    parameters: (formal_parameters
      (optional_parameter (array_pattern (* (* (* (* ((identifier) @identifier)))))))))
(arrow_function
    parameters: (formal_parameters
      (required_parameter ((array_pattern
      (identifier) @identifier)))))
(arrow_function
    parameters: (formal_parameters
      (required_parameter (array_pattern (* ((shorthand_property_identifier) @identifier))))))
(arrow_function
    parameters: (formal_parameters
      (required_parameter (array_pattern (* ((identifier) @identifier))))))
(arrow_function
    parameters: (formal_parameters
      (required_parameter (array_pattern (* (* ((shorthand_property_identifier) @identifier)))))))
(arrow_function
    parameters: (formal_parameters
      (required_parameter (array_pattern (* (* ((identifier) @identifier)))))))
(arrow_function
    parameters: (formal_parameters
      (required_parameter (array_pattern (* (* (* ((shorthand_property_identifier) @identifier))))))))
(arrow_function
    parameters: (formal_parameters
      (required_parameter (array_pattern (* (* (* ((identifier) @identifier))))))))
(arrow_function
    parameters: (formal_parameters
      (required_parameter (array_pattern (* (* (* (* ((shorthand_property_identifier) @identifier)))))))))
(arrow_function
    parameters: (formal_parameters
      (required_parameter (array_pattern (* (* (* (* ((identifier) @identifier)))))))))
(arrow_function
    parameters: (formal_parameters
      (optional_parameter ((array_pattern
      (identifier) @identifier)))))
(arrow_function
    parameters: (formal_parameters
      (optional_parameter (array_pattern (* ((shorthand_property_identifier) @identifier))))))
(arrow_function
    parameters: (formal_parameters
      (optional_parameter (array_pattern (* ((identifier) @identifier))))))
(arrow_function
    parameters: (formal_parameters
      (optional_parameter (array_pattern (* (* ((shorthand_property_identifier) @identifier)))))))
(arrow_function
    parameters: (formal_parameters
      (optional_parameter (array_pattern (* (* ((identifier) @identifier)))))))
(arrow_function
    parameters: (formal_parameters
      (optional_parameter (array_pattern (* (* (* ((shorthand_property_identifier) @identifier))))))))
(arrow_function
    parameters: (formal_parameters
      (optional_parameter (array_pattern (* (* (* ((identifier) @identifier))))))))
(arrow_function
    parameters: (formal_parameters
      (optional_parameter (array_pattern (* (* (* (* ((shorthand_property_identifier) @identifier)))))))))
(arrow_function
    parameters: (formal_parameters
      (optional_parameter (array_pattern (* (* (* (* ((identifier) @identifier)))))))))
(arrow_function
    parameters: (formal_parameters
      (required_parameter ((array_pattern
      (identifier) @identifier)))))
(arrow_function
    parameters: (formal_parameters
      (required_parameter (array_pattern (* ((shorthand_property_identifier) @identifier))))))
(arrow_function
    parameters: (formal_parameters
      (required_parameter (array_pattern (* ((identifier) @identifier))))))
(arrow_function
    parameters: (formal_parameters
      (required_parameter (array_pattern (* (* ((shorthand_property_identifier) @identifier)))))))
(arrow_function
    parameters: (formal_parameters
      (required_parameter (array_pattern (* (* ((identifier) @identifier)))))))
(arrow_function
    parameters: (formal_parameters
      (required_parameter (array_pattern (* (* (* ((shorthand_property_identifier) @identifier))))))))
(arrow_function
    parameters: (formal_parameters
      (required_parameter (array_pattern (* (* (* ((identifier) @identifier))))))))
(arrow_function
    parameters: (formal_parameters
      (required_parameter (array_pattern (* (* (* (* ((shorthand_property_identifier) @identifier)))))))))
(arrow_function
    parameters: (formal_parameters
      (required_parameter (array_pattern (* (* (* (* ((identifier) @identifier)))))))))
(arrow_function
    parameters: (formal_parameters
      (optional_parameter ((array_pattern
      (identifier) @identifier)))))
(arrow_function
    parameters: (formal_parameters
      (optional_parameter (array_pattern (* ((shorthand_property_identifier) @identifier))))))
(arrow_function
    parameters: (formal_parameters
      (optional_parameter (array_pattern (* ((identifier) @identifier))))))
(arrow_function
    parameters: (formal_parameters
      (optional_parameter (array_pattern (* (* ((shorthand_property_identifier) @identifier)))))))
(arrow_function
    parameters: (formal_parameters
      (optional_parameter (array_pattern (* (* ((identifier) @identifier)))))))
(arrow_function
    parameters: (formal_parameters
      (optional_parameter (array_pattern (* (* (* ((shorthand_property_identifier) @identifier))))))))
(arrow_function
    parameters: (formal_parameters
      (optional_parameter (array_pattern (* (* (* ((identifier) @identifier))))))))
(arrow_function
    parameters: (formal_parameters
      (optional_parameter (array_pattern (* (* (* (* ((shorthand_property_identifier) @identifier)))))))))
(arrow_function
    parameters: (formal_parameters
      (optional_parameter (array_pattern (* (* (* (* ((identifier) @identifier)))))))))
(function_declaration
    parameters: (formal_parameters
      (required_parameter (identifier) @identifier)))
(function_declaration
    parameters: (formal_parameters
      (optional_parameter (identifier) @identifier)))
(arrow_function
    parameters: (formal_parameters
      (required_parameter (identifier) @identifier)))
(arrow_function
    parameters: (formal_parameters
      (optional_parameter (identifier) @identifier)))
(arrow_function
    parameters: (formal_parameters
      (required_parameter (identifier) @identifier)))
(arrow_function
    parameters: (formal_parameters
      (optional_parameter (identifier) @identifier)))
(for_in_statement
  left: (object_pattern
  (shorthand_property_identifier) @identifier))
(for_in_statement
  left: (object_pattern
  (pair
    value: (object
      (shorthand_property_identifier) @identifier))))
(for_in_statement
  left: (object_pattern
  (pair
    value: (object
      (pair
        value: (object
          (pair
            value: (object
              (shorthand_property_identifier) @identifier))))))))
(for_in_statement
  left: (identifier) @identifier)
(assignment_expression
  left: (identifier) @identifier)
(import_statement
  (import_clause
    (named_imports
      (import_specifier
        name: (identifier) @identifier))))
(import_statement
  (import_clause
    (named_imports
      (import_specifier
        alias: (identifier) @identifier))))
(import_statement
  (import_clause
    (identifier) @identifier))
(variable_declarator
  name: (object_pattern
  (shorthand_property_identifier) @identifier))
(variable_declarator
  name: (object_pattern
  (pair
    value: (object
      (shorthand_property_identifier) @identifier))))
(variable_declarator
  name: (object_pattern
  (pair
    value: (object
      (pair
        value: (object
          (pair
            value: (object
              (shorthand_property_identifier) @identifier))))))))
(variable_declarator
  name: (object_pattern
  (pair
    value: (identifier) @identifier)))
(variable_declarator
  name: (object_pattern
  (pair
    value: (object
      (pair
        value: (identifier) @identifier)))))
(variable_declarator
  name: (object_pattern
  (pair
    value: (object
      (pair
        value: (object
          (pair
            value: (identifier) @identifier)))))))
(variable_declarator
  name: ((array_pattern
      (identifier) @identifier)))
(variable_declarator
  name: (array_pattern (* ((shorthand_property_identifier) @identifier))))
(variable_declarator
  name: (array_pattern (* ((identifier) @identifier))))
(variable_declarator
  name: (array_pattern (* (* ((shorthand_property_identifier) @identifier)))))
(variable_declarator
  name: (array_pattern (* (* ((identifier) @identifier)))))
(variable_declarator
  name: (array_pattern (* (* (* ((shorthand_property_identifier) @identifier))))))
(variable_declarator
  name: (array_pattern (* (* (* ((identifier) @identifier))))))
(variable_declarator
  name: (array_pattern (* (* (* (* ((shorthand_property_identifier) @identifier)))))))
(variable_declarator
  name: (array_pattern (* (* (* (* ((identifier) @identifier)))))))
(variable_declarator
  name: (identifier) @identifier)
(function_declaration name: (identifier) @identifier)
(namespace_import (identifier) @identifier)
((type_identifier) @identifier)
(object_pattern
  (pair
    value: (identifier) @identifier))
(labeled_statement
  label: (statement_identifier) @identifier)

For the following timings, I'm running the above query against the React Typings (source) which has 3169 lines.

If it's generated with tree-sitter 0.16.9 (12341dbbc03075e0b3bdcbf05191efbac78731fe)

time ../node_modules/.bin/tree-sitter query ts_query react.d.ts
real	0m0.068s
user 0m0.053s
sys	0m0.014s

If it's generated with tree-sitter 0.17.0 (b6fba7ca4c32207fa9b387b594a8da2ff66ee4be) (and above)

time ../node_modules/.bin/tree-sitter query ts_query react.d.ts
real	0m0.492s
user 0m0.473s
sys	0m0.017s

Earlier it was mentioned

I'm not seeing such drastic slowdown with other grammars (i.e. they apparently behave up to par regardless of the version).

On that note, I here's a query very similar to the one posted above, but for JavaScript instead

js_query
(function_declaration
    parameters: (formal_parameters (object_pattern
  (shorthand_property_identifier) @identifier)))
(function_declaration
    parameters: (formal_parameters (object_pattern
  (pair
    value: (object
      (shorthand_property_identifier) @identifier)))))
(function_declaration
    parameters: (formal_parameters (object_pattern
  (pair
    value: (object
      (pair
        value: (object
          (pair
            value: (object
              (shorthand_property_identifier) @identifier)))))))))
(function
    parameters: (formal_parameters (object_pattern
  (shorthand_property_identifier) @identifier)))
(function
    parameters: (formal_parameters (object_pattern
  (pair
    value: (object
      (shorthand_property_identifier) @identifier)))))
(function
    parameters: (formal_parameters (object_pattern
  (pair
    value: (object
      (pair
        value: (object
          (pair
            value: (object
              (shorthand_property_identifier) @identifier)))))))))
(arrow_function
    parameters: (formal_parameters (object_pattern
  (shorthand_property_identifier) @identifier)))
(arrow_function
    parameters: (formal_parameters (object_pattern
  (pair
    value: (object
      (shorthand_property_identifier) @identifier)))))
(arrow_function
    parameters: (formal_parameters (object_pattern
  (pair
    value: (object
      (pair
        value: (object
          (pair
            value: (object
              (shorthand_property_identifier) @identifier)))))))))
(function_declaration
    parameters: (formal_parameters ((array_pattern
      (identifier) @identifier))))
(function_declaration
    parameters: (formal_parameters (array_pattern (* ((shorthand_property_identifier) @identifier)))))
(function_declaration
    parameters: (formal_parameters (array_pattern (* ((identifier) @identifier)))))
(function_declaration
    parameters: (formal_parameters (array_pattern (* (* ((shorthand_property_identifier) @identifier))))))
(function_declaration
    parameters: (formal_parameters (array_pattern (* (* ((identifier) @identifier))))))
(function_declaration
    parameters: (formal_parameters (array_pattern (* (* (* ((shorthand_property_identifier) @identifier)))))))
(function_declaration
    parameters: (formal_parameters (array_pattern (* (* (* ((identifier) @identifier)))))))
(function_declaration
    parameters: (formal_parameters (array_pattern (* (* (* (* ((shorthand_property_identifier) @identifier))))))))
(function_declaration
    parameters: (formal_parameters (array_pattern (* (* (* (* ((identifier) @identifier))))))))
(function
    parameters: (formal_parameters ((array_pattern
      (identifier) @identifier))))
(function
    parameters: (formal_parameters (array_pattern (* ((shorthand_property_identifier) @identifier)))))
(function
    parameters: (formal_parameters (array_pattern (* ((identifier) @identifier)))))
(function
    parameters: (formal_parameters (array_pattern (* (* ((shorthand_property_identifier) @identifier))))))
(function
    parameters: (formal_parameters (array_pattern (* (* ((identifier) @identifier))))))
(function
    parameters: (formal_parameters (array_pattern (* (* (* ((shorthand_property_identifier) @identifier)))))))
(function
    parameters: (formal_parameters (array_pattern (* (* (* ((identifier) @identifier)))))))
(function
    parameters: (formal_parameters (array_pattern (* (* (* (* ((shorthand_property_identifier) @identifier))))))))
(function
    parameters: (formal_parameters (array_pattern (* (* (* (* ((identifier) @identifier))))))))
(arrow_function
    parameters: (formal_parameters ((array_pattern
      (identifier) @identifier))))
(arrow_function
    parameters: (formal_parameters (array_pattern (* ((shorthand_property_identifier) @identifier)))))
(arrow_function
    parameters: (formal_parameters (array_pattern (* ((identifier) @identifier)))))
(arrow_function
    parameters: (formal_parameters (array_pattern (* (* ((shorthand_property_identifier) @identifier))))))
(arrow_function
    parameters: (formal_parameters (array_pattern (* (* ((identifier) @identifier))))))
(arrow_function
    parameters: (formal_parameters (array_pattern (* (* (* ((shorthand_property_identifier) @identifier)))))))
(arrow_function
    parameters: (formal_parameters (array_pattern (* (* (* ((identifier) @identifier)))))))
(arrow_function
    parameters: (formal_parameters (array_pattern (* (* (* (* ((shorthand_property_identifier) @identifier))))))))
(arrow_function
    parameters: (formal_parameters (array_pattern (* (* (* (* ((identifier) @identifier))))))))
(function_declaration
    parameters: (formal_parameters (identifier) @identifier))
(function
    parameters: (formal_parameters (identifier) @identifier))
(arrow_function
    parameters: (formal_parameters (identifier) @identifier))
(function_declaration
    parameters: (formal_parameters (rest_parameter
  (identifier) @identifier)))
(function
    parameters: (formal_parameters (rest_parameter
  (identifier) @identifier)))
(arrow_function
    parameters: (formal_parameters (rest_parameter
  (identifier) @identifier)))
(for_in_statement
  left: (object_pattern
  (shorthand_property_identifier) @identifier))
(for_in_statement
  left: (object_pattern
  (pair
    value: (object
      (shorthand_property_identifier) @identifier))))
(for_in_statement
  left: (object_pattern
  (pair
    value: (object
      (pair
        value: (object
          (pair
            value: (object
              (shorthand_property_identifier) @identifier))))))))
(for_in_statement
  left: (identifier) @identifier)
(assignment_expression
  left: (identifier) @identifier)
(import_statement
  (import_clause
    (named_imports
      (import_specifier
        name: (identifier) @identifier))))
(import_statement
  (import_clause
    (named_imports
      (import_specifier
        alias: (identifier) @identifier))))
(import_statement
  (import_clause
    (identifier) @identifier))
(variable_declarator
  name: (object_pattern
  (shorthand_property_identifier) @identifier))
(variable_declarator
  name: (object_pattern
  (pair
    value: (object
      (shorthand_property_identifier) @identifier))))
(variable_declarator
  name: (object_pattern
  (pair
    value: (object
      (pair
        value: (object
          (pair
            value: (object
              (shorthand_property_identifier) @identifier))))))))
(variable_declarator
  name: (object_pattern
  (pair
    value: (identifier) @identifier)))
(variable_declarator
  name: (object_pattern
  (pair
    value: (object
      (pair
        value: (identifier) @identifier)))))
(variable_declarator
  name: (object_pattern
  (pair
    value: (object
      (pair
        value: (object
          (pair
            value: (identifier) @identifier)))))))
(variable_declarator
  name: ((array_pattern
      (identifier) @identifier)))
(variable_declarator
  name: (array_pattern (* ((shorthand_property_identifier) @identifier))))
(variable_declarator
  name: (array_pattern (* ((identifier) @identifier))))
(variable_declarator
  name: (array_pattern (* (* ((shorthand_property_identifier) @identifier)))))
(variable_declarator
  name: (array_pattern (* (* ((identifier) @identifier)))))
(variable_declarator
  name: (array_pattern (* (* (* ((shorthand_property_identifier) @identifier))))))
(variable_declarator
  name: (array_pattern (* (* (* ((identifier) @identifier))))))
(variable_declarator
  name: (array_pattern (* (* (* (* ((shorthand_property_identifier) @identifier)))))))
(variable_declarator
  name: (array_pattern (* (* (* (* ((identifier) @identifier)))))))
(variable_declarator
  name: (identifier) @identifier)
(class_declaration name: (identifier) @identifier)
(function_declaration name: (identifier) @identifier)
(namespace_import (identifier) @identifier)
(object_pattern
  (pair
    value: (identifier) @identifier))
(labeled_statement
  label: (statement_identifier) @identifier)

I did the same experiment running js_query against d3.js' source code (source) which has 19540 lines. In this case, regardless of the tree-sitter-cli version used, the timings are pretty much the same.

time ./node_modules/.bin/tree-sitter query js_query d3.js

real	0m0.252s
user 0m0.211s
sys	0m0.040s

To summarize, I'm noticing a strange behavior where (apparently only) this grammar, specifically, runs queries much slower if it's generated with tree-sitter-cli > 0.16.9.

@maxbrunsfeld
Copy link
Contributor

Wow. That is quite a query.

Is the slowness occurring when constructing the query, or executing it? I would think that the time to construct the query would go up with tree-sitter 0.17, because we’re doing additional analysis of the query during construction. But if you cache the query and run it repeatedly, I would hope that each execution is the same speed as before. Does that match what you’re seeing?

There is probably more room for optimization in our up front query analysis.

@resolritter
Copy link
Contributor Author

I would think that the time to construct the query would go up with tree-sitter 0.17

This aligns with what I'm seeing. By caching the query, do you mean constructing it and keeping the reference in memory? If so, that's different from what I'm doing, since I'm running from the CLI; there, the behavior is as described in the OP for repetitive runs.

There is probably more room for optimization in our up front query analysis.

Alternatively, there could room for optimizations or terseness for the patterns I'm using. A lot of the expressions are pretty much the same, only repeated for reaching the nested levels. Take this one, for instance:

(variable_declarator
  name: (array_pattern (* ((shorthand_property_identifier) @identifier))))
(variable_declarator
  name: (array_pattern (* (* ((shorthand_property_identifier) @identifier)))))
(variable_declarator
  name: (array_pattern (* (* (* ((shorthand_property_identifier) @identifier))))))
(variable_declarator
  name: (array_pattern (* (* (* (* ((shorthand_property_identifier) @identifier)))))))

Ideally I'd want to express it like this

(variable_declarator
  name: (array_pattern (** ((shorthand_property_identifier) @identifier))))

** means, like in the glob syntax, "however levels deep". That'd be strictly more accurate and more readable than what I'm doing currently. I didn't find a way to express that using the current syntax, so I wrote a script to generate arbitrarily nested levels manually and put them into the query. Admittedly, this approach is somewhat old... I don't exactly know if there are alternatives with the recent syntax additions. Do you think this use-case warrants an issue in the tree-sitter repository? Or, alternatively, is there a current way to achieve this?

@maxbrunsfeld
Copy link
Contributor

There is no way to achieve that glob "however many levels deep" behavior yet, though I agree that would be a good feature.

I will try to see if I can optimize query construction for queries like yours though.

@resolritter
Copy link
Contributor Author

I've thought about this a bit more and refactored my approach. I was using the query to distinguish between identifier declaration from other occurrences on a "jump-to-definition" custom function I have, thus I only want to care about where it's first defined. I realized they can also be distinguished by hierarchically nesting lexical scopes (some blocks introduce scopes where identifiers are only valid inside of them, e.g. a function parameter), then noticing if the identifier occurrence is the first one on a ancestral scope (a lexical scope which contains the nearest parent scope).

In other words I'm no longer bothered by this for the use-case I was using the query for, although it might have other applications (e.g. on highlighting queries).

@seblj
Copy link

seblj commented Mar 19, 2021

I am using nvim-treesitter and noticing much worse performance now compared to a week ago. Don't remember which version I was on before updating, but I noticed the slowing down after having to update tree-sitter to 0.19.3. I don't find the same performance issues with different languages like C or Python.

When opening a buffer in nvim with typescript highlighting from tree-sitter, I am getting consistently 300+ ms for the first screen update when using --startuptime. If I disable the highlighting from tree-sitter, the same first screen update uses around 1ms.

@mjambon mjambon added performance parsing takes longer than expected priority:low low priority for the project maintainers, contributions welcome labels Apr 27, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
performance parsing takes longer than expected priority:low low priority for the project maintainers, contributions welcome
Projects
None yet
Development

No branches or pull requests

4 participants