Make js-beginning-of-defun return non-nil on success

The docstring of 'beginning-of-defun-function' says that the
function shall return non-nil when it found the beginning
of a defun.  This is specially important because the calling
code decides when to move point depending on the return value.
* lisp/progmodes/js.el (js-beginning-of-defun)
(js--beginning-of-defun-flat): Return non-nil when the beginning
of a defun is found.  (Bug#64283)

* test/lisp/progmodes/js-tests.el (js-mode-end-of-defun): Add a unit
test.
This commit is contained in:
Daniel Martín 2023-06-25 22:17:14 +02:00 committed by Eli Zaretskii
parent 2c90ade09a
commit ef16339918
2 changed files with 82 additions and 24 deletions

View file

@ -1024,11 +1024,13 @@ Return the pitem of the function we went to the beginning of."
"Helper function for `js-beginning-of-defun'."
(let ((pstate (js--beginning-of-defun-raw)))
(when pstate
(goto-char (js--pitem-h-begin (car pstate))))))
(goto-char (js--pitem-h-begin (car pstate)))
t)))
(defun js-beginning-of-defun (&optional arg)
"Value of `beginning-of-defun-function' for `js-mode'."
(setq arg (or arg 1))
(let ((found))
(while (and (not (eobp)) (< arg 0))
(cl-incf arg)
(when (and (not js-flat-functions)
@ -1038,8 +1040,10 @@ Return the pitem of the function we went to the beginning of."
(if (js--re-search-forward
"\\_<function\\_>" nil t)
(goto-char (js--function-prologue-beginning))
(goto-char (point-max))))
(progn (goto-char (js--function-prologue-beginning))
(setq found t))
(goto-char (point-max))
(setq found nil)))
(while (> arg 0)
(cl-decf arg)
@ -1050,12 +1054,15 @@ Return the pitem of the function we went to the beginning of."
(let ((prologue-begin (js--function-prologue-beginning)))
(cond ((and prologue-begin (< prologue-begin (point)))
(goto-char prologue-begin))
(goto-char prologue-begin)
(setq found t))
(js-flat-functions
(js--beginning-of-defun-flat))
(setq found (js--beginning-of-defun-flat)))
(t
(js--beginning-of-defun-nested))))))
(when (js--beginning-of-defun-nested)
(setq found t))))))
found))
(defun js--flush-caches (&optional beg _ignored)
"Flush the `js-mode' syntax cache after position BEG.

View file

@ -237,6 +237,57 @@ if (!/[ (:,='\"]/.test(value)) {
(js-deftest-indent "jsx-unclosed-2.jsx")
(js-deftest-indent "jsx.jsx")
;;;; Navigation tests.
(ert-deftest js-mode-beginning-of-defun ()
(with-temp-buffer
(insert "function foo() {
var value = 1;
}
/** A comment. */
function bar() {
var value = 1;
}
")
(js-mode)
;; Move point inside `foo'.
(goto-char 18)
(beginning-of-defun)
(should (bobp))
;; Move point between the two functions.
(goto-char 37)
(beginning-of-defun)
(should (bobp))
;; Move point inside `bar'.
(goto-char 73)
(beginning-of-defun)
;; Point should move to the beginning of `bar'.
(should (equal (point) 56))))
(ert-deftest js-mode-end-of-defun ()
(with-temp-buffer
(insert "function foo() {
var value = 1;
}
/** A comment. */
function bar() {
var value = 1;
}
")
(js-mode)
(goto-char (point-min))
(end-of-defun)
;; end-of-defun from the beginning of the buffer should go to the
;; end of `foo'.
(should (equal (point) 37))
;; Move point to the beginning of /** A comment. */
(goto-char 38)
(end-of-defun)
;; end-of-defun should move point to eob.
(should (eobp))))
(provide 'js-tests)
;;; js-tests.el ends here