From 3e99658ee9e1a2f38d7fe793f64671b027fb7200 Mon Sep 17 00:00:00 2001 From: Yuan Fu Date: Tue, 17 Sep 2024 21:17:13 -0700 Subject: [PATCH] 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. (cherry picked from commit f0daa2f2153a9d250d32ac1261a6fffb30860e31) --- src/treesit.c | 41 +++++++++++++++++---------------------- test/src/treesit-tests.el | 2 +- 2 files changed, 19 insertions(+), 24 deletions(-) diff --git a/src/treesit.c b/src/treesit.c index 3f5188a0b27..5deaa711aa8 100644 --- a/src/treesit.c +++ b/src/treesit.c @@ -1144,31 +1144,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 diff --git a/test/src/treesit-tests.el b/test/src/treesit-tests.el index 4e55d97105e..7eecbdcfa94 100644 --- a/test/src/treesit-tests.el +++ b/test/src/treesit-tests.el @@ -743,7 +743,7 @@ visible_end.)" ;; { } narrow (narrow-to-region 1 10) (should (equal (treesit-parser-included-ranges parser) - nil))))) + '((1 . 1))))))) ;;; Multiple language -- 2.39.2