From 9769d49f91e944dfe1b7a44684df4382c8a19411 Mon Sep 17 00:00:00 2001 From: Glenn Morris Date: Thu, 22 Nov 2007 04:19:48 +0000 Subject: [PATCH] (check-declare-scan): Expand .c files relative to src/ directory. (check-declare-verify): Handle .c files (without arg checking). --- lisp/ChangeLog | 15 ++++ lisp/emacs-lisp/check-declare.el | 117 +++++++++++++++++-------------- 2 files changed, 80 insertions(+), 52 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 2280c706bd5..08cfd22f581 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,18 @@ +2007-11-22 Glenn Morris + + * 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 * 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 76719f1b876..5da8691beed 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 ...). -- 2.39.2