From 30be0083674d7dc6770d3611908e9219488ee869 Mon Sep 17 00:00:00 2001 From: Noah Peart Date: Fri, 19 Apr 2024 01:46:50 -0700 Subject: [PATCH] Add typescript-ts-mode indentation for multi-assignment decls * 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 | 14 ++++++++- .../typescript-ts-mode-resources/indent.erts | 31 +++++++++++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/lisp/progmodes/typescript-ts-mode.el b/lisp/progmodes/typescript-ts-mode.el index ab1d76ab20e..ed60819388f 100644 --- a/lisp/progmodes/typescript-ts-mode.el +++ b/lisp/progmodes/typescript-ts-mode.el @@ -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) diff --git a/test/lisp/progmodes/typescript-ts-mode-resources/indent.erts b/test/lisp/progmodes/typescript-ts-mode-resources/indent.erts index bec96ad82e0..877382953c1 100644 --- a/test/lisp/progmodes/typescript-ts-mode-resources/indent.erts +++ b/test/lisp/progmodes/typescript-ts-mode-resources/indent.erts @@ -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) -- 2.39.2