aboutsummaryrefslogtreecommitdiffstats
path: root/lisp
diff options
context:
space:
mode:
authorGlenn Morris <[email protected]>2007-11-22 04:19:48 +0000
committerGlenn Morris <[email protected]>2007-11-22 04:19:48 +0000
commit9769d49f91e944dfe1b7a44684df4382c8a19411 (patch)
tree7326835e400fa43926f2ec94251dc0ff46799f60 /lisp
parent3ab75caec0317d22b5ecf301d55467eb8a685f61 (diff)
(check-declare-scan): Expand .c files relative to src/ directory.
(check-declare-verify): Handle .c files (without arg checking).
Diffstat (limited to 'lisp')
-rw-r--r--lisp/ChangeLog15
-rw-r--r--lisp/emacs-lisp/check-declare.el117
2 files changed, 80 insertions, 52 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index 2280c706bd..08cfd22f58 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -1,3 +1,18 @@
+2007-11-22 Glenn Morris <[email protected]>
+
+ * dos-fns.el (int86):
+ * term/mac-win.el (mac-font-panel-mode): Fix declarations.
+
+ * calendar/cal-menu.el (cal-menu-holidays-menu): Fix holiday-list call.
+
+ * calendar/holidays.el (holiday-list): Add autoload cookie.
+
+ * emacs-lisp/check-declare.el (check-declare-scan): Expand .c
+ files relative to src/ directory.
+ (check-declare-verify): Handle .c files (without arg checking).
+
+ * emacs-lisp/byte-run.el (declare-function): Doc fix.
+
2007-11-22 Dan Nicolaescu <[email protected]>
* replace.el (occur-mode-map): Add a major mode menu with entries
diff --git a/lisp/emacs-lisp/check-declare.el b/lisp/emacs-lisp/check-declare.el
index 76719f1b87..5da8691bee 100644
--- a/lisp/emacs-lisp/check-declare.el
+++ b/lisp/emacs-lisp/check-declare.el
@@ -34,7 +34,7 @@
;; 1. Handle defstructs (eg uniquify-item-base in desktop.el).
-;; 2. Check C files (look in src/)?
+;; 2. Argument checking for functions defined in C.
;;; Code:
@@ -56,7 +56,15 @@ ARGLIST may be absent. This claims that FNFILE defines FN, with ARGLIST."
(setq fn (match-string 1)
fnfile (match-string 2))
(or (file-name-absolute-p fnfile)
- (setq fnfile (expand-file-name fnfile (file-name-directory file))))
+ (setq fnfile
+ (expand-file-name fnfile
+ ;; .c files are assumed to be
+ ;; relative to the Emacs src/ directory.
+ (if (string-equal
+ "c" (file-name-extension fnfile))
+ (expand-file-name "src"
+ source-directory)
+ (file-name-directory file)))))
(setq alist (cons
(list fnfile fn
(progn
@@ -80,59 +88,64 @@ FNFILE with the specified ARGLIST. Returns nil if all claims are
found to be true, otherwise a list of errors with elements of the form
\(FILE FN TYPE), where TYPE is a string giving details of the error."
(let ((m (format "Checking %s..." fnfile))
+ (cflag (string-equal "c" (file-name-extension fnfile)))
re fn sig siglist arglist type errlist)
(message "%s" m)
- (if (string-equal (file-name-extension fnfile) "c")
- (progn
- (message "%sskipping C file" m)
- nil)
- (or (file-exists-p fnfile)
- (setq fnfile (concat fnfile ".el")))
- (if (file-exists-p fnfile)
- (with-temp-buffer
- (insert-file-contents fnfile)
- ;; defsubst's don't _have_ to be known at compile time.
- (setq re (format "^[ \t]*(\\(def\\(?:un\\|subst\\|\
+ (or cflag
+ (file-exists-p fnfile)
+ (setq fnfile (concat fnfile ".el")))
+ (if (file-exists-p fnfile)
+ (with-temp-buffer
+ (insert-file-contents fnfile)
+ ;; defsubst's don't _have_ to be known at compile time.
+ (setq re (format (if cflag
+ "^[ \t]*\\(DEFUN\\)[ \t]*([ \t]*\"%s\""
+ "^[ \t]*(\\(def\\(?:un\\|subst\\|\
ine-derived-mode\\|ine-minor-mode\\|alias[ \t]+'\\)\\)\
-\[ \t]*%s\\([ \t;]+\\|$\\)"
- (regexp-opt (mapcar 'cadr fnlist) t)))
- (while (re-search-forward re nil t)
- (skip-chars-forward " \t\n")
- (setq fn (match-string 2)
- sig (cond ((string-equal (match-string 1)
- "define-derived-mode")
- '(0 . 0))
- ((string-equal (match-string 1)
- "define-minor-mode")
- '(0 . 1))
- ;; Can't easily check alias arguments.
- ((string-equal (match-string 1)
- "defalias")
- t)
- (t
- (if (looking-at "\\((\\|nil\\)")
- (byte-compile-arglist-signature
- (read (current-buffer))))))
- ;; alist of functions and arglist signatures.
- siglist (cons (cons fn sig) siglist)))))
- (dolist (e fnlist)
- (setq arglist (nth 2 e)
- type
- (if re ; re non-nil means found a file
- (if (setq sig (assoc (cadr e) siglist))
- ;; Recall we use t to mean no arglist specified,
- ;; to distinguish from an empty arglist.
- (unless (or (eq arglist t)
- (eq sig t))
- (unless (equal (byte-compile-arglist-signature arglist)
- (cdr sig))
- "arglist mismatch"))
- "function not found")
- "file not found"))
- (when type
- (setq errlist (cons (list (car e) (cadr e) type) errlist))))
- (message "%s%s" m (if errlist "problems found" "OK"))
- errlist)))
+\[ \t]*%s\\([ \t;]+\\|$\\)")
+ (regexp-opt (mapcar 'cadr fnlist) t)))
+ (while (re-search-forward re nil t)
+ (skip-chars-forward " \t\n")
+ (setq fn (match-string 2)
+ ;; (min . max) for a fixed number of arguments, or
+ ;; arglists with optional elements.
+ ;; (min) for arglists with &rest.
+ sig (cond ((string-equal (match-string 1)
+ "define-derived-mode")
+ '(0 . 0))
+ ((string-equal (match-string 1)
+ "define-minor-mode")
+ '(0 . 1))
+ ;; Can't easily check alias arguments.
+ ((string-equal (match-string 1)
+ "defalias")
+ t)
+ (t
+ (if (looking-at "\\((\\|nil\\)")
+ (byte-compile-arglist-signature
+ (read (current-buffer))))))
+ ;; alist of functions and arglist signatures.
+ siglist (cons (cons fn sig) siglist)))))
+ (dolist (e fnlist)
+ (setq arglist (nth 2 e)
+ type
+ (if re ; re non-nil means found a file
+ (if (setq sig (assoc (cadr e) siglist))
+ ;; Recall we use t to mean no arglist specified,
+ ;; to distinguish from an empty arglist.
+ ;; FIXME c arg checking not yet implemented.
+ (unless (or cflag
+ (eq arglist t)
+ (eq sig t))
+ (unless (equal (byte-compile-arglist-signature arglist)
+ (cdr sig))
+ "arglist mismatch"))
+ "function not found")
+ "file not found"))
+ (when type
+ (setq errlist (cons (list (car e) (cadr e) type) errlist))))
+ (message "%s%s" m (if errlist "problems found" "OK"))
+ errlist))
(defun check-declare-sort (alist)
"Sort a list with elements FILE (FNFILE ...).