]> git.eshelyaron.com Git - emacs.git/commitdiff
Use cursor API in treesit-node-parent
authorYuan Fu <casouri@gmail.com>
Sat, 17 Dec 2022 23:14:02 +0000 (15:14 -0800)
committerYuan Fu <casouri@gmail.com>
Sat, 17 Dec 2022 23:33:54 +0000 (15:33 -0800)
This is the last part of the change that fixes bug#60054.  The
previous change fixes it for searching functions, this fixes for
treesit-node-parent.

* src/treesit.c (Ftreesit_node_parent): Use the new cursor API.

src/treesit.c

index fac99f6edd5ea6618e7cccd79f6bd6bebc54dc91..849ebad267d2b68741772d5ea027d6da4bdccdc1 100644 (file)
@@ -1758,6 +1758,8 @@ If NODE is nil, return nil.  */)
   return build_string (string);
 }
 
+static TSTreeCursor treesit_cursor_helper (TSNode, Lisp_Object);
+
 DEFUN ("treesit-node-parent",
        Ftreesit_node_parent, Streesit_node_parent, 1, 1, 0,
        doc: /* Return the immediate parent of NODE.
@@ -1768,13 +1770,18 @@ Return nil if NODE has no parent.  If NODE is nil, return nil.  */)
   treesit_check_node (node);
   treesit_initialize ();
 
-  TSNode treesit_node = XTS_NODE (node)->node;
-  TSNode parent = ts_node_parent (treesit_node);
-
-  if (ts_node_is_null (parent))
-    return Qnil;
+  Lisp_Object return_value = Qnil;
 
-  return make_treesit_node (XTS_NODE (node)->parser, parent);
+  TSNode treesit_node = XTS_NODE (node)->node;
+  Lisp_Object parser = XTS_NODE (node)->parser;
+  TSTreeCursor cursor = treesit_cursor_helper (treesit_node, parser);
+  if (ts_tree_cursor_goto_parent (&cursor))
+  {
+    TSNode parent = ts_tree_cursor_current_node (&cursor);
+    return_value = make_treesit_node (parser, parent);
+  }
+  ts_tree_cursor_delete (&cursor);
+  return return_value;
 }
 
 DEFUN ("treesit-node-child",