From c165247c3009adec912abdf74d6d7d73c8c76c33 Mon Sep 17 00:00:00 2001 From: Noah Peart Date: Sun, 10 Dec 2023 14:58:31 -0800 Subject: [PATCH] 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 +++ .../progmodes/js-resources/js-ts-indents.erts | 44 +++++++++++++++++++ test/lisp/progmodes/js-tests.el | 6 +++ 3 files changed, 55 insertions(+) create mode 100644 test/lisp/progmodes/js-resources/js-ts-indents.erts 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 -- 2.39.2