exists, not that it defines FN. This is for function definitions that we
don't know how to recognize (e.g. some macros)."
(let ((m (format "Scanning %s..." file))
- alist fnfile fn arglist fileonly)
+ alist form len fn fnfile arglist fileonly)
(message "%s" m)
(with-temp-buffer
(insert-file-contents file)
- (while (re-search-forward
- "^[ \t]*(declare-function[ \t]+\\(\\S-+\\)[ \t]+\
-\"\\(\\S-+\\)\"" nil t)
- (setq fn (match-string 1)
- fnfile (match-string 2)
- fnfile (check-declare-locate fnfile (expand-file-name file))
- arglist (progn
- (skip-chars-forward " \t\n")
- ;; Use `t' to distinguish no arglist
- ;; specified from an empty one.
- (if (looking-at "\\((\\|nil\\|t\\)")
- (read (current-buffer))
- t))
- fileonly (progn
- (skip-chars-forward " \t\n")
- (if (looking-at "\\(t\\|'\\sw+\\)")
- (match-string 1)))
- alist (cons (list fnfile fn arglist fileonly) alist))))
+ ;; FIXME we could theoretically be inside a string.
+ (while (re-search-forward "^[ \t]*\\((declare-function\\)[ \t\n]" nil t)
+ (goto-char (match-beginning 1))
+ (if (and (setq form (ignore-errors (read (current-buffer)))
+ len (length form))
+ (> len 2) (< len 6)
+ (symbolp (setq fn (cadr form)))
+ (setq fn (symbol-name fn)) ; later we use as a search string
+ (stringp (setq fnfile (nth 2 form)))
+ (setq fnfile (check-declare-locate fnfile
+ (expand-file-name file)))
+ ;; Use `t' to distinguish unspecified arglist from empty one.
+ (or (eq t (setq arglist (if (> len 3)
+ (nth 3 form)
+ t)))
+ (listp arglist))
+ (symbolp (setq fileonly (nth 4 form))))
+ (setq alist (cons (list fnfile fn arglist fileonly) alist))
+ ;; FIXME make this more noticeable.
+ (message "Malformed declaration for `%s'" (cadr form)))))
(message "%sdone" m)
alist))
(message "%s" m)
(if ext
(setq fnfile (substring fnfile 4)))
- (if (file-exists-p fnfile)
+ (if (file-regular-p fnfile)
(with-temp-buffer
(insert-file-contents fnfile)
;; defsubst's don't _have_ to be known at compile time.
;;;###autoload
(defun check-declare-directory (root)
"Check veracity of all `declare-function' statements under directory ROOT.
-Returns non-nil if any false statements are found. For this to
-work correctly, the statements must adhere to the format
-described in the documentation of `declare-function'."
+Returns non-nil if any false statements are found."
(interactive "DDirectory to check: ")
(or (file-directory-p (setq root (expand-file-name root)))
(error "Directory `%s' not found" root))