]> git.eshelyaron.com Git - emacs.git/commitdiff
Add indentation rules for bracketless statements in js-ts-mode
authorNoah Peart <noah.v.peart@gmail.com>
Sun, 10 Dec 2023 22:58:31 +0000 (14:58 -0800)
committerDmitry Gutov <dmitry@gutov.dev>
Tue, 12 Dec 2023 01:13:12 +0000 (03:13 +0200)
* lisp/progmodes/js.el (js--treesit-indent-rules): Add indentation
rules to handle bracketless statements (bug#67758).
* test/lisp/progmodes/js-tests.el (js-ts-mode-test-indentation):
New test for js-ts-mode indentation.
* test/lisp/progmodes/js-resources/js-ts-indents.erts: New file
with indentation tests for js-ts-mode.

lisp/progmodes/js.el
test/lisp/progmodes/js-resources/js-ts-indents.erts [new file with mode: 0644]
test/lisp/progmodes/js-tests.el

index 71aa5cbea684f7a1451d60b08f6de55e0b9075e9..aaf5779699b20273c602fb9d96bf3e959645c8fd 100644 (file)
@@ -3472,6 +3472,11 @@ Check if a node type is available, then return the right indent rules."
        ((parent-is "class_body") parent-bol js-indent-level)
        ((parent-is ,switch-case) parent-bol js-indent-level)
        ((parent-is "statement_block") parent-bol js-indent-level)
+       ((match "while" "do_statement") parent-bol 0)
+       ((match "else" "if_statement") parent-bol 0)
+       ((parent-is ,(rx (or (seq (or "if" "for" "for_in" "while" "do") "_statement")
+                            "else_clause")))
+        parent-bol js-indent-level)
 
        ;; JSX
        ,@(js-jsx--treesit-indent-compatibility-bb1f97b)
diff --git a/test/lisp/progmodes/js-resources/js-ts-indents.erts b/test/lisp/progmodes/js-resources/js-ts-indents.erts
new file mode 100644 (file)
index 0000000..2e34b23
--- /dev/null
@@ -0,0 +1,44 @@
+Code:
+  (lambda ()
+    (setq indent-tabs-mode nil)
+    (setq js-indent-level 2)
+    (js-ts-mode)
+    (indent-region (point-min) (point-max)))
+
+Name: Basic indentation
+
+=-=
+const foo = () => {
+  console.log("bar");
+  if (x) {
+    return y;
+  } else if (y) {
+    return u;
+  }
+  return baz.x()
+    ? true
+    : false;
+}
+=-=-=
+
+Name: Statement indentation without braces
+
+=-=
+function bracketless_statements(x) {
+  if (x == 0)
+    console.log("if_statement");
+  else if (x == 1)
+    console.log("if_statement");
+  else
+    console.log("else_clause");
+  for (let i = 0; i < 1; i++)
+    console.log("for_statement");
+  for (let _ of [true])
+    console.log("for_in_statement");
+  while (x-- > 0)
+    console.log("while_statement");
+  do
+    console.log("do_statement");
+  while (false)
+};
+=-=-=
index 5db92b08f8a40b7fd2f1b4b256a1dd364e2bb6bd..827d7bb8a9965a166c7eab52e9abfaa3b57eb45f 100644 (file)
@@ -288,6 +288,12 @@ function bar() {
     ;; end-of-defun should move point to eob.
     (should (eobp))))
 
+;;;; Tree-sitter tests.
+
+(ert-deftest js-ts-mode-test-indentation ()
+  (skip-unless (treesit-ready-p 'javascript))
+  (ert-test-erts-file (ert-resource-file "js-ts-indents.erts")))
+
 (provide 'js-tests)
 
 ;;; js-tests.el ends here