]> git.eshelyaron.com Git - emacs.git/commitdiff
Make checkdoc work with qualified methods
authorMauro Aranda <maurooaranda@gmail.com>
Thu, 4 Mar 2021 11:34:58 +0000 (08:34 -0300)
committerMauro Aranda <maurooaranda@gmail.com>
Thu, 4 Mar 2021 11:34:58 +0000 (08:34 -0300)
* lisp/emacs-lisp/checkdoc.el (checkdoc--next-docstring): Handle
cl-defmethod in a case of its own.  Check for the presence of
qualifiers, and skip them accordingly until the docstring.

* test/lisp/emacs-lisp/checkdoc-tests.el (checkdoc-cl-defmethod-qualified-ok)
(checkdoc-cl-defmethod-with-extra-qualifier-ok)
(checkdoc-cl-defmethod-with-extra-and-nil-args-ok): Add tests for the fix.

lisp/emacs-lisp/checkdoc.el
test/lisp/emacs-lisp/checkdoc-tests.el

index 75aefdc7ba04494fec31b9b6a562236382d11348..213ab43184f02acca63dc49e7054d6d8a6624650 100644 (file)
@@ -932,7 +932,7 @@ don't move point."
                            ;; definition ends prematurely.
                            (end-of-file)))
     (`(,(or 'defun 'defvar 'defcustom 'defmacro 'defconst 'defsubst 'defadvice
-            'cl-defun 'cl-defgeneric 'cl-defmethod 'cl-defmacro)
+            'cl-defun 'cl-defgeneric 'cl-defmacro)
        ,(pred symbolp)
        ;; Require an initializer, i.e. ignore single-argument `defvar'
        ;; forms, which never have a doc string.
@@ -942,6 +942,25 @@ don't move point."
      ;; initializer or argument list.
      (forward-sexp 3)
      (skip-chars-forward " \n\t")
+     t)
+    (`(,'cl-defmethod
+        ,(pred symbolp)
+        . ,rest)
+     (down-list)
+     (forward-sexp (pcase (car rest)
+                     ;; No qualifier, so skip like we would have skipped in
+                     ;; the first clause of the outer `pcase'.
+                     ((pred listp) 3)
+                     (':extra
+                      ;; Skip the :extra qualifier together with its string too.
+                      ;; Skip any additional qualifier.
+                      (if (memq (nth 2 rest) '(:around :before :after))
+                                  6
+                                5))
+                     ;; Skip :before, :after or :around qualifier too.
+                     ((or ':around ':before ':after)
+                      4)))
+     (skip-chars-forward " \n\t")
      t)))
 
 ;;;###autoload
index 93015fbb105fd1e4c209b0d84223b34582e1c9e3..7a7aa9fb3cdbbb8b5b87a7c99c508ec635350259 100644 (file)
     (insert "(cl-defmethod foo ((a (eql smthg)) (b list)) \"Return A+B.\")")
     (checkdoc-defun)))
 
+(ert-deftest checkdoc-cl-defmethod-qualified-ok ()
+  "Checkdoc should be happy with a `cl-defmethod' using qualifiers."
+  (with-temp-buffer
+    (emacs-lisp-mode)
+    (insert "(cl-defmethod test :around ((a (eql smthg))) \"Return A.\")")
+    (checkdoc-defun)))
+
+(ert-deftest checkdoc-cl-defmethod-with-extra-qualifier-ok ()
+  "Checkdoc should be happy with a :extra qualified `cl-defmethod'."
+  (with-temp-buffer
+    (emacs-lisp-mode)
+    (insert "(cl-defmethod foo :extra \"foo\" ((a (eql smthg))) \"Return A.\")")
+    (checkdoc-defun))
+
+  (with-temp-buffer
+    (emacs-lisp-mode)
+    (insert
+     "(cl-defmethod foo :extra \"foo\" :after ((a (eql smthg))) \"Return A.\")")
+    (checkdoc-defun)))
+
+(ert-deftest checkdoc-cl-defmethod-with-extra-qualifier-and-nil-args-ok ()
+  "Checkdoc should be happy with a 0-arity :extra qualified `cl-defmethod'."
+  (with-temp-buffer
+    (emacs-lisp-mode)
+    (insert "(cl-defmethod foo :extra \"foo\" () \"Return A.\")")
+    (checkdoc-defun)))
+
 (ert-deftest checkdoc-cl-defun-with-key-ok ()
   "Checkdoc should be happy with a cl-defun using &key."
   (with-temp-buffer