Skip to content

Commit

Permalink
Bump TREE_SITTER_MATCH_LIMIT to 256 (helix-editor#4830)
Browse files Browse the repository at this point in the history
The limit of 64 breaks some highlighting in Erlang files with
complicated record definitions. Bumping to 256  seems to work on all
files I have seen.
  • Loading branch information
the-mikedavis authored and Frederik Vestre committed Feb 6, 2023
1 parent 2d9e3a9 commit 6d907b8
Showing 1 changed file with 9 additions and 8 deletions.
17 changes: 9 additions & 8 deletions helix-core/src/syntax.rs
Original file line number Diff line number Diff line change
Expand Up @@ -354,24 +354,25 @@ impl<'a> CapturedNode<'a> {
}
}

/// The number of matches a TS cursor can at once to avoid performance problems for medium to large files.
/// Set with `set_match_limit`.
/// Using such a limit means that we lose valid captures in, so there is fundamentally a tradeoff here.
/// The maximum number of in-progress matches a TS cursor can consider at once.
/// This is set to a constant in order to avoid performance problems for medium to large files. Set with `set_match_limit`.
/// Using such a limit means that we lose valid captures, so there is fundamentally a tradeoff here.
///
///
/// Old tree sitter versions used a limit of 32 by default until this limit was removed in version `0.19.5` (must now be set manually).
/// However, this causes performance issues for medium to large files.
/// In helix, this problem caused treesitter motions to take multiple seconds to complete in medium-sized rust files (3k loc).
///
///
/// Neovim also encountered this problem and reintroduced this limit after it was removed upstream
/// (see <https://github.com/neovim/neovim/issues/14897> and <https://github.com/neovim/neovim/pull/14915>).
/// The number used here is fundamentally a tradeoff between breaking some obscure edge cases and performance.
///
///
/// A value of 64 was chosen because neovim uses that value.
/// Neovim chose this value somewhat arbitrarily (<https://github.com/neovim/neovim/pull/18397>) adjusting it whenever issues occur in practice.
/// However this value has been in use for a long time and due to the large userbase of neovim it is probably a good choice.
/// If this limit causes problems for a grammar in the future, it could be increased.
const TREE_SITTER_MATCH_LIMIT: u32 = 64;
/// Neovim chose 64 for this value somewhat arbitrarily (<https://github.com/neovim/neovim/pull/18397>).
/// 64 is too low for some languages though. In particular, it breaks some highlighting for record fields in Erlang record definitions.
/// This number can be increased if new syntax highlight breakages are found, as long as the performance penalty is not too high.
const TREE_SITTER_MATCH_LIMIT: u32 = 256;

impl TextObjectQuery {
/// Run the query on the given node and return sub nodes which match given
Expand Down

0 comments on commit 6d907b8

Please sign in to comment.