mirror of
https://github.com/neovim/neovim.git
synced 2026-04-21 23:05:41 +00:00
feat(treesitter)!: incremental injection parsing
Problem:
Treesitter highlighting is slow for large files with lots of injections.
Solution:
Only parse injections we are going to render during a redraw cycle.
---
- `LanguageTree:parse()` will no longer parse injections by default and
now requires an explicit range argument to be passed.
- `TSHighlighter` now parses injections incrementally during on_win
callbacks for the line range being rendered.
- Plugins which require certain injections to be parsed must run
`parser:parse({ start_row, end_row })` before using the tree.
This commit is contained in:
committed by
Lewis Russell
parent
5a25dcc5a4
commit
2ca076e45f
@@ -147,11 +147,14 @@ local function normalise_erow(bufnr, erow)
|
||||
return math.min(erow or max_erow, max_erow)
|
||||
end
|
||||
|
||||
-- TODO(lewis6991): Setup a decor provider so injections folds can be parsed
|
||||
-- as the window is redrawn
|
||||
---@param bufnr integer
|
||||
---@param info TS.FoldInfo
|
||||
---@param srow integer?
|
||||
---@param erow integer?
|
||||
local function get_folds_levels(bufnr, info, srow, erow)
|
||||
---@param parse_injections? boolean
|
||||
local function get_folds_levels(bufnr, info, srow, erow, parse_injections)
|
||||
srow = srow or 0
|
||||
erow = normalise_erow(bufnr, erow)
|
||||
|
||||
@@ -162,7 +165,7 @@ local function get_folds_levels(bufnr, info, srow, erow)
|
||||
|
||||
local parser = ts.get_parser(bufnr)
|
||||
|
||||
parser:parse()
|
||||
parser:parse(parse_injections and { srow, erow } or nil)
|
||||
|
||||
parser:for_each_tree(function(tree, ltree)
|
||||
local query = ts.query.get(ltree:lang(), 'folds')
|
||||
|
||||
Reference in New Issue
Block a user