summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYuan Fu <casouri@gmail.com>2023-03-05 15:01:54 -0800
committerYuan Fu <casouri@gmail.com>2023-03-05 15:01:54 -0800
commit7292b24c80143d697870a670963f136db375580b (patch)
tree75b99ee711fe97143bf92139b6effb055a94ae3d
parent75cdc1afbe5a649eed02cd186a38d40b3d0a4439 (diff)
downloademacs-7292b24c80143d697870a670963f136db375580b.tar.gz
Fix c-ts-mode indentation
Not the subject of it, but mentioned in bug#61893. * lisp/progmodes/c-ts-mode.el (c-ts-mode--anchor-prev-sibling): Skip the sibling if it doesn't start on it's own line. * test/lisp/progmodes/c-ts-mode-resources/indent.erts: New test.
-rw-r--r--lisp/progmodes/c-ts-mode.el30
-rw-r--r--test/lisp/progmodes/c-ts-mode-resources/indent.erts16
2 files changed, 35 insertions, 11 deletions
diff --git a/lisp/progmodes/c-ts-mode.el b/lisp/progmodes/c-ts-mode.el
index f40bbc57eb5..ee4a3bb2de0 100644
--- a/lisp/progmodes/c-ts-mode.el
+++ b/lisp/progmodes/c-ts-mode.el
@@ -284,17 +284,25 @@ PARENT and BOL are like other anchor functions."
(treesit-node-first-child-for-pos parent bol) t)
(treesit-node-child parent -1 t)))
(continue t))
- (while (and prev-sibling continue)
- (pcase (treesit-node-type prev-sibling)
- ;; Get the statement in the label.
- ("labeled_statement"
- (setq prev-sibling (treesit-node-child prev-sibling 2)))
- ;; Get the last statement in the preproc. Tested by
- ;; "Prev-Sibling When Prev-Sibling is Preproc" test.
- ((or "preproc_if" "preproc_ifdef" "preproc_elif" "preproc_else")
- (setq prev-sibling (treesit-node-child prev-sibling -2)))
- ;; Don't do anything special.
- (_ (setq continue nil))))
+ (save-excursion
+ (while (and prev-sibling continue)
+ (pcase (treesit-node-type prev-sibling)
+ ;; Get the statement in the label.
+ ("labeled_statement"
+ (setq prev-sibling (treesit-node-child prev-sibling 2)))
+ ;; Get the last statement in the preproc. Tested by
+ ;; "Prev-Sibling When Prev-Sibling is Preproc" test.
+ ((or "preproc_if" "preproc_ifdef" "preproc_elif" "preproc_else")
+ (setq prev-sibling (treesit-node-child prev-sibling -2)))
+ ;; If the start of the previous sibling isn't at the
+ ;; beginning of a line, something's probably not quite
+ ;; right, go a step further.
+ (_ (goto-char (treesit-node-start prev-sibling))
+ (if (looking-back (rx bol (* whitespace))
+ (line-beginning-position))
+ (setq continue nil)
+ (setq prev-sibling
+ (treesit-node-prev-sibling prev-sibling)))))))
;; This could be nil if a) there is no prev-sibling or b)
;; prev-sibling doesn't have a child.
(treesit-node-start prev-sibling)))
diff --git a/test/lisp/progmodes/c-ts-mode-resources/indent.erts b/test/lisp/progmodes/c-ts-mode-resources/indent.erts
index 904c6498cb5..77bfeb5ad6e 100644
--- a/test/lisp/progmodes/c-ts-mode-resources/indent.erts
+++ b/test/lisp/progmodes/c-ts-mode-resources/indent.erts
@@ -402,3 +402,19 @@ int main()
|
}
=-=-=
+
+Name: Prev-Sibling But Not Trailing Comment
+
+=-=
+static int
+required_matrix_height (struct window *w)
+{
+#ifdef HAVE_WINDOW_SYSTEM
+ if (FRAME_WINDOW_P (f))
+ {
+ return 0;
+ }
+#endif /* Don't align to this comment. */
+ |
+}
+=-=-=