Avoid jumping too far in checkdoc-in-abbreviation-p

* lisp/emacs-lisp/checkdoc.el (checkdoc-in-abbreviation-p): Use
'forward-ward' instead of 'forward-sexp' to avoid jumping too far in
some situations.  (Bug#50731)

* test/lisp/emacs-lisp/checkdoc-tests.el
(checkdoc-tests--abbrev-test): New helper function.
(checkdoc-tests-in-abbrevation-p/basic-case): Rename from
'checkdoc-tests-in-abbrevation-p'.
(checkdoc-tests-in-abbrevation-p/with-parens)
(checkdoc-tests-in-abbrevation-p/with-escaped-parens): Use above new
helper function.
(checkdoc-tests-in-abbrevation-p/single-char)
(checkdoc-tests-in-abbrevation-p/with-em-dash)
(checkdoc-tests-in-abbrevation-p/incorrect-abbreviation): New tests.
This commit is contained in:
Stefan Kangas 2021-09-23 21:10:08 +02:00
parent 387af85c4d
commit 55083d90a3
2 changed files with 41 additions and 35 deletions

View file

@ -2097,27 +2097,31 @@ Examples of abbreviations handled: \"e.g.\", \"i.e.\", \"cf.\"."
(save-excursion
(goto-char begin)
(condition-case nil
(progn
(forward-sexp -1)
(let ((single-letter t))
(forward-word -1)
;; Skip over all dots backwards, as `forward-word' will only
;; go one dot at a time in a string like "e.g.".
(while (save-excursion (forward-char -1)
(looking-at (rx ".")))
(setq single-letter nil)
(forward-word -1))
;; Piece of an abbreviation.
(looking-at
(rx (or letter ; single letter, as in "a."
(seq
;; There might exist an escaped parenthesis, as
;; this is often used in docstrings. In this
;; case, `forward-sexp' will have skipped over it,
;; so we need to skip it here too.
(? "\\(")
;; The abbreviations:
(or (seq (any "cC") "f") ; cf.
(seq (any "eE") ".g") ; e.g.
(seq (any "iI") "." (any "eE")))) ; i.e.
"etc" ; etc.
"vs" ; vs.
;; Some non-standard or less common ones that we
;; might as well ignore.
"Inc" "Univ" "misc" "resp")
".")))
(if single-letter
;; Handle a single letter, as in "a.", as this might be
;; a part of a list.
(rx letter ".")
(rx (or
;; The abbreviations:
(seq (or (seq (any "cC") "f") ; cf.
(seq (any "eE") ".g") ; e.g.
(seq (any "iI") "." (any "eE")))) ; i.e.
"etc" ; etc.
"vs" ; vs.
;; Some non-standard or less common ones that we
;; might as well ignore.
"Inc" "Univ" "misc" "resp")
"."))))
(error t))))
(defun checkdoc-proper-noun-region-engine (begin end)