emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

emacs-29 7dea58b88d 2/3: Add treesit-defun-at-point and fix c-ts-mode-in


From: Yuan Fu
Subject: emacs-29 7dea58b88d 2/3: Add treesit-defun-at-point and fix c-ts-mode-indent-defun
Date: Thu, 22 Dec 2022 03:46:23 -0500 (EST)

branch: emacs-29
commit 7dea58b88db3e272e01e537a3a5d2158ef7f9608
Author: Yuan Fu <casouri@gmail.com>
Commit: Yuan Fu <casouri@gmail.com>

    Add treesit-defun-at-point and fix c-ts-mode-indent-defun
    
    * 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 | 11 ++++-------
 lisp/treesit.el             | 23 +++++++++++++++++++++++
 2 files changed, 27 insertions(+), 7 deletions(-)

diff --git a/lisp/progmodes/c-ts-mode.el b/lisp/progmodes/c-ts-mode.el
index 8ed1a77637..ea9891f334 100644
--- a/lisp/progmodes/c-ts-mode.el
+++ b/lisp/progmodes/c-ts-mode.el
@@ -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
diff --git a/lisp/treesit.el b/lisp/treesit.el
index e4f3698dcd..a7882dda2c 100644
--- a/lisp/treesit.el
+++ b/lisp/treesit.el
@@ -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)



reply via email to

[Prev in Thread] Current Thread [Next in Thread]