Conservative heuristic for tree-sitter parser ranges (bug#73324)

* src/treesit.c (treesit_sync_visible_region): If the parser's original
ranges don't overlap with visible region, give it a zero range, rather
than don't set any range.
* test/src/treesit-tests.el (treesit-range-fixup-after-edit): Test new
behavior.
This commit is contained in:
Yuan Fu 2024-09-17 21:17:13 -07:00
parent 035024b4e5
commit f0daa2f215
No known key found for this signature in database
GPG key ID: 56E19BC57664A442
2 changed files with 19 additions and 24 deletions

View file

@ -1098,31 +1098,26 @@ treesit_sync_visible_region (Lisp_Object parser)
prev_cons = lisp_ranges;
}
/* We are in a weird situation here: none of the previous ranges
overlaps with the new visible region. We don't have any good
options, so just throw the towel: just give the parser a zero
range. (Perfect filling!!) */
if (NILP (new_ranges_head))
new_ranges_head = Fcons (Fcons (make_fixnum (visible_beg),
make_fixnum (visible_beg)),
Qnil);
XTS_PARSER (parser)->last_set_ranges = new_ranges_head;
if (NILP (new_ranges_head))
{
/* We are in a weird situation here: none of the previous ranges
overlaps with the new visible region. We don't have any good
options, so just throw the towel: just remove ranges and hope
lisp world will soon update with reasonable ranges or just
delete this parser. */
bool success;
success = ts_parser_set_included_ranges (XTS_PARSER (parser)->parser,
NULL, 0);
eassert (success);
}
else
{
uint32_t len = 0;
TSRange *ts_ranges = treesit_make_ts_ranges (new_ranges_head, parser,
&len);
bool success;
success = ts_parser_set_included_ranges (XTS_PARSER (parser)->parser,
ts_ranges, len);
xfree (ts_ranges);
eassert (success);
}
uint32_t len = 0;
TSRange *ts_ranges = NULL;
ts_ranges = treesit_make_ts_ranges (new_ranges_head, parser,
&len);
bool success;
success = ts_parser_set_included_ranges (XTS_PARSER (parser)->parser,
ts_ranges, len);
xfree (ts_ranges);
eassert (success);
}
/* (ref:bytepos-range-pitfall) Suppose we have the following buffer

View file

@ -741,7 +741,7 @@ visible_end.)"
;; { } narrow
(narrow-to-region 1 10)
(should (equal (treesit-parser-included-ranges parser)
nil)))))
'((1 . 1)))))))
;;; Multiple language