Files
neovim/runtime/doc
Lewis Russell 33ea63011c perf(treesitter): reuse edited tree ranges for callbacks
After an edit, LanguageTree:_edit() updates the current trees. When the
LanguageTree manages explicit regions, _edit() also refreshes _regions
from tree:included_ranges(true), so those regions have the edited byte
offsets.

A later injection pass may call set_included_regions() with a different
number of child regions. That path discards the old trees and emits
changedtree callbacks for them. invalidate(true) does the same when a
buffer is reloaded. Before this change, both discard paths called
tree:included_ranges(true) for every old tree, even if _edit() had just
collected those exact ranges.

That duplicate range extraction is expensive with many injection trees.
Realistic shapes include generated C files with many macro bodies parsed
by the C preproc_arg injection, Markdown documents with many fenced blocks
of the same language, and template files with many embedded-language
islands. The stock highlighter registers recursive changedtree callbacks,
so this is on the normal highlighting edit path.

Track whether _regions currently came from tree:included_ranges(true)
with _regions_from_tree_ranges. _do_changedtree_callbacks() reuses
_regions only in that state; otherwise it falls back to calling
tree:included_ranges(true). Clear the marker when regions are replaced by
injection ranges, when a tree is reparsed, or when trees are discarded.

This avoids keeping a second copy of the ranges while preserving callback
precision: changedtree still receives tree:included_ranges(true) for the
old tree, not the broader managed region.

Benchmark on 100k C macro injections, one-line edit, recursive
changedtree callback:

- HEAD median: edited parse 84.2 ms, child region replacement 58.7 ms
- This change: edited parse 34.6 ms, child region replacement 8.5 ms

That is about 2.4x faster for the edit parse and 6.9x faster for child
region replacement in this workload.

Add a regression test that replacing injection regions still fires
changedtree and still reports the old tree's exact included ranges.

AI-assisted: Codex
2026-04-28 17:38:09 +01:00
..
2026-04-26 20:25:49 +02:00
2026-04-01 07:59:51 +08:00
2026-04-16 10:48:11 -04:00
2026-04-25 11:16:18 -04:00
2026-02-12 13:46:45 +01:00
2024-05-15 23:19:26 +02:00
2026-04-25 11:16:18 -04:00
2026-04-25 11:16:18 -04:00
2026-04-26 20:25:49 +02:00
2026-04-16 10:48:11 -04:00
2026-04-18 15:38:59 -04:00
2025-12-06 20:33:02 -05:00
2023-06-25 17:14:28 +02:00
2026-04-18 15:38:59 -04:00
2026-01-27 17:14:57 -05:00
2026-04-18 15:38:59 -04:00
2026-04-26 20:25:49 +02:00
2026-03-29 20:53:24 -04:00
2025-12-15 13:55:15 -05:00
2026-03-16 10:29:58 +01:00
2026-02-12 13:46:45 +01:00
2026-04-16 10:48:11 -04:00
2025-09-28 20:57:59 -07:00
2026-03-24 00:14:55 +01:00
2026-04-25 11:16:18 -04:00
2026-04-26 20:25:49 +02:00
2025-12-15 13:55:15 -05:00
2026-04-26 20:25:49 +02:00
2026-03-22 01:57:28 +01:00
2026-04-16 10:48:11 -04:00
2026-04-22 18:25:07 -04:00
2026-03-18 20:40:20 +01:00
2026-04-26 20:25:49 +02:00
2026-01-07 08:11:42 +08:00
2026-03-24 00:14:55 +01:00
2025-12-06 20:33:02 -05:00
2026-04-12 14:17:50 +02:00
2026-04-12 14:17:50 +02:00
2026-03-11 12:39:49 +01:00
2025-12-15 13:55:15 -05:00