; * lisp/treesit.el (treesit-defun-at-point): Guard against nil.

This commit is contained in:
Yuan Fu 2022-12-24 16:40:00 -08:00
parent f8e219ebfa
commit 6253184afc
No known key found for this signature in database
GPG key ID: 56E19BC57664A442

View file

@ -1690,7 +1690,9 @@ previous and next sibling defuns around POS, and PARENT is the
parent defun surrounding POS. All of three could be nil if no parent defun surrounding POS. All of three could be nil if no
sound defun exists. sound defun exists.
REGEXP and PRED are the same as in `treesit-defun-type-regexp'." REGEXP and PRED are the same as in `treesit-defun-type-regexp'.
Assumes `treesit-defun-type-regexp' is set."
(let* ((node (treesit-node-at pos)) (let* ((node (treesit-node-at pos))
;; NODE-BEFORE/AFTER = NODE when POS is completely in NODE, ;; NODE-BEFORE/AFTER = NODE when POS is completely in NODE,
;; but if not, that means point could be in between two ;; but if not, that means point could be in between two
@ -1876,26 +1878,30 @@ function is called recursively."
;; TODO: In corporate into thing-at-point. ;; TODO: In corporate into thing-at-point.
(defun treesit-defun-at-point () (defun treesit-defun-at-point ()
"Return the defun at point or nil if none is found. "Return the defun node at point or nil if none is found.
Respects `treesit-defun-tactic': return the top-level defun if it Respects `treesit-defun-tactic': return the top-level defun if it
is `top-level', return the immediate parent defun if it is is `top-level', return the immediate parent defun if it is
`nested'." `nested'.
(pcase-let* ((`(,regexp . ,pred)
(if (consp treesit-defun-type-regexp) Return nil if `treesit-defun-type-regexp' is not set."
treesit-defun-type-regexp (when treesit-defun-type-regexp
(cons treesit-defun-type-regexp nil))) (pcase-let* ((`(,regexp . ,pred)
(`(,_ ,next ,parent) (if (consp treesit-defun-type-regexp)
(treesit--defuns-around (point) regexp pred)) treesit-defun-type-regexp
;; If point is at the beginning of a defun, we (cons treesit-defun-type-regexp nil)))
;; prioritize that defun over the parent in nested (`(,_ ,next ,parent)
;; mode. (treesit--defuns-around (point) regexp pred))
(node (or (and (eq (treesit-node-start next) (point)) ;; If point is at the beginning of a defun, we
next) ;; prioritize that defun over the parent in nested
parent))) ;; mode.
(if (eq treesit-defun-tactic 'top-level) (node (or (and (eq (treesit-node-start next) (point))
(treesit--top-level-defun node regexp pred) next)
node))) parent)))
(if (eq treesit-defun-tactic 'top-level)
(treesit--top-level-defun node regexp pred)
node))))
(defun treesit-defun-name (node) (defun treesit-defun-name (node)
"Return the defun name of NODE. "Return the defun name of NODE.