emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

emacs-29 c165247c300: Add indentation rules for bracketless statements i


From: Dmitry Gutov
Subject: emacs-29 c165247c300: Add indentation rules for bracketless statements in js-ts-mode
Date: Mon, 11 Dec 2023 20:13:53 -0500 (EST)

branch: emacs-29
commit c165247c3009adec912abdf74d6d7d73c8c76c33
Author: Noah Peart <noah.v.peart@gmail.com>
Commit: Dmitry Gutov <dmitry@gutov.dev>

    Add indentation rules for bracketless statements in js-ts-mode
    
    * 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                               |  5 +++
 .../lisp/progmodes/js-resources/js-ts-indents.erts | 44 ++++++++++++++++++++++
 test/lisp/progmodes/js-tests.el                    |  6 +++
 3 files changed, 55 insertions(+)

diff --git a/lisp/progmodes/js.el b/lisp/progmodes/js.el
index 71aa5cbea68..aaf5779699b 100644
--- a/lisp/progmodes/js.el
+++ b/lisp/progmodes/js.el
@@ -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
index 00000000000..2e34b23acef
--- /dev/null
+++ b/test/lisp/progmodes/js-resources/js-ts-indents.erts
@@ -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)
+};
+=-=-=
diff --git a/test/lisp/progmodes/js-tests.el b/test/lisp/progmodes/js-tests.el
index 5db92b08f8a..827d7bb8a99 100644
--- a/test/lisp/progmodes/js-tests.el
+++ b/test/lisp/progmodes/js-tests.el
@@ -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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]