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)
committerYuan Fu <casouri@gmail.com>
Wed, 18 Sep 2024 04:18:28 +0000 (21:18 -0700)
* 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.

src/treesit.c
test/src/treesit-tests.el

index 8fc7385a3da9527b0a0a5e79f20754bcab9ef988..84d903b027cb0265a1a3e9573588b78c7f3b9aa1 100644 (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
index 6256b1d2fb90aaa3617c95723ec350f96c6508b7..24cd755fcf0a22efe0358bf56fd3af1aa5d02df5 100644 (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