]> git.eshelyaron.com Git - emacs.git/commitdiff
Add typescript-ts-mode indentation for multi-assignment decls
authorNoah Peart <noah.v.peart@gmail.com>
Fri, 19 Apr 2024 08:46:50 +0000 (01:46 -0700)
committerEshel Yaron <me@eshelyaron.com>
Sun, 9 Jun 2024 09:52:40 +0000 (11:52 +0200)
* lisp/progmodes/typescript-ts-mode.el
(typescript-ts-mode--indent-rules): Add indentation rules for
lexical and variable declarations with multiple assignments.
* test/lisp/progmodes/typescript-ts-mode-resources/indent.erts:
Add indent test for variable declarations (bug#68054).

(cherry picked from commit ce5d004b5b093842d9c46976c50453015fe1a7e7)

lisp/progmodes/typescript-ts-mode.el
test/lisp/progmodes/typescript-ts-mode-resources/indent.erts

index ab1d76ab20edeeae42312a8b6715ad0b73fd879c..ed60819388f6064ad9babf2f14a4ffcf74ff752b 100644 (file)
@@ -91,6 +91,17 @@ Check if a node type is available, then return the right indent rules."
      `(((match "<" "jsx_text") parent 0)
        ((parent-is "jsx_text") parent typescript-ts-mode-indent-offset)))))
 
+(defun typescript-ts-mode--anchor-decl (_n parent &rest _)
+  "Return the position after the declaration keyword before PARENT.
+
+This anchor allows aligning variable_declarators in variable and lexical
+declarations, accounting for the length of keyword (var, let, or const)."
+  (let* ((declaration (treesit-parent-until
+                       parent (rx (or "variable" "lexical") "_declaration") t))
+         (decl (treesit-node-child declaration 0)))
+    (+ (treesit-node-start declaration)
+       (- (treesit-node-end decl) (treesit-node-start decl)))))
+
 (defun typescript-ts-mode--indent-rules (language)
   "Rules used for indentation.
 Argument LANGUAGE is either `typescript' or `tsx'."
@@ -113,7 +124,8 @@ Argument LANGUAGE is either `typescript' or `tsx'."
      ((parent-is "switch_case") parent-bol typescript-ts-mode-indent-offset)
      ((parent-is "switch_default") parent-bol typescript-ts-mode-indent-offset)
      ((parent-is "type_arguments") parent-bol typescript-ts-mode-indent-offset)
-     ((parent-is "variable_declarator") parent-bol typescript-ts-mode-indent-offset)
+     ((parent-is ,(rx (or "variable" "lexical") "_" (or "declaration" "declarator")))
+      typescript-ts-mode--anchor-decl 1)
      ((parent-is "arguments") parent-bol typescript-ts-mode-indent-offset)
      ((parent-is "array") parent-bol typescript-ts-mode-indent-offset)
      ((parent-is "formal_parameters") parent-bol typescript-ts-mode-indent-offset)
index bec96ad82e096ab6ac85500b6463a1c606f376bb..877382953c13a7367787339605ddbe67596df3fd 100644 (file)
@@ -62,6 +62,37 @@ const foo = (x: string) => {
 };
 =-=-=
 
+Name: Lexical and variable declarations
+
+=-=
+const foo = () => {
+  let x = 1,
+      yyyy: {
+        [k: string | number]: string,
+      } = {
+        "foo": "foo",
+        "bar": "bar",
+      };
+  var obar = 1,
+      fo: { [x: any]: any } = {
+        "a": 1,
+        "b": 2,
+      };
+  const cccc = 1,
+        bbb = {
+          "x": 0
+        },
+        ddddd = 0;
+  // First decls with value starting on same line
+  const a = (x: string): string => {
+    return x + x;
+  };
+  var bbb = {
+    "x": 0
+  };
+};
+=-=-=
+
 Code:
   (lambda ()
     (setq indent-tabs-mode nil)