]> git.eshelyaron.com Git - emacs.git/commitdiff
Add treesit-defun-at-point and fix c-ts-mode-indent-defun
authorYuan Fu <casouri@gmail.com>
Wed, 21 Dec 2022 05:22:30 +0000 (21:22 -0800)
committerYuan Fu <casouri@gmail.com>
Thu, 22 Dec 2022 08:42:49 +0000 (00:42 -0800)
* lisp/treesit.el (treesit-defun-at-point): New function.
* lisp/progmodes/c-ts-mode.el (c-ts-mode-indent-defun): Implement with
treesit-defun-at-point.

lisp/progmodes/c-ts-mode.el
lisp/treesit.el

index 8ed1a77637ad77728c02010c5249b96c799a4d29..ea9891f3345b2df5ced56adee0c9c12ff7fc4cb6 100644 (file)
@@ -556,13 +556,10 @@ the semicolon.  This function skips the semicolon."
 
 `treesit-defun-type-regexp' defines what constructs to indent."
   (interactive "*")
-  (let ((orig-point (point-marker)))
-    ;; If `treesit-beginning-of-defun' returns nil, we are not in a
-    ;; defun, so don't indent anything.
-    (when (treesit-beginning-of-defun)
-      (let ((start (point)))
-        (treesit-end-of-defun)
-        (indent-region start (point))))
+  (when-let ((orig-point (point-marker))
+             (node (treesit-defun-at-point)))
+    (indent-region (treesit-node-start node)
+                   (treesit-node-end node))
     (goto-char orig-point)))
 
 (defvar-keymap c-ts-mode-map
index e4f3698dcd9ed893e7882501380e4068ff4a198e..a7882dda2cc99b64bc5cd727cd517ab5463fae31 100644 (file)
@@ -1834,6 +1834,29 @@ function is called recursively."
     ;; Counter equal to 0 means we successfully stepped ARG steps.
     (if (eq counter 0) pos nil)))
 
+;; TODO: In corporate into thing-at-point.
+(defun treesit-defun-at-point ()
+  "Return the defun at point or nil if none is found.
+
+Respects `treesit-defun-tactic': return the top-level defun if it
+is `top-level', return the immediate parent defun if it is
+`nested'."
+  (pcase-let* ((`(,regexp . ,pred)
+                (if (consp treesit-defun-type-regexp)
+                    treesit-defun-type-regexp
+                  (cons treesit-defun-type-regexp nil)))
+               (`(,_ ,next ,parent)
+                (treesit--defuns-around (point) regexp pred))
+               ;; If point is at the beginning of a defun, we
+               ;; prioritize that defun over the parent in nested
+               ;; mode.
+               (node (or (and (eq (treesit-node-start next) (point))
+                              next)
+                         parent)))
+    (if (eq treesit-defun-tactic 'top-level)
+        (treesit--top-level-defun node regexp pred)
+      node)))
+
 ;;; Activating tree-sitter
 
 (defun treesit-ready-p (language &optional quiet)