From 7dea58b88db3e272e01e537a3a5d2158ef7f9608 Mon Sep 17 00:00:00 2001 From: Yuan Fu Date: Tue, 20 Dec 2022 21:22:30 -0800 Subject: [PATCH] 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 8ed1a77637a..ea9891f3345 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 e4f3698dcd9..a7882dda2cc 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) -- 2.39.2