summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Kangas <stefan@marxist.se>2021-09-13 06:03:44 +0200
committerStefan Kangas <stefan@marxist.se>2021-09-13 06:44:52 +0200
commit2110973351f01fb5cdf90b705acb58354b608050 (patch)
treeee22904f63e925a95177e5ce4d11e94671642aad
parentbd601099b9332ef6bae697b23b63ee648d56b667 (diff)
downloademacs-2110973351f01fb5cdf90b705acb58354b608050.tar.gz
Improve checkdoc abbreviation handling
* lisp/emacs-lisp/checkdoc.el (checkdoc-in-abbreviation-p): New helper function. (checkdoc-sentencespace-region-engine): Fix handling abbreviations after escaped parenthesis. * test/lisp/emacs-lisp/checkdoc-tests.el (checkdoc-tests-in-abbrevation-p) (checkdoc-tests-in-abbrevation-p/with-parens) (checkdoc-tests-in-abbrevation-p/with-escaped-parens): New tests.
-rw-r--r--lisp/emacs-lisp/checkdoc.el36
-rw-r--r--test/lisp/emacs-lisp/checkdoc-tests.el24
2 files changed, 50 insertions, 10 deletions
diff --git a/lisp/emacs-lisp/checkdoc.el b/lisp/emacs-lisp/checkdoc.el
index 00cc7777e1a..1ab44e0f665 100644
--- a/lisp/emacs-lisp/checkdoc.el
+++ b/lisp/emacs-lisp/checkdoc.el
@@ -1998,6 +1998,31 @@ The text checked is between START and LIMIT."
(setq c (1+ c)))
(and (< 0 c) (= (% c 2) 0))))))
+(defun checkdoc-in-abbreviation-p (begin)
+ "Return non-nil if point is at an abbreviation.
+Examples of abbreviations handled: \"e.g.\", \"i.e.\", \"cf.\"."
+ (save-excursion
+ (goto-char begin)
+ (condition-case nil
+ (progn
+ (forward-sexp -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 "iI") "." (any "eE")) ; i.e.
+ (seq (any "eE") ".g") ; e.g.
+ (seq (any "cC") "f"))) ; c.f.
+ "vs") ; vs.
+ ".")))
+ (error t))))
+
(defun checkdoc-proper-noun-region-engine (begin end)
"Check all text between BEGIN and END for lower case proper nouns.
These are Emacs centric proper nouns which should be capitalized for
@@ -2060,16 +2085,7 @@ If the offending word is in a piece of quoted text, then it is skipped."
(e (match-end 1)))
(unless (or (checkdoc-in-sample-code-p begin end)
(checkdoc-in-example-string-p begin end)
- (save-excursion
- (goto-char b)
- (condition-case nil
- (progn
- (forward-sexp -1)
- ;; piece of an abbreviation
- ;; FIXME etc
- (looking-at
- "\\([a-zA-Z]\\|[iI]\\.?e\\|[eE]\\.?g\\|[cC]f\\)\\."))
- (error t))))
+ (checkdoc-in-abbreviation-p b))
(if (checkdoc-autofix-ask-replace
b e
"There should be two spaces after a period. Fix? "
diff --git a/test/lisp/emacs-lisp/checkdoc-tests.el b/test/lisp/emacs-lisp/checkdoc-tests.el
index 2a1d8b27636..a4b252031fe 100644
--- a/test/lisp/emacs-lisp/checkdoc-tests.el
+++ b/test/lisp/emacs-lisp/checkdoc-tests.el
@@ -122,4 +122,28 @@ See the comments in Bug#24998."
(should (looking-at-p "\"baz\")"))
(should-not (checkdoc-next-docstring))))
+(ert-deftest checkdoc-tests-in-abbrevation-p ()
+ (with-temp-buffer
+ (emacs-lisp-mode)
+ (insert "foo bar e.g. baz")
+ (goto-char (point-min))
+ (re-search-forward "e.g")
+ (should (checkdoc-in-abbreviation-p (point)))))
+
+(ert-deftest checkdoc-tests-in-abbrevation-p/with-parens ()
+ (with-temp-buffer
+ (emacs-lisp-mode)
+ (insert "foo bar (e.g. baz)")
+ (goto-char (point-min))
+ (re-search-forward "e.g")
+ (should (checkdoc-in-abbreviation-p (point)))))
+
+(ert-deftest checkdoc-tests-in-abbrevation-p/with-escaped-parens ()
+ (with-temp-buffer
+ (emacs-lisp-mode)
+ (insert "foo\n\\(e.g. baz)")
+ (goto-char (point-min))
+ (re-search-forward "e.g")
+ (should (checkdoc-in-abbreviation-p (point)))))
+
;;; checkdoc-tests.el ends here