]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix an issue when searching subtree backward (bug#67117)
authorDenis Zubarev <dvzubarev@yandex.ru>
Sat, 11 Nov 2023 22:42:42 +0000 (01:42 +0300)
committerEshel Yaron <me@eshelyaron.com>
Sat, 23 Dec 2023 13:17:13 +0000 (14:17 +0100)
* src/treesit.c (treesit_traverse_child_helper):
Do not call treesit_traverse_sibling_helper when the named node is
required and the last child is the named node.
Otherwise treesit_traverse_sibling_helper will move cursor to the
previous sibling and last node will be skipped.
* test/src/treesit-tests.el (treesit-search-subtree-forward-1):
(treesit-search-subtree-backward-1):
Add tests.

(cherry picked from commit 7b315e8a5c966f8d11a4f646db4e29b989b56ab1)

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

index bbd0a405c294f8850a21cf8e3ff5576fdb6aff1e..b0bd8e69c17e8bf097d3164c1efa0445ce9de81d 100644 (file)
@@ -3246,9 +3246,9 @@ treesit_traverse_child_helper (TSTreeCursor *cursor,
       /* First go to the last child.  */
       while (ts_tree_cursor_goto_next_sibling (cursor));
 
-      if (!named)
+      if (!named || (named && ts_node_is_named (ts_tree_cursor_current_node(cursor))))
        return true;
-      /* Else named... */
+      /* Else named is required and last child is not named node */
       if (treesit_traverse_sibling_helper(cursor, false, true))
        return true;
       else
index 791e902bd0a9ca11aff852cfaf4610557c3685f3..c9b15c618c1bb780b053612460d5250e1a97898a 100644 (file)
@@ -1167,6 +1167,36 @@ This tests bug#60355."
    treesit--ert-defun-navigation-top-level-master
    'top-level))
 
+(ert-deftest treesit-search-subtree-forward-1 ()
+  "Test search subtree forward."
+  (skip-unless (treesit-language-available-p 'python))
+  (require 'python)
+  (python-ts-mode)
+  (insert "Temp(1, 2)")
+  (goto-char (point-min))
+  (let ((node (treesit-search-subtree
+               (treesit--thing-at (point) "call")
+               (lambda (n) (equal (treesit-node-type n ) "integer")))))
+
+    (should node)
+    (should (equal (treesit-node-text node) "1"))))
+
+(ert-deftest treesit-search-subtree-backward-1 ()
+  "Test search subtree with backward=t."
+  (skip-unless (treesit-language-available-p 'python))
+  (require 'python)
+  (python-ts-mode)
+  (insert "Temp(1, 2)")
+  (goto-char (point-min))
+  (let ((node (treesit-search-subtree
+               (treesit--thing-at (point) "call")
+               (lambda (n) (equal (treesit-node-type n ) "integer"))
+               t)))
+
+    (should node)
+    (should (equal (treesit-node-text node) "2"))))
+
+
 ;; TODO
 ;; - Functions in treesit.el
 ;; - treesit-load-name-override-list