From 040a8ad75625ea4e4277fbce920f84a83e15190e Mon Sep 17 00:00:00 2001 From: Denis Zubarev Date: Sun, 12 Nov 2023 01:42:42 +0300 Subject: [PATCH] Fix an issue when searching subtree backward * 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 --- src/treesit.c | 4 ++-- test/src/treesit-tests.el | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/src/treesit.c b/src/treesit.c index 69b59fca11..4dcad751f4 100644 --- a/src/treesit.c +++ b/src/treesit.c @@ -3247,9 +3247,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 diff --git a/test/src/treesit-tests.el b/test/src/treesit-tests.el index 791e902bd0..6c3b1eed98 100644 --- a/test/src/treesit-tests.el +++ b/test/src/treesit-tests.el @@ -1167,6 +1167,40 @@ treesit-defun-navigation-top-level 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)) + (pcase-let* ((`((,_ . ,call-node)) (treesit-query-capture (treesit-buffer-root-node) + '((call) @c))) + (node (treesit-search-subtree + call-node + (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)) + (pcase-let* ((`((,_ . ,call-node)) (treesit-query-capture (treesit-buffer-root-node) + '((call) @c))) + (node (treesit-search-subtree + call-node + (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 -- 2.34.1