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.
This commit is contained in:
parent
589959fb09
commit
db8f207e52
2 changed files with 31 additions and 0 deletions
|
@ -859,6 +859,18 @@ the semicolon. This function skips the semicolon."
|
||||||
(goto-char (match-end 0)))
|
(goto-char (match-end 0)))
|
||||||
(treesit-default-defun-skipper))
|
(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 ()
|
(defun c-ts-mode-indent-defun ()
|
||||||
"Indent the current top-level declaration syntactically.
|
"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.
|
;; function_definitions, so we need to find the top-level node.
|
||||||
(setq-local treesit-defun-prefer-top-level t)
|
(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.
|
;; Indent.
|
||||||
(when (eq c-ts-mode-indent-style 'linux)
|
(when (eq c-ts-mode-indent-style 'linux)
|
||||||
(setq-local indent-tabs-mode t))
|
(setq-local indent-tabs-mode t))
|
||||||
|
|
|
@ -464,3 +464,17 @@ main (void)
|
||||||
|
|
|
|
||||||
}
|
}
|
||||||
=-=-=
|
=-=-=
|
||||||
|
|
||||||
|
Name: Empty Line (Block Start)
|
||||||
|
|
||||||
|
=-=
|
||||||
|
int
|
||||||
|
main (void)
|
||||||
|
{
|
||||||
|
|
|
||||||
|
=-=
|
||||||
|
int
|
||||||
|
main (void)
|
||||||
|
{
|
||||||
|
|
|
||||||
|
=-=-=
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue