From 77f6ef53a0f385daedb9f8917f17cbe2be463f3f Mon Sep 17 00:00:00 2001 From: Yuan Fu Date: Thu, 27 Feb 2025 04:06:36 -0800 Subject: [PATCH] Make treesit-node-at take advantage of the embed-level property * lisp/treesit.el (treesit-node-at): Select the local parser with the highest embed-level. (cherry picked from commit 8a45c2da226e188420956fd6269f72db3f437e38) --- lisp/treesit.el | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/lisp/treesit.el b/lisp/treesit.el index 020c1633855..6b42b0bf320 100644 --- a/lisp/treesit.el +++ b/lisp/treesit.el @@ -258,10 +258,20 @@ language and doesn't match the language of the local parser." ;; finding parser, try local parser first, then global ;; parser. (t - ;; LANG can be nil. - (let* ((lang (treesit-language-at pos)) - (local-parser (car (treesit-local-parsers-at - pos lang))) + ;; LANG can be nil. We don't want to use the fallback + ;; in `treesit-language-at', so here we call + ;; `treesit-language-at-point-function' directly. + (let* ((lang (and treesit-language-at-point-function + (funcall treesit-language-at-point-function + pos))) + (local-parser + ;; Find the local parser with highest + ;; embed-level at point. + (car (seq-sort-by #'treesit-parser-embed-level + (lambda (a b) + (> (or a 0) (or b 0))) + (treesit-local-parsers-at + pos lang)))) (global-parser (car (treesit-parser-list nil lang))) (parser (or local-parser global-parser))) -- 2.39.5