mirror of
git://git.sv.gnu.org/emacs.git
synced 2025-12-10 08:10:21 -08:00
(check-declare-scan): Read the declaration rather than parsing it as a
regexp. This relaxes the layout requirements and makes errors easier to detect. (check-declare-verify): Check file is regular. (check-declare-directory): Doc fix.
This commit is contained in:
parent
8aed8fa983
commit
787cc821c0
1 changed files with 23 additions and 23 deletions
|
|
@ -81,28 +81,30 @@ defines FN, with ARGLIST. FILEONLY non-nil means only check that FNFILE
|
|||
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))
|
||||
|
||||
|
|
@ -138,7 +140,7 @@ is a string giving details of the error."
|
|||
(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.
|
||||
|
|
@ -291,9 +293,7 @@ See `check-declare-directory' for more information."
|
|||
;;;###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))
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue