diff options
author | Dmitry Gutov <dgutov@yandex.ru> | 2023-04-10 02:58:46 +0300 |
---|---|---|
committer | Dmitry Gutov <dgutov@yandex.ru> | 2023-04-10 02:58:46 +0300 |
commit | db8f207e52fc969e0dcf30e197bcfaa4fa1d2b6e (patch) | |
tree | 49cb24a387626ba9d8592d999933700317517607 /lisp | |
parent | 589959fb09d8a8f60179e1cceca4c3777b8c7719 (diff) | |
download | emacs-db8f207e52fc969e0dcf30e197bcfaa4fa1d2b6e.tar.gz |
Fix some cases of incomplete code's indentation [c/c++-ts-mode]
* lisp/progmodes/c-ts-mode.el (c-ts-base--before-indent): Try to
guess when the parse tree is incomplete, and provide a better node
to indent against (bug#62717).
(c-ts-base-mode): Set up advice for local treesit-indent-function.
Diffstat (limited to 'lisp')
-rw-r--r-- | lisp/progmodes/c-ts-mode.el | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/lisp/progmodes/c-ts-mode.el b/lisp/progmodes/c-ts-mode.el index 981c7766375..83e89c3a335 100644 --- a/lisp/progmodes/c-ts-mode.el +++ b/lisp/progmodes/c-ts-mode.el @@ -859,6 +859,18 @@ the semicolon. This function skips the semicolon." (goto-char (match-end 0))) (treesit-default-defun-skipper)) +(defun c-ts-base--before-indent (args) + (pcase-let ((`(,node ,parent ,bol) args)) + (when (null node) + (let ((smallest-node (treesit-node-at (point)))) + ;; "Virtual" closer curly added by the + ;; parser's error recovery. + (when (and (equal (treesit-node-type smallest-node) "}") + (equal (treesit-node-end smallest-node) + (treesit-node-start smallest-node))) + (setq parent (treesit-node-parent smallest-node))))) + (list node parent bol))) + (defun c-ts-mode-indent-defun () "Indent the current top-level declaration syntactically. @@ -904,6 +916,11 @@ the semicolon. This function skips the semicolon." ;; function_definitions, so we need to find the top-level node. (setq-local treesit-defun-prefer-top-level t) + ;; When the code is in incomplete state, try to make a better guess + ;; about which node to indent against. + (add-function :filter-args (local 'treesit-indent-function) + #'c-ts-base--before-indent) + ;; Indent. (when (eq c-ts-mode-indent-style 'linux) (setq-local indent-tabs-mode t)) |