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.
This commit is contained in:
Noah Peart 2023-12-10 14:58:31 -08:00 committed by Dmitry Gutov
parent 7f1bd69cd1
commit c165247c30
3 changed files with 55 additions and 0 deletions

View 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)

View file

@ -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)
};
=-=-=

View 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