From 2bfcc83bbc456313a112cfaa49b9db154635809e Mon Sep 17 00:00:00 2001 From: Juri Linkov Date: Tue, 11 Feb 2025 19:42:33 +0200 Subject: [PATCH] Improve outline-predicate of ts-modes (bug#74448) * lisp/progmodes/c-ts-mode.el (c-ts-mode--outline-predicate): Simplify since 'treesit-outline-search' was fixed in 302274b1862. Use 'treesit-parent-until' to handle the case with "pointer_declarator". * lisp/textmodes/yaml-ts-mode.el (yaml-ts-mode--outline-predicate): Add "block_sequence_item". (cherry picked from commit 58c09c3d36075c3a1a9f178fd8ee019309e6f403) --- lisp/progmodes/c-ts-mode.el | 13 +++++-------- lisp/textmodes/yaml-ts-mode.el | 5 +++-- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/lisp/progmodes/c-ts-mode.el b/lisp/progmodes/c-ts-mode.el index c5bf135e286..0396ddc2c8c 100644 --- a/lisp/progmodes/c-ts-mode.el +++ b/lisp/progmodes/c-ts-mode.el @@ -1041,14 +1041,11 @@ Return nil if NODE is not a defun node or doesn't have a name." (defun c-ts-mode--outline-predicate (node) "Match outlines on lines with function names." - (or (when-let* ((decl (treesit-node-child-by-field-name - (treesit-node-parent node) "declarator")) - (node-pos (treesit-node-start node)) - (decl-pos (treesit-node-start decl)) - (eol (save-excursion (goto-char node-pos) (line-end-position)))) - (and (equal (treesit-node-type decl) "function_declarator") - (<= node-pos decl-pos) - (< decl-pos eol))) + (or (and (equal (treesit-node-type node) "function_declarator") + ;; Handle the case when "function_definition" is + ;; not an immediate parent of "function_declarator" + ;; but there is e.g. "pointer_declarator" between them. + (treesit-parent-until node "function_definition")) ;; DEFUNs in Emacs sources. (and c-ts-mode-emacs-sources-support (c-ts-mode--emacs-defun-p node)))) diff --git a/lisp/textmodes/yaml-ts-mode.el b/lisp/textmodes/yaml-ts-mode.el index 7a5132634ca..72285d570f1 100644 --- a/lisp/textmodes/yaml-ts-mode.el +++ b/lisp/textmodes/yaml-ts-mode.el @@ -151,8 +151,9 @@ Return nil if there is no name or if NODE is not a defun node." (defun yaml-ts-mode--outline-predicate (node) "Limit outlines to top-level mappings." - (when (equal (treesit-node-type node) "block_mapping_pair") - (not (treesit-parent-until node treesit-outline-predicate)))) + (let ((regexp (rx (or "block_mapping_pair" "block_sequence_item")))) + (when (string-match-p regexp (treesit-node-type node)) + (not (treesit-parent-until node regexp))))) ;;;###autoload (define-derived-mode yaml-ts-mode text-mode "YAML" -- 2.39.5