Warn about duplicated :tag strings in defcustom choices
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.
This commit is contained in:
parent
321f2e1e4d
commit
b03338c70d
2 changed files with 12 additions and 2 deletions
|
@ -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)
|
||||
|
|
|
@ -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)))
|
||||
|
|
Loading…
Add table
Reference in a new issue