]> git.eshelyaron.com Git - emacs.git/commitdiff
Warn about quoted symbols in defcustom choice/other forms
authorLars Ingebrigtsen <larsi@gnus.org>
Wed, 11 May 2022 10:51:11 +0000 (12:51 +0200)
committerLars Ingebrigtsen <larsi@gnus.org>
Wed, 11 May 2022 10:51:11 +0000 (12:51 +0200)
* lisp/emacs-lisp/bytecomp.el
(byte-compile--suspicious-defcustom-choice): New function (bug#16271).
(byte-compile-nogroup-warn): Use it to warn about forms like
(choice (const :tag "foo" 'bar)).

etc/NEWS
lisp/emacs-lisp/bytecomp.el
test/lisp/emacs-lisp/bytecomp-tests.el

index a0164bbf3f024cc0339f8ef1bd0d6b9a44390cbc..595e477e2f32a0c9738ab8ce0ad73c4f50bc3d5b 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -1767,6 +1767,19 @@ functions.
 \f
 * Lisp Changes in Emacs 29.1
 
+** Byte compilation
+
+---
+*** Byte compilation will now warn about some malformed 'defcustom' types.
+It's very common to write 'defcustom' types on the form:
+
+   :type '(choice (const :tag "foo" 'bar))
+
+I.e., double-quoting the 'bar', which is almost never the correct
+value.  The byte compiler will now issue a warning if it encounters
+these forms.
+
+
 +++
 *** 'restore-buffer-modified-p' can now alter buffer auto-save state.
 With a FLAG value of 'autosaved', it will mark the buffer as having
index c0dffe544cfe207d8b31bb965039814e05cd3372..cbf2659109a232c5192024fe006d0af3bc2826a9 100644 (file)
@@ -1562,15 +1562,39 @@ extra args."
 (dolist (elt '(format message error))
   (put elt 'byte-compile-format-like t))
 
+(defun byte-compile--suspicious-defcustom-choice (type)
+  "Say whether defcustom TYPE looks odd."
+  ;; Check whether there's anything like (choice (const :tag "foo" ;; 'bar)).
+  ;; We don't actually follow the syntax for defcustom types, but this
+  ;; should be good enough.
+  (catch 'found
+    (if (and (consp type)
+             (proper-list-p type))
+        (if (memq (car type) '(const other))
+            (when (assq 'quote type)
+              (throw 'found t))
+          (when (memq t (mapcar #'byte-compile--suspicious-defcustom-choice
+                                type))
+            (throw 'found t)))
+      nil)))
+
 ;; Warn if a custom definition fails to specify :group, or :type.
 (defun byte-compile-nogroup-warn (form)
   (let ((keyword-args (cdr (cdr (cdr (cdr form)))))
        (name (cadr form)))
     (when (eq (car-safe name) 'quote)
-      (or (not (eq (car form) 'custom-declare-variable))
-         (plist-get keyword-args :type)
-         (byte-compile-warn-x (cadr name)
-          "defcustom for `%s' fails to specify type" (cadr name)))
+      (when (eq (car form) 'custom-declare-variable)
+        (let ((type (plist-get keyword-args :type)))
+         (cond
+           ((not type)
+           (byte-compile-warn-x (cadr name)
+                                "defcustom for `%s' fails to specify type"
+                                 (cadr name)))
+           ((byte-compile--suspicious-defcustom-choice type)
+           (byte-compile-warn-x
+             (cadr name)
+            "defcustom for `%s' has syntactically odd type `%s'"
+             (cadr name) type)))))
       (if (and (memq (car form) '(custom-declare-face custom-declare-variable))
               byte-compile-current-group)
          ;; The group will be provided implicitly.
index abd33ab8e5a2491cf98b39a34cb7516e321e1b0f..051e8b9e5c93bca8a585bee1f2996efa9433af00 100644 (file)
@@ -1538,6 +1538,12 @@ EXPECTED-POINT BINDINGS (MODES \\='\\='(ruby-mode js-mode python-mode)) \
 (TEST-IN-COMMENTS t) (TEST-IN-STRINGS t) (TEST-IN-CODE t) \
 (FIXTURE-FN \\='#\\='electric-pair-mode))" fill-column)))
 
+(defun test-bytecomp-defgroup-choice ()
+  (should-not (byte-compile--suspicious-defcustom-choice 'integer))
+  (should-not (byte-compile--suspicious-defcustom-choice
+               '(choice (const :tag "foo" bar))))
+  (should (byte-compile--suspicious-defcustom-choice
+           '(choice (const :tag "foo" 'bar)))))
 
 ;; Local Variables:
 ;; no-byte-compile: t