]> git.eshelyaron.com Git - emacs.git/commitdiff
Conservative heuristic for tree-sitter parser ranges (bug#73324)
authorYuan Fu <casouri@gmail.com>
Wed, 18 Sep 2024 04:17:13 +0000 (21:17 -0700)
committerEshel Yaron <me@eshelyaron.com>
Mon, 23 Sep 2024 10:45:14 +0000 (12:45 +0200)
* 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
test/src/treesit-tests.el

index 3f5188a0b270b2ec6bc1bcf69598231acc062303..5deaa711aa89ad2775dc50519cab09954371f62c 100644 (file)
@@ -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
index 4e55d97105e0ce50101ab2cb2f880040377c5372..7eecbdcfa94a02e491b5c67de7e3931e34d5a5cb 100644 (file)
@@ -743,7 +743,7 @@ visible_end.)"
       ;;              {     } narrow
       (narrow-to-region 1 10)
       (should (equal (treesit-parser-included-ranges parser)
-                     nil)))))
+                     '((1 . 1)))))))
 
 ;;; Multiple language