(setq docs (nth 3 form)))
('lambda
(setq kind "") ; can't be "function", unfortunately
- (setq docs (nth 2 form))))
+ (let* ((definer (and (cadr form) (symbolp (cadr form))))
+ (docstring (nth (if definer 3 2) form)))
+ (setq docs (and (stringp docstring)
+ docstring)))))
+ (when (and (consp name) (eq (car name) 'quote))
+ (setq name (cadr name)))
+ (setq name (if name (format " `%s' " name) ""))
(when (and kind docs (stringp docs))
- (when (byte-compile--wide-docstring-p docs col)
- (byte-compile-warn-x
- name
- "%s%sdocstring wider than %s characters"
- kind name col))
+ (let ((col (max byte-compile-docstring-max-column fill-column)))
+ (when (byte-compile--wide-docstring-p docs col)
+ (byte-compile-warn-x
+ name
+ "%sdocstring wider than %s characters" (funcall prefix) col)))
;; There's a "naked" ' character before a symbol/list, so it
;; should probably be quoted with \=.
(when (string-match-p (rx (| (in " \t") bol)
;; I tried it, it broke the bootstrap :-(
(let ((fn (car-safe form)))
(pcase form
+ (`(defalias ,(and `(quote ,def)
+ (pred (lambda (e) (and e (symbolp e)))))
+ . ,_rest)
+ (let ((defining-symbol def))
+ (macroexp--all-forms form 2)))
+ (`(,(or `defvar `defconst)
+ ,(and def (pred (lambda (e) (and e (symbolp e)))))
+ . ,(and _rest (pred (not null))))
+ (let ((defining-symbol def))
+ (macroexp--all-forms form 2)))
(`(cond . ,clauses)
- (macroexp--cons fn (macroexp--all-clauses clauses) form))
+ ;; Check for rubbish clauses at the end before macro-expansion,
+ ;; to avoid nuisance warnings from clauses that become
+ ;; unconditional through that process.
+ ;; FIXME: this strategy is defeated by forced `macroexpand-all',
+ ;; such as in `cl-flet'. Haven't seen that in the wild, though.
+ (let ((default-tail nil)
+ (n 0)
+ (rest clauses))
+ (while rest
+ (let ((c (car-safe (car rest))))
+ (when (cond ((consp c) (and (memq (car c) '(quote function))
+ (cadr c)))
+ ((symbolp c) (or (eq c t) (keywordp c)))
+ (t t))
+ ;; This is unquestionably a default clause.
+ (setq default-tail (cdr rest))
+ (setq clauses (take (1+ n) clauses)) ; trim the tail
+ (setq rest nil)))
+ (setq n (1+ n))
+ (setq rest (cdr rest)))
+ (let ((expanded-form
+ (macroexp--cons fn (macroexp--all-clauses clauses) form)))
+ (if default-tail
+ (macroexp-warn-and-return
+ (format-message
+ "Useless clause following default `cond' clause")
+ expanded-form '(suspicious cond) t default-tail)
+ expanded-form))))
(`(condition-case . ,(or `(,err ,body . ,handlers) pcase--dontcare))
(let ((exp-body (macroexp--expand-all body)))
(if handlers