]> git.eshelyaron.com Git - emacs.git/commitdiff
Improve performance of treesit_cursor_helper_1
authorYuan Fu <casouri@gmail.com>
Thu, 31 Aug 2023 03:53:03 +0000 (20:53 -0700)
committerYuan Fu <casouri@gmail.com>
Thu, 31 Aug 2023 03:53:03 +0000 (20:53 -0700)
* src/treesit.c: (treesit_cursor_helper_1): Use
ts_tree_cursor_goto_first_child_for_byte to speed up traversing among
siblings.  The "while (ts_node_end_byte (cursor_node) < end_pos)" can
be removed with the check added in the loop below.

src/treesit.c

index e359f903f2809a710f4049df362ec22e0fbaf53f..19aacc2da7f7069049f510c60501dd7c6c66e397 100644 (file)
@@ -2876,7 +2876,8 @@ treesit_assume_true (bool val)
    limit.  */
 static bool
 treesit_cursor_helper_1 (TSTreeCursor *cursor, TSNode *target,
-                        uint32_t end_pos, ptrdiff_t limit)
+                        uint32_t start_pos, uint32_t end_pos,
+                        ptrdiff_t limit)
 {
   if (limit <= 0)
     return false;
@@ -2885,23 +2886,17 @@ treesit_cursor_helper_1 (TSTreeCursor *cursor, TSNode *target,
   if (ts_node_eq (cursor_node, *target))
     return true;
 
-  if (!ts_tree_cursor_goto_first_child (cursor))
+  if (ts_tree_cursor_goto_first_child_for_byte (cursor, start_pos) == -1)
     return false;
 
-  /* Skip nodes that definitely don't contain TARGET.  */
-  while (ts_node_end_byte (cursor_node) < end_pos)
-    {
-      if (!ts_tree_cursor_goto_next_sibling (cursor))
-       break;
-      cursor_node = ts_tree_cursor_current_node (cursor);
-    }
-
   /* Go through each sibling that could contain TARGET.  Because of
      missing nodes (their width is 0), there could be multiple
      siblings that could contain TARGET.  */
   while (ts_node_start_byte (cursor_node) <= end_pos)
     {
-      if (treesit_cursor_helper_1 (cursor, target, end_pos, limit - 1))
+      if (ts_node_end_byte (cursor_node) >= end_pos
+         && treesit_cursor_helper_1 (cursor, target, start_pos, end_pos,
+                                     limit - 1))
        return true;
 
       if (!ts_tree_cursor_goto_next_sibling (cursor))
@@ -2933,11 +2928,12 @@ treesit_cursor_helper_1 (TSTreeCursor *cursor, TSNode *target,
 static bool
 treesit_cursor_helper (TSTreeCursor *cursor, TSNode node, Lisp_Object parser)
 {
+  uint32_t start_pos = ts_node_start_byte (node);
   uint32_t end_pos = ts_node_end_byte (node);
   TSNode root = ts_tree_root_node (XTS_PARSER (parser)->tree);
   *cursor = ts_tree_cursor_new (root);
-  bool success = treesit_cursor_helper_1 (cursor, &node, end_pos,
-                                         treesit_recursion_limit);
+  bool success = treesit_cursor_helper_1 (cursor, &node, start_pos,
+                                         end_pos, treesit_recursion_limit);
   if (!success)
     ts_tree_cursor_delete (cursor);
   return success;