1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2025-12-06 06:20:55 -08:00

* lisp/treesit.el (treesit-up-list, treesit-outline-level): Improve.

Try to get the parent parser host node that contains the
embedded parser and continue the search from it (bug#76398).
This commit is contained in:
Juri Linkov 2025-02-22 21:52:39 +02:00
parent ba8a1b9025
commit 1ffa052113
2 changed files with 17 additions and 9 deletions

View file

@ -3167,8 +3167,8 @@ It's required in both cases: whether you define
@code{outline-regexp} or @code{outline-search-function}. @code{outline-regexp} or @code{outline-search-function}.
@end defvar @end defvar
If built with tree-sitter, Emacs can automatically use If built with tree-sitter, Emacs can automatically use Outline
Outline minor mode if the major mode sets the following variable. minor mode if the major mode sets one of the following variables.
@defvar treesit-outline-predicate @defvar treesit-outline-predicate
This variable instructs Emacs how to find lines with outline headings. This variable instructs Emacs how to find lines with outline headings.
@ -3178,7 +3178,7 @@ It should be a predicate that matches the node on the heading line.
@defvar treesit-aggregated-outline-predicate @defvar treesit-aggregated-outline-predicate
This variable allows major modes to configure outlines for multiple This variable allows major modes to configure outlines for multiple
languages. Its value is an alist mapping language symbols to outline languages. Its value is an alist mapping language symbols to outline
headings of the form described above for the value of headings as described above for the value of
@code{treesit-outline-predicate}. @code{treesit-outline-predicate}.
If this variable is non-@code{nil}, it overrides If this variable is non-@code{nil}, it overrides

View file

@ -2838,6 +2838,15 @@ ARG is described in the docstring of `up-list'."
(treesit-node-end parent) (treesit-node-end parent)
(treesit-node-start parent)))) (treesit-node-start parent))))
(setq parent (treesit-parent-until parent pred))) (setq parent (treesit-parent-until parent pred)))
(when-let* ((_ (null parent))
(parser (treesit-node-parser (treesit-node-at (point))))
(_ (not (eq parser treesit-primary-parser)))
(guest-root-node (treesit-parser-root-node parser)))
;; Continue from the host node that contains the guest parser.
(setq parent (treesit-thing-at
(- (treesit-node-start guest-root-node) 2) pred)))
(or (when (and default-pos (or (when (and default-pos
(or (null parent) (or (null parent)
(if (> arg 0) (if (> arg 0)
@ -3716,7 +3725,7 @@ For BOUND, MOVE, BACKWARD, LOOKING-AT, see the descriptions in
"Return the depth of the current outline heading." "Return the depth of the current outline heading."
(let* ((node (treesit-outline--at-point)) (let* ((node (treesit-outline--at-point))
(level 1) (level 1)
(parser (when treesit-aggregated-outline-predicate (parser (when (and treesit-aggregated-outline-predicate node)
(treesit-node-parser node))) (treesit-node-parser node)))
(pred (if treesit-aggregated-outline-predicate (pred (if treesit-aggregated-outline-predicate
(alist-get (treesit-language-at (point)) (alist-get (treesit-language-at (point))
@ -3724,13 +3733,12 @@ For BOUND, MOVE, BACKWARD, LOOKING-AT, see the descriptions in
treesit-outline-predicate))) treesit-outline-predicate)))
(while (setq node (treesit-parent-until node pred)) (while (setq node (treesit-parent-until node pred))
(setq level (1+ level))) (setq level (1+ level)))
(when-let* ((_ parser) (when-let* ((_ (and parser (not (eq parser treesit-primary-parser))))
(guest-root-node (treesit-parser-root-node parser))
(host-lang (treesit-parser-language treesit-primary-parser)) (host-lang (treesit-parser-language treesit-primary-parser))
(_ (not (eq (treesit-language-at (point)) host-lang)))
(host-pred (alist-get host-lang treesit-aggregated-outline-predicate))) (host-pred (alist-get host-lang treesit-aggregated-outline-predicate)))
;; Now need to break out of embedded confinement ;; Continue from the host node that contains the guest parser.
;; and get the host node that contains the guest ranges (setq node (treesit-node-at (- (treesit-node-start guest-root-node) 2)))
(setq node (treesit-parser-root-node parser))
(while (setq node (treesit-parent-until node host-pred)) (while (setq node (treesit-parent-until node host-pred))
(setq level (1+ level)))) (setq level (1+ level))))
level)) level))