]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix some cases of incomplete code's indentation [c/c++-ts-mode]
authorDmitry Gutov <dgutov@yandex.ru>
Sun, 9 Apr 2023 23:58:46 +0000 (02:58 +0300)
committerDmitry Gutov <dgutov@yandex.ru>
Sun, 9 Apr 2023 23:58:46 +0000 (02:58 +0300)
* 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.

lisp/progmodes/c-ts-mode.el
test/lisp/progmodes/c-ts-mode-resources/indent.erts

index 981c776637582dc153c54e974be079a0dc8816a1..83e89c3a33509fcd3a88b420c3fb5593ebb3ccc4 100644 (file)
@@ -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))
index 5cdefe2122c9735f23e257919416fbd668730050..221b3d809af0a6662c5143052b26646e96a916a5 100644 (file)
@@ -464,3 +464,17 @@ main (void)
   |
 }
 =-=-=
+
+Name: Empty Line (Block Start)
+
+=-=
+int
+main (void)
+{
+|
+=-=
+int
+main (void)
+{
+  |
+=-=-=