From 383a6aa13f90346b489bc4b8f900fe767a725b90 Mon Sep 17 00:00:00 2001 From: Jackson Ray Hamilton Date: Sat, 9 Feb 2019 12:26:21 -0800 Subject: [PATCH] =?UTF-8?q?Indent=20arrows=E2=80=99=20expression=20bodies?= =?UTF-8?q?=20like=20function=20bodies=20(Bug#25904)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * lisp/progmodes/js.el (js--continued-expression-p): Don’t confuse ‘=>’ for a ‘>’ operator. (js--line-terminating-arrow-re): New variable. (js--looking-at-broken-arrow-function-p): New function. (js--proper-indentation): Don’t align arrow functions’ expression bodies starting on new lines like list continuations, instead align them like function bodies (js-indent-align-list-continuation need not be nil). * test/manual/indent/js.js: Add test for Bug#25904. Co-authored-by: Felipe Ochoa --- lisp/progmodes/js.el | 23 +++++++++++++++++++++-- test/manual/indent/js.js | 9 +++++++++ 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/lisp/progmodes/js.el b/lisp/progmodes/js.el index 65ffb0e02f..787afb4e10 100644 --- a/lisp/progmodes/js.el +++ b/lisp/progmodes/js.el @@ -1849,7 +1849,7 @@ js--continued-expression-p (skip-chars-backward " \t") (or (bobp) (backward-char)) (and (> (point) (point-min)) - (save-excursion (backward-char) (not (looking-at "[/*]/"))) + (save-excursion (backward-char) (not (looking-at "[/*]/\\|=>"))) (js--looking-at-operator-p) (and (progn (backward-char) (not (looking-at "+\\+\\|--\\|/[/*]")))))))))) @@ -2078,6 +2078,24 @@ js--maybe-goto-declaration-keyword-end (when comma-p (goto-char (1+ declaration-keyword-end)))))))) +(defconst js--line-terminating-arrow-re "\\s-*=>\\s-*\\(/[/*]\\|$\\)" + "Regexp matching the last \"=>\" (arrow) token on a line. +Whitespace and comments around the arrow are ignored.") + +(defun js--looking-at-broken-arrow-function-p () + "Helper function for `js--proper-indentation'. +Return t if point is at the start of a (possibly async) arrow +function and the last non-comment, non-whitespace token of the +current line is the \"=>\" token." + (when (looking-at "\\s-*async\\s-*") + (goto-char (match-end 0))) + (cond + ((eq (char-after) ?\() + (forward-list) + (looking-at-p js--line-terminating-arrow-re)) + (t (looking-at-p + (concat js--name-re js--line-terminating-arrow-re))))) + (defun js--proper-indentation (parse-status) "Return the proper indentation for the current line." (save-excursion @@ -2108,7 +2126,8 @@ js--proper-indentation (continued-expr-p (js--continued-expression-p))) (goto-char (nth 1 parse-status)) ; go to the opening char (if (or (not js-indent-align-list-continuation) - (looking-at "[({[]\\s-*\\(/[/*]\\|$\\)")) + (looking-at "[({[]\\s-*\\(/[/*]\\|$\\)") + (save-excursion (forward-char) (js--looking-at-broken-arrow-function-p))) (progn ; nothing following the opening paren/bracket (skip-syntax-backward " ") (when (eq (char-before) ?\)) (backward-list)) diff --git a/test/manual/indent/js.js b/test/manual/indent/js.js index b0d8bcabd2..fc39c12244 100644 --- a/test/manual/indent/js.js +++ b/test/manual/indent/js.js @@ -144,6 +144,15 @@ bar( /abc/ ) +// bug#25904 +foo.bar.baz(very => // A comment + very +).biz(([baz={a: [123]}, boz]) => + baz +).snarf((snorf) => /* Another comment */ + snorf +); + // Local Variables: // indent-tabs-mode: nil // js-indent-level: 2 -- 2.11.0