]> git.eshelyaron.com Git - emacs.git/commitdiff
Warn about duplicated :tag strings in defcustom choices
authorMattias Engdegård <mattiase@acm.org>
Tue, 19 Sep 2023 13:18:11 +0000 (15:18 +0200)
committerMattias Engdegård <mattiase@acm.org>
Tue, 19 Sep 2023 13:21:03 +0000 (15:21 +0200)
It is bad user experience when two menu items have identical labels.

* lisp/emacs-lisp/bytecomp.el (bytecomp--check-cus-type): Add check.
* test/lisp/emacs-lisp/bytecomp-tests.el
(bytecomp-test-defcustom-type): Add test case.

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

index 1474acc1638c559bdb71da39851bdae3a028d1b9..387d7ef4de1e7c71db144adfc8b2fcbd008d075e 100644 (file)
@@ -5272,7 +5272,8 @@ FORM is used to provide location, `bytecomp--cus-function' and
           (unless tail
             (bytecomp--cus-warn type "`%s' without any types inside" head))
           (let ((clauses tail)
-                (constants nil))
+                (constants nil)
+                (tags nil))
             (while clauses
               (let* ((ty (car clauses))
                      (ty-head (car-safe ty)))
@@ -5291,6 +5292,12 @@ FORM is used to provide location, `bytecomp--cus-function' and
                       (bytecomp--cus-warn
                        ty "duplicated value in `%s': `%S'" head val))
                     (push val constants)))
+                (let ((tag (and (consp ty) (plist-get (cdr ty) :tag))))
+                  (when (stringp tag)
+                    (when (member tag tags)
+                      (bytecomp--cus-warn
+                       ty "duplicated :tag string in `%s': %S" head tag))
+                    (push tag tags)))
                 (bytecomp--check-cus-type ty))
               (setq clauses (cdr clauses)))))
          ((eq head 'cons)
index a335a7fa1f89e760515ac2ef7a6e23adc1752ad4..e644417c3d41c60dcbf33859a73435919009d1f0 100644 (file)
@@ -1875,7 +1875,7 @@ EXPECTED-POINT BINDINGS (MODES \\='\\='(ruby-mode js-mode python-mode)) \
 (FIXTURE-FN \\='#\\='electric-pair-mode))" fill-column)))
 
 (ert-deftest bytecomp-test-defcustom-type ()
-  (cl-flet ((dc (type) `(defcustom mytest nil "doc" :type ',type)))
+  (cl-flet ((dc (type) `(defcustom mytest nil "doc" :type ',type :group 'test)))
     (bytecomp--with-warning-test
      (rx "type should not be quoted") (dc ''integer))
     (bytecomp--with-warning-test
@@ -1890,6 +1890,9 @@ EXPECTED-POINT BINDINGS (MODES \\='\\='(ruby-mode js-mode python-mode)) \
     (bytecomp--with-warning-test
      (rx "duplicated value in `choice': `a'")
      (dc '(choice (const a) (const b) (const a))))
+    (bytecomp--with-warning-test
+     (rx "duplicated :tag string in `choice': \"X\"")
+     (dc '(choice (const :tag "X" a) (const :tag "Y" b) (other :tag "X" c))))
     (bytecomp--with-warning-test
      (rx "`cons' requires 2 type specs, found 1")
      (dc '(cons :tag "a" integer)))