Function: elint-init-form
elint-init-form is a byte-compiled function defined in elint.el.gz.
Signature
(elint-init-form FORM)
Documentation
Process FORM, adding to ELINT-ENV if recognized.
Source Code
;; Defined in /usr/src/emacs/lisp/emacs-lisp/elint.el.gz
(defvar elint-env) ; from elint-init-env
(defun elint-init-form (form)
"Process FORM, adding to ELINT-ENV if recognized."
(cond
;; Eg nnmaildir seems to use [] as a form of comment syntax.
((not (listp form))
(elint-warning "Skipping non-list form `%s'" form))
;; Add defined variable
((memq (car form) '(defvar defconst defcustom))
(setq elint-env (elint-env-add-var elint-env (cadr form))))
;; Add function
((memq (car form) '(defun defsubst))
(setq elint-env (elint-env-add-func elint-env (cadr form) (nth 2 form))))
;; FIXME needs a handler to say second arg is not a variable when we come
;; to scan the form.
((eq (car form) 'define-derived-mode)
(setq elint-env (elint-env-add-func elint-env (cadr form) ())
elint-env (elint-env-add-var elint-env (cadr form))
elint-env (elint-env-add-var elint-env
(intern (format "%s-map" (cadr form))))))
((eq (car form) 'define-minor-mode)
(setq elint-env (elint-env-add-func elint-env (cadr form) '(&optional arg))
;; FIXME mode map?
elint-env (elint-env-add-var elint-env (cadr form))))
((and (eq (car form) 'easy-menu-define)
(cadr form))
(setq elint-env (elint-env-add-func elint-env (cadr form) '(event))
elint-env (elint-env-add-var elint-env (cadr form))))
;; FIXME it would be nice to check the autoloads are correct.
((eq (car form) 'autoload)
(setq elint-env (elint-env-add-func elint-env (cadr (cadr form)) 'unknown)))
((eq (car form) 'declare-function)
(setq elint-env (elint-env-add-func
elint-env (cadr form)
(if (or (< (length form) 4)
(eq (nth 3 form) t)
(unless (stringp (nth 2 form))
(elint-error "Malformed declaration for `%s'"
(cadr form))
t))
'unknown
(nth 3 form)))))
((and (eq (car form) 'defalias) (listp (nth 2 form)))
;; If the alias points to something already in the environment,
;; add the alias to the environment with the same arguments.
;; FIXME symbol-function, eg backquote.el?
(let ((def (elint-env-find-func elint-env (cadr (nth 2 form)))))
(setq elint-env (elint-env-add-func elint-env (cadr (cadr form))
(if def (cadr def) 'unknown)))))
;; Add macro, both as a macro and as a function
((eq (car form) 'defmacro)
(setq elint-env (elint-env-add-macro elint-env (cadr form)
(cons 'lambda (cddr form)))
elint-env (elint-env-add-func elint-env (cadr form) (nth 2 form))))
((and (eq (car form) 'put)
(= 4 (length form))
(eq (car-safe (cadr form)) 'quote)
(equal (nth 2 form) '(quote error-conditions)))
(setq-local elint-extra-errors
(cons (cadr (cadr form)) elint-extra-errors)))
((eq (car form) 'provide)
(add-to-list 'elint-features (eval (cadr form))))
;; Import variable definitions
((memq (car form) '(require cc-require cc-require-when-compile))
(let ((name (eval (cadr form)))
(file (eval (nth 2 form))))
(unless (memq name elint-features)
(add-to-list 'elint-features name)
(setq elint-env (elint-add-required-env elint-env name file))))))
elint-env)