annotate lisp/emacs-lisp/elint.el @ 104140:a01de4859d65

*** empty log message ***
author Nick Roberts <nickrob@snap.net.nz>
date Mon, 03 Aug 2009 22:07:23 +0000
parents 7fcfa9c429bd
children 646ba543ede9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
38436
b174db545cfd Some fixes to follow coding conventions.
Pavel Janík <Pavel@Janik.cz>
parents: 20014
diff changeset
1 ;;; elint.el --- Lint Emacs Lisp
19210
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2
102230
5ae300b1d079 (elint-unknown-builtin-args): Fix encode-time spec. (Bug#2453)
Glenn Morris <rgm@gnu.org>
parents: 100908
diff changeset
3 ;; Copyright (C) 1997, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
5ae300b1d079 (elint-unknown-builtin-args): Fix encode-time spec. (Bug#2453)
Glenn Morris <rgm@gnu.org>
parents: 100908
diff changeset
4 ;; 2009 Free Software Foundation, Inc.
19210
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
5
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
6 ;; Author: Peter Liljenberg <petli@lysator.liu.se>
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
7 ;; Created: May 1997
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8 ;; Keywords: lisp
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
10 ;; This file is part of GNU Emacs.
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
11
94655
90a2847062be Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 93975
diff changeset
12 ;; GNU Emacs is free software: you can redistribute it and/or modify
19210
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
13 ;; it under the terms of the GNU General Public License as published by
94655
90a2847062be Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 93975
diff changeset
14 ;; the Free Software Foundation, either version 3 of the License, or
90a2847062be Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 93975
diff changeset
15 ;; (at your option) any later version.
19210
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
16
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
17 ;; GNU Emacs is distributed in the hope that it will be useful,
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
18 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
19 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
20 ;; GNU General Public License for more details.
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
21
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
22 ;; You should have received a copy of the GNU General Public License
94655
90a2847062be Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 93975
diff changeset
23 ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
19210
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
24
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
25 ;;; Commentary:
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
26
104036
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
27 ;; This is a linter for Emacs Lisp. Currently, it mainly catches
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
28 ;; misspellings and undefined variables, although it can also catch
19210
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
29 ;; function calls with the wrong number of arguments.
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
30
104049
7fcfa9c429bd (elint-current-buffer, elint-defun):
Glenn Morris <rgm@gnu.org>
parents: 104036
diff changeset
31 ;; To use, call elint-current-buffer or elint-defun to lint a buffer
7fcfa9c429bd (elint-current-buffer, elint-defun):
Glenn Morris <rgm@gnu.org>
parents: 104036
diff changeset
32 ;; or defun. The first call runs `elint-initialize' to set up some
7fcfa9c429bd (elint-current-buffer, elint-defun):
Glenn Morris <rgm@gnu.org>
parents: 104036
diff changeset
33 ;; argument data, which may take a while.
19210
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
34
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
35 ;; The linter will try to "include" any require'd libraries to find
104036
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
36 ;; the variables defined in those. There is a fair amount of voodoo
19210
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
37 ;; involved in this, but it seems to work in normal situations.
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
38
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
39 ;;; To do:
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
40
104036
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
41 ;; * List of variables and functions defined in dumped lisp files.
19210
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
42 ;; * Adding type checking. (Stop that sniggering!)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
43
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
44 ;;; Code:
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
45
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
46 (defvar elint-log-buffer "*Elint*"
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
47 "*The buffer to insert lint messages in.")
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
48
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
49 ;;;
58938
f3ac898990de (elint-standard-variables, elint-unknown-builtin-args): Move definitions up.
Richard M. Stallman <rms@gnu.org>
parents: 58740
diff changeset
50 ;;; Data
f3ac898990de (elint-standard-variables, elint-unknown-builtin-args): Move definitions up.
Richard M. Stallman <rms@gnu.org>
parents: 58740
diff changeset
51 ;;;
f3ac898990de (elint-standard-variables, elint-unknown-builtin-args): Move definitions up.
Richard M. Stallman <rms@gnu.org>
parents: 58740
diff changeset
52
104036
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
53
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
54 ;; FIXME does this serve any useful purpose now elint-builtin-variables exists?
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
55 (defconst elint-standard-variables '(local-write-file-hooks vc-mode)
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
56 "Standard buffer local variables, excluding `elint-builtin-variables'.")
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
57
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
58 (defvar elint-builtin-variables nil
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
59 "List of built-in variables. Set by `elint-initialize'.")
58938
f3ac898990de (elint-standard-variables, elint-unknown-builtin-args): Move definitions up.
Richard M. Stallman <rms@gnu.org>
parents: 58740
diff changeset
60
104036
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
61 (defvar elint-autoloaded-variables nil
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
62 "List of `loaddefs.el' variables. Set by `elint-initialize'.")
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
63
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
64 ;; FIXME dumped variables and functions.
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
65
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
66 (defconst elint-unknown-builtin-args nil
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
67 "Those built-ins for which we can't find arguments, if any.")
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
68
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
69 (defconst elint-extra-errors '(file-locked file-supersession ftp-error)
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
70 "Errors without error-message or error-confitions properties.")
58938
f3ac898990de (elint-standard-variables, elint-unknown-builtin-args): Move definitions up.
Richard M. Stallman <rms@gnu.org>
parents: 58740
diff changeset
71
f3ac898990de (elint-standard-variables, elint-unknown-builtin-args): Move definitions up.
Richard M. Stallman <rms@gnu.org>
parents: 58740
diff changeset
72 ;;;
19210
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
73 ;;; ADT: top-form
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
74 ;;;
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
75
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
76 (defsubst elint-make-top-form (form pos)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
77 "Create a top form.
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
78 FORM is the form, and POS is the point where it starts in the buffer."
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
79 (cons form pos))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
80
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
81 (defsubst elint-top-form-form (top-form)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
82 "Extract the form from a TOP-FORM."
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
83 (car top-form))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
84
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
85 (defsubst elint-top-form-pos (top-form)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
86 "Extract the position from a TOP-FORM."
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
87 (cdr top-form))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
88
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
89 ;;;
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
90 ;;; ADT: env
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
91 ;;;
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
92
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
93 (defsubst elint-make-env ()
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
94 "Create an empty environment."
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
95 (list (list nil) nil nil))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
96
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
97 (defsubst elint-env-add-env (env newenv)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
98 "Augment ENV with NEWENV.
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
99 None of them is modified, and the new env is returned."
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
100 (list (append (car env) (car newenv))
104036
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
101 (append (cadr env) (cadr newenv))
19210
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
102 (append (car (cdr (cdr env))) (car (cdr (cdr newenv))))))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
103
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
104 (defsubst elint-env-add-var (env var)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
105 "Augment ENV with the variable VAR.
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
106 The new environment is returned, the old is unmodified."
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
107 (cons (cons (list var) (car env)) (cdr env)))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
108
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
109 (defsubst elint-env-add-global-var (env var)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
110 "Augment ENV with the variable VAR.
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
111 ENV is modified so VAR is seen everywhere.
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
112 ENV is returned."
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
113 (nconc (car env) (list (list var)))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
114 env)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
115
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
116 (defsubst elint-env-find-var (env var)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
117 "Non-nil if ENV contains the variable VAR.
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
118 Actually, a list with VAR as a single element is returned."
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
119 (assq var (car env)))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
120
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
121 (defsubst elint-env-add-func (env func args)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
122 "Augment ENV with the function FUNC, which has the arguments ARGS.
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
123 The new environment is returned, the old is unmodified."
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
124 (list (car env)
104036
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
125 (cons (list func args) (cadr env))
19210
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
126 (car (cdr (cdr env)))))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
127
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
128 (defsubst elint-env-find-func (env func)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
129 "Non-nil if ENV contains the function FUNC.
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
130 Actually, a list of (FUNC ARGS) is returned."
104036
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
131 (assq func (cadr env)))
19210
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
132
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
133 (defsubst elint-env-add-macro (env macro def)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
134 "Augment ENV with the macro named MACRO.
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
135 DEF is the macro definition (a lambda expression or similar).
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
136 The new environment is returned, the old is unmodified."
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
137 (list (car env)
104036
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
138 (cadr env)
19210
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
139 (cons (cons macro def) (car (cdr (cdr env))))))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
140
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
141 (defsubst elint-env-macro-env (env)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
142 "Return the macro environment of ENV.
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
143 This environment can be passed to `macroexpand'."
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
144 (car (cdr (cdr env))))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
145
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
146 (defsubst elint-env-macrop (env macro)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
147 "Non-nil if ENV contains MACRO."
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
148 (assq macro (elint-env-macro-env env)))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
149
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
150 ;;;
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
151 ;;; User interface
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
152 ;;;
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
153
104049
7fcfa9c429bd (elint-current-buffer, elint-defun):
Glenn Morris <rgm@gnu.org>
parents: 104036
diff changeset
154 ;;;###autoload
19210
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
155 (defun elint-current-buffer ()
104049
7fcfa9c429bd (elint-current-buffer, elint-defun):
Glenn Morris <rgm@gnu.org>
parents: 104036
diff changeset
156 "Lint the current buffer.
7fcfa9c429bd (elint-current-buffer, elint-defun):
Glenn Morris <rgm@gnu.org>
parents: 104036
diff changeset
157 If necessary, this first calls `elint-initalize'."
19210
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
158 (interactive)
104049
7fcfa9c429bd (elint-current-buffer, elint-defun):
Glenn Morris <rgm@gnu.org>
parents: 104036
diff changeset
159 (or elint-builtin-variables
7fcfa9c429bd (elint-current-buffer, elint-defun):
Glenn Morris <rgm@gnu.org>
parents: 104036
diff changeset
160 (elint-initialize))
104036
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
161 (elint-clear-log (format "Linting %s" (or (buffer-file-name)
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
162 (buffer-name))))
19210
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
163 (elint-display-log)
84899
789f9201f375 (elint-current-buffer, elint-check-defun-form, elint-check-let-form,
Juanma Barranquero <lekktu@gmail.com>
parents: 78217
diff changeset
164 (mapc 'elint-top-form (elint-update-env))
104036
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
165 ;; Tell the user we're finished. This is terribly klugy: we set
19210
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
166 ;; elint-top-form-logged so elint-log-message doesn't print the
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
167 ;; ** top form ** header...
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
168 (let ((elint-top-form-logged t))
104036
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
169 (elint-log-message "\nLinting finished.\n")))
20014
2ecea967337d (elint-check-defcustom-form): New function.
Karl Heuer <kwzh@gnu.org>
parents: 19210
diff changeset
170
104049
7fcfa9c429bd (elint-current-buffer, elint-defun):
Glenn Morris <rgm@gnu.org>
parents: 104036
diff changeset
171 ;;;###autoload
19210
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
172 (defun elint-defun ()
104049
7fcfa9c429bd (elint-current-buffer, elint-defun):
Glenn Morris <rgm@gnu.org>
parents: 104036
diff changeset
173 "Lint the function at point.
7fcfa9c429bd (elint-current-buffer, elint-defun):
Glenn Morris <rgm@gnu.org>
parents: 104036
diff changeset
174 If necessary, this first calls `elint-initalize'."
19210
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
175 (interactive)
104049
7fcfa9c429bd (elint-current-buffer, elint-defun):
Glenn Morris <rgm@gnu.org>
parents: 104036
diff changeset
176 (or elint-builtin-variables
7fcfa9c429bd (elint-current-buffer, elint-defun):
Glenn Morris <rgm@gnu.org>
parents: 104036
diff changeset
177 (elint-initialize))
19210
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
178 (save-excursion
104036
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
179 (or (beginning-of-defun) (error "Lint what?"))
19210
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
180 (let ((pos (point))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
181 (def (read (current-buffer))))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
182 (elint-display-log)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
183 (elint-update-env)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
184 (elint-top-form (elint-make-top-form def pos)))))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
185
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
186 ;;;
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
187 ;;; Top form functions
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
188 ;;;
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
189
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
190 (defvar elint-buffer-env nil
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
191 "The environment of a elisp buffer.
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
192 Will be local in linted buffers.")
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
193
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
194 (defvar elint-buffer-forms nil
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
195 "The top forms in a buffer.
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
196 Will be local in linted buffers.")
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
197
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
198 (defvar elint-last-env-time nil
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
199 "The last time the buffers env was updated.
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
200 Is measured in buffer-modified-ticks and is local in linted buffers.")
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
201
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
202 (defun elint-update-env ()
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
203 "Update the elint environment in the current buffer.
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
204 Don't do anything if the buffer hasn't been changed since this
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
205 function was called the last time.
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
206 Returns the forms."
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
207 (if (and (local-variable-p 'elint-buffer-env (current-buffer))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
208 (local-variable-p 'elint-buffer-forms (current-buffer))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
209 (local-variable-p 'elint-last-env-time (current-buffer))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
210 (= (buffer-modified-tick) elint-last-env-time))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
211 ;; Env is up to date
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
212 elint-buffer-forms
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
213 ;; Remake env
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
214 (set (make-local-variable 'elint-buffer-forms) (elint-get-top-forms))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
215 (set (make-local-variable 'elint-buffer-env)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
216 (elint-init-env elint-buffer-forms))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
217 (set (make-local-variable 'elint-last-env-time) (buffer-modified-tick))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
218 elint-buffer-forms))
20014
2ecea967337d (elint-check-defcustom-form): New function.
Karl Heuer <kwzh@gnu.org>
parents: 19210
diff changeset
219
19210
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
220 (defun elint-get-top-forms ()
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
221 "Collect all the top forms in the current buffer."
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
222 (save-excursion
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
223 (let ((tops nil))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
224 (goto-char (point-min))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
225 (while (elint-find-next-top-form)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
226 (let ((pos (point)))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
227 (condition-case nil
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
228 (setq tops (cons
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
229 (elint-make-top-form (read (current-buffer)) pos)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
230 tops))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
231 (end-of-file
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
232 (goto-char pos)
104036
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
233 (error "Missing ')' in top form: %s"
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
234 (buffer-substring pos (line-end-position)))))))
19210
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
235 (nreverse tops))))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
236
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
237 (defun elint-find-next-top-form ()
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
238 "Find the next top form from point.
42206
0f4506820432 Doc fix.
Pavel Janík <Pavel@Janik.cz>
parents: 38436
diff changeset
239 Return nil if there are no more forms, t otherwise."
19210
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
240 (parse-partial-sexp (point) (point-max) nil t)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
241 (not (eobp)))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
242
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
243 (defun elint-init-env (forms)
63511
964ef053b1bc (elint-init-env): Fix spelling in docstrings.
Juanma Barranquero <lekktu@gmail.com>
parents: 59506
diff changeset
244 "Initialize the environment from FORMS."
19210
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
245 (let ((env (elint-make-env))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
246 form)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
247 (while forms
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
248 (setq form (elint-top-form-form (car forms))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
249 forms (cdr forms))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
250 (cond
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
251 ;; Add defined variable
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
252 ((memq (car form) '(defvar defconst defcustom))
104036
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
253 (setq env (elint-env-add-var env (cadr form))))
19210
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
254 ;; Add function
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
255 ((memq (car form) '(defun defsubst))
104036
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
256 (setq env (elint-env-add-func env (cadr form) (nth 2 form))))
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
257 ;; FIXME it would be nice to check the autoloads are correct.
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
258 ((eq (car form) 'autoload)
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
259 (setq env (elint-env-add-func env (cadr (cadr form)) 'unknown)))
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
260 ((eq (car form) 'declare-function)
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
261 (setq env (elint-env-add-func env (cadr form)
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
262 (if (> (length form) 3)
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
263 (nth 3 form)
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
264 'unknown))))
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
265 ((eq (car form) 'defalias)
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
266 ;; If the alias points to something already in the environment,
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
267 ;; add the alias to the environment with the same arguments.
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
268 (let ((def (elint-env-find-func env (cadr (nth 2 form)))))
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
269 ;; FIXME warn if the alias target is unknown.
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
270 (setq env (elint-env-add-func env (cadr (cadr form))
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
271 (if def (cadr def) 'unknown)))))
19210
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
272 ;; Add macro, both as a macro and as a function
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
273 ((eq (car form) 'defmacro)
104036
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
274 (setq env (elint-env-add-macro env (cadr form)
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
275 (cons 'lambda (cddr form)))
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
276 env (elint-env-add-func env (cadr form) (nth 2 form))))
19210
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
277 ;; Import variable definitions
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
278 ((eq (car form) 'require)
104036
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
279 (let ((name (eval (cadr form)))
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
280 (file (eval (nth 2 form))))
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
281 (setq env (elint-add-required-env env name file))))))
19210
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
282 env))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
283
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
284 (defun elint-add-required-env (env name file)
104036
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
285 "Augment ENV with the variables defined by feature NAME in FILE."
19210
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
286 (condition-case nil
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
287 (let* ((libname (if (stringp file)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
288 file
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
289 (symbol-name name)))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
290
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
291 ;; First try to find .el files, then the raw name
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
292 (lib1 (locate-library (concat libname ".el") t))
104036
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
293 (lib (or lib1 (locate-library libname t))))
19210
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
294 ;; Clear the messages :-/
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
295 (message nil)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
296 (if lib
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
297 (save-excursion
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
298 (set-buffer (find-file-noselect lib))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
299 (elint-update-env)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
300 (setq env (elint-env-add-env env elint-buffer-env)))
104036
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
301 (error "Dummy error")))
19210
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
302 (error
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
303 (ding)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
304 (message "Can't get variables from require'd library %s" name)))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
305 env)
20014
2ecea967337d (elint-check-defcustom-form): New function.
Karl Heuer <kwzh@gnu.org>
parents: 19210
diff changeset
306
19210
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
307 (defvar elint-top-form nil
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
308 "The currently linted top form, or nil.")
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
309
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
310 (defvar elint-top-form-logged nil
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
311 "T if the currently linted top form has been mentioned in the log buffer.")
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
312
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
313 (defun elint-top-form (form)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
314 "Lint a top FORM."
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
315 (let ((elint-top-form form)
104036
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
316 (elint-top-form-logged nil)
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
317 (elint-current-pos (elint-top-form-pos form)))
19210
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
318 (elint-form (elint-top-form-form form) elint-buffer-env)))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
319
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
320 ;;;
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
321 ;;; General form linting functions
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
322 ;;;
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
323
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
324 (defconst elint-special-forms
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
325 '((let . elint-check-let-form)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
326 (let* . elint-check-let-form)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
327 (setq . elint-check-setq-form)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
328 (quote . elint-check-quote-form)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
329 (cond . elint-check-cond-form)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
330 (lambda . elint-check-defun-form)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
331 (function . elint-check-function-form)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
332 (setq-default . elint-check-setq-form)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
333 (defun . elint-check-defun-form)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
334 (defsubst . elint-check-defun-form)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
335 (defmacro . elint-check-defun-form)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
336 (defvar . elint-check-defvar-form)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
337 (defconst . elint-check-defvar-form)
20014
2ecea967337d (elint-check-defcustom-form): New function.
Karl Heuer <kwzh@gnu.org>
parents: 19210
diff changeset
338 (defcustom . elint-check-defcustom-form)
19210
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
339 (macro . elint-check-macro-form)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
340 (condition-case . elint-check-condition-case-form))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
341 "Functions to call when some special form should be linted.")
20014
2ecea967337d (elint-check-defcustom-form): New function.
Karl Heuer <kwzh@gnu.org>
parents: 19210
diff changeset
342
19210
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
343 (defun elint-form (form env)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
344 "Lint FORM in the environment ENV.
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
345 The environment created by the form is returned."
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
346 (cond
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
347 ((consp form)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
348 (let ((func (cdr (assq (car form) elint-special-forms))))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
349 (if func
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
350 ;; Special form
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
351 (funcall func form env)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
352
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
353 (let* ((func (car form))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
354 (args (elint-get-args func env))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
355 (argsok t))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
356 (cond
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
357 ((eq args 'undefined)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
358 (setq argsok nil)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
359 (elint-error "Call to undefined function: %s" form))
20014
2ecea967337d (elint-check-defcustom-form): New function.
Karl Heuer <kwzh@gnu.org>
parents: 19210
diff changeset
360
19210
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
361 ((eq args 'unknown) nil)
20014
2ecea967337d (elint-check-defcustom-form): New function.
Karl Heuer <kwzh@gnu.org>
parents: 19210
diff changeset
362
19210
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
363 (t (setq argsok (elint-match-args form args))))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
364
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
365 ;; Is this a macro?
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
366 (if (elint-env-macrop env func)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
367 ;; Macro defined in buffer, expand it
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
368 (if argsok
104036
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
369 ;; FIXME error if macro uses macro, eg bytecomp.el.
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
370 (condition-case nil
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
371 (elint-form
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
372 (macroexpand form (elint-env-macro-env env)) env)
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
373 (error
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
374 (elint-error "Elint failed to expand macro: %s" form)))
19210
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
375 env)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
376
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
377 (let ((fcode (if (symbolp func)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
378 (if (fboundp func)
104036
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
379 (indirect-function func))
19210
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
380 func)))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
381 (if (and (listp fcode) (eq (car fcode) 'macro))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
382 ;; Macro defined outside buffer
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
383 (if argsok
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
384 (elint-form (macroexpand form) env)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
385 env)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
386 ;; Function, lint its parameters
104036
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
387 (elint-forms (cdr form) env))))))))
19210
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
388 ((symbolp form)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
389 ;; :foo variables are quoted
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
390 (if (and (/= (aref (symbol-name form) 0) ?:)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
391 (elint-unbound-variable form env))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
392 (elint-warning "Reference to unbound symbol: %s" form))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
393 env)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
394
104036
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
395 (t env)))
19210
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
396
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
397 (defun elint-forms (forms env)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
398 "Lint the FORMS, accumulating an environment, starting with ENV."
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
399 ;; grumblegrumbletailrecursiongrumblegrumble
104036
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
400 (dolist (f forms env)
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
401 (setq env (elint-form f env))))
19210
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
402
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
403 (defun elint-unbound-variable (var env)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
404 "T if VAR is unbound in ENV."
104036
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
405 (not (or (memq var '(nil t))
19210
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
406 (elint-env-find-var env var)
104036
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
407 (memq var elint-builtin-variables)
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
408 (memq var elint-autoloaded-variables)
19210
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
409 (memq var elint-standard-variables))))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
410
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
411 ;;;
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
412 ;;; Function argument checking
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
413 ;;;
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
414
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
415 (defun elint-match-args (arglist argpattern)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
416 "Match ARGLIST against ARGPATTERN."
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
417 (let ((state 'all)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
418 (al (cdr arglist))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
419 (ap argpattern)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
420 (ok t))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
421 (while
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
422 (cond
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
423 ((and (null al) (null ap)) nil)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
424 ((eq (car ap) '&optional)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
425 (setq state 'optional)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
426 (setq ap (cdr ap))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
427 t)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
428 ((eq (car ap) '&rest)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
429 nil)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
430 ((or (and (eq state 'all) (or (null al) (null ap)))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
431 (and (eq state 'optional) (and al (null ap))))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
432 (elint-error "Wrong number of args: %s, %s" arglist argpattern)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
433 (setq ok nil)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
434 nil)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
435 ((and (eq state 'optional) (null al))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
436 nil)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
437 (t (setq al (cdr al)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
438 ap (cdr ap))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
439 t)))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
440 ok))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
441
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
442 (defun elint-get-args (func env)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
443 "Find the args of FUNC in ENV.
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
444 Returns `unknown' if we couldn't find arguments."
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
445 (let ((f (elint-env-find-func env func)))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
446 (if f
104036
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
447 (cadr f)
19210
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
448 (if (symbolp func)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
449 (if (fboundp func)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
450 (let ((fcode (indirect-function func)))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
451 (if (subrp fcode)
104036
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
452 ;; FIXME builtins with no args have args = nil.
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
453 (or (get func 'elint-args) 'unknown)
19210
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
454 (elint-find-args-in-code fcode)))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
455 'undefined)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
456 (elint-find-args-in-code func)))))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
457
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
458 (defun elint-find-args-in-code (code)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
459 "Extract the arguments from CODE.
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
460 CODE can be a lambda expression, a macro, or byte-compiled code."
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
461 (cond
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
462 ((byte-code-function-p code)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
463 (aref code 0))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
464 ((and (listp code) (eq (car code) 'lambda))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
465 (car (cdr code)))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
466 ((and (listp code) (eq (car code) 'macro))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
467 (elint-find-args-in-code (cdr code)))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
468 (t 'unknown)))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
469
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
470 ;;;
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
471 ;;; Functions to check some special forms
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
472 ;;;
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
473
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
474 (defun elint-check-cond-form (form env)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
475 "Lint a cond FORM in ENV."
104036
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
476 (dolist (f (cdr form) env)
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
477 (if (consp f)
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
478 (elint-forms f env)
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
479 (elint-error "cond clause should be a list: %s" f))))
19210
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
480
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
481 (defun elint-check-defun-form (form env)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
482 "Lint a defun/defmacro/lambda FORM in ENV."
104036
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
483 (setq form (if (eq (car form) 'lambda) (cdr form) (cddr form)))
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
484 (mapc (lambda (p)
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
485 (or (memq p '(&optional &rest))
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
486 (setq env (elint-env-add-var env p))))
84899
789f9201f375 (elint-current-buffer, elint-check-defun-form, elint-check-let-form,
Juanma Barranquero <lekktu@gmail.com>
parents: 78217
diff changeset
487 (car form))
19210
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
488 (elint-forms (cdr form) env))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
489
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
490 (defun elint-check-let-form (form env)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
491 "Lint the let/let* FORM in ENV."
104036
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
492 (let ((varlist (cadr form)))
19210
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
493 (if (not varlist)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
494 (progn
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
495 (elint-error "Missing varlist in let: %s" form)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
496 env)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
497 ;; Check for (let (a (car b)) ...) type of error
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
498 (if (and (= (length varlist) 2)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
499 (symbolp (car varlist))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
500 (listp (car (cdr varlist)))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
501 (fboundp (car (car (cdr varlist)))))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
502 (elint-warning "Suspect varlist: %s" form))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
503 ;; Add variables to environment, and check the init values
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
504 (let ((newenv env))
104036
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
505 (mapc (lambda (s)
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
506 (cond
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
507 ((symbolp s)
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
508 (setq newenv (elint-env-add-var newenv s)))
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
509 ((and (consp s) (<= (length s) 2))
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
510 (elint-form (cadr s)
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
511 (if (eq (car form) 'let)
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
512 env
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
513 newenv))
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
514 (setq newenv
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
515 (elint-env-add-var newenv (car s))))
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
516 (t (elint-error
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
517 "Malformed `let' declaration: %s" s))))
84899
789f9201f375 (elint-current-buffer, elint-check-defun-form, elint-check-let-form,
Juanma Barranquero <lekktu@gmail.com>
parents: 78217
diff changeset
518 varlist)
19210
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
519
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
520 ;; Lint the body forms
104036
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
521 (elint-forms (cddr form) newenv)))))
19210
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
522
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
523 (defun elint-check-setq-form (form env)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
524 "Lint the setq FORM in ENV."
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
525 (or (= (mod (length form) 2) 1)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
526 (elint-error "Missing value in setq: %s" form))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
527 (let ((newenv env)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
528 sym val)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
529 (setq form (cdr form))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
530 (while form
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
531 (setq sym (car form)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
532 val (car (cdr form))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
533 form (cdr (cdr form)))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
534 (if (symbolp sym)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
535 (if (elint-unbound-variable sym newenv)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
536 (elint-warning "Setting previously unbound symbol: %s" sym))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
537 (elint-error "Setting non-symbol in setq: %s" sym))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
538 (elint-form val newenv)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
539 (if (symbolp sym)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
540 (setq newenv (elint-env-add-var newenv sym))))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
541 newenv))
20014
2ecea967337d (elint-check-defcustom-form): New function.
Karl Heuer <kwzh@gnu.org>
parents: 19210
diff changeset
542
19210
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
543 (defun elint-check-defvar-form (form env)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
544 "Lint the defvar/defconst FORM in ENV."
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
545 (if (or (= (length form) 2)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
546 (= (length form) 3)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
547 (and (= (length form) 4) (stringp (nth 3 form))))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
548 (elint-env-add-global-var (elint-form (nth 2 form) env)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
549 (car (cdr form)))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
550 (elint-error "Malformed variable declaration: %s" form)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
551 env))
20014
2ecea967337d (elint-check-defcustom-form): New function.
Karl Heuer <kwzh@gnu.org>
parents: 19210
diff changeset
552
2ecea967337d (elint-check-defcustom-form): New function.
Karl Heuer <kwzh@gnu.org>
parents: 19210
diff changeset
553 (defun elint-check-defcustom-form (form env)
2ecea967337d (elint-check-defcustom-form): New function.
Karl Heuer <kwzh@gnu.org>
parents: 19210
diff changeset
554 "Lint the defcustom FORM in ENV."
2ecea967337d (elint-check-defcustom-form): New function.
Karl Heuer <kwzh@gnu.org>
parents: 19210
diff changeset
555 (if (and (> (length form) 3)
52880
9417a94488d3 (elint-check-defcustom-form): Don't use `evenp' so we don't implicitly
John Paul Wallington <jpw@pobox.com>
parents: 52401
diff changeset
556 ;; even no. of keyword/value args ?
9417a94488d3 (elint-check-defcustom-form): Don't use `evenp' so we don't implicitly
John Paul Wallington <jpw@pobox.com>
parents: 52401
diff changeset
557 (zerop (logand (length form) 1)))
20014
2ecea967337d (elint-check-defcustom-form): New function.
Karl Heuer <kwzh@gnu.org>
parents: 19210
diff changeset
558 (elint-env-add-global-var (elint-form (nth 2 form) env)
2ecea967337d (elint-check-defcustom-form): New function.
Karl Heuer <kwzh@gnu.org>
parents: 19210
diff changeset
559 (car (cdr form)))
2ecea967337d (elint-check-defcustom-form): New function.
Karl Heuer <kwzh@gnu.org>
parents: 19210
diff changeset
560 (elint-error "Malformed variable declaration: %s" form)
2ecea967337d (elint-check-defcustom-form): New function.
Karl Heuer <kwzh@gnu.org>
parents: 19210
diff changeset
561 env))
2ecea967337d (elint-check-defcustom-form): New function.
Karl Heuer <kwzh@gnu.org>
parents: 19210
diff changeset
562
19210
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
563 (defun elint-check-function-form (form env)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
564 "Lint the function FORM in ENV."
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
565 (let ((func (car (cdr-safe form))))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
566 (cond
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
567 ((symbolp func)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
568 (or (elint-env-find-func env func)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
569 (fboundp func)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
570 (elint-warning "Reference to undefined function: %s" form))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
571 env)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
572 ((and (consp func) (memq (car func) '(lambda macro)))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
573 (elint-form func env))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
574 ((stringp func) env)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
575 (t (elint-error "Not a function object: %s" form)
104036
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
576 env))))
19210
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
577
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
578 (defun elint-check-quote-form (form env)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
579 "Lint the quote FORM in ENV."
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
580 env)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
581
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
582 (defun elint-check-macro-form (form env)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
583 "Check the macro FORM in ENV."
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
584 (elint-check-function-form (list (car form) (cdr form)) env))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
585
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
586 (defun elint-check-condition-case-form (form env)
104036
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
587 "Check the `condition-case' FORM in ENV."
19210
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
588 (let ((resenv env))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
589 (if (< (length form) 3)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
590 (elint-error "Malformed condition-case: %s" form)
104036
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
591 (or (symbolp (cadr form))
19210
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
592 (elint-warning "First parameter should be a symbol: %s" form))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
593 (setq resenv (elint-form (nth 2 form) env))
104036
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
594 (let ((newenv (elint-env-add-var env (cadr form)))
19210
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
595 errlist)
104036
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
596 (dolist (err (nthcdr 3 form))
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
597 (setq errlist (car err))
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
598 (mapc (lambda (s)
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
599 (or (get s 'error-conditions)
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
600 (get s 'error-message)
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
601 (memq s elint-extra-errors)
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
602 (elint-warning
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
603 "Not an error symbol in error handler: %s" s)))
84899
789f9201f375 (elint-current-buffer, elint-check-defun-form, elint-check-let-form,
Juanma Barranquero <lekktu@gmail.com>
parents: 78217
diff changeset
604 (cond
104036
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
605 ((symbolp errlist) (list errlist))
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
606 ((listp errlist) errlist)
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
607 (t (elint-error "Bad error list in error handler: %s"
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
608 errlist)
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
609 nil)))
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
610 (elint-forms (cdr err) newenv))))
19210
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
611 resenv))
20014
2ecea967337d (elint-check-defcustom-form): New function.
Karl Heuer <kwzh@gnu.org>
parents: 19210
diff changeset
612
19210
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
613 ;;;
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
614 ;;; Message functions
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
615 ;;;
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
616
104036
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
617 (defvar elint-current-pos) ; dynamically bound in elint-top-form
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
618
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
619 (defun elint-log (type string args)
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
620 (elint-log-message (format "%s:%d:%s: %s"
104049
7fcfa9c429bd (elint-current-buffer, elint-defun):
Glenn Morris <rgm@gnu.org>
parents: 104036
diff changeset
621 (let ((f (buffer-file-name)))
7fcfa9c429bd (elint-current-buffer, elint-defun):
Glenn Morris <rgm@gnu.org>
parents: 104036
diff changeset
622 (if f
7fcfa9c429bd (elint-current-buffer, elint-defun):
Glenn Morris <rgm@gnu.org>
parents: 104036
diff changeset
623 (file-name-nondirectory f)
7fcfa9c429bd (elint-current-buffer, elint-defun):
Glenn Morris <rgm@gnu.org>
parents: 104036
diff changeset
624 (buffer-name)))
104036
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
625 (save-excursion
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
626 (goto-char elint-current-pos)
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
627 (1+ (count-lines (point-min)
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
628 (line-beginning-position))))
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
629 type
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
630 (apply 'format string args))))
19210
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
631
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
632 (defun elint-error (string &rest args)
47923
07d91c802db4 (elint-error, elint-warning): Fix typo.
Juanma Barranquero <lekktu@gmail.com>
parents: 42268
diff changeset
633 "Report a linting error.
19210
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
634 STRING and ARGS are thrown on `format' to get the message."
104036
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
635 (elint-log "Error" string args))
20014
2ecea967337d (elint-check-defcustom-form): New function.
Karl Heuer <kwzh@gnu.org>
parents: 19210
diff changeset
636
19210
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
637 (defun elint-warning (string &rest args)
47923
07d91c802db4 (elint-error, elint-warning): Fix typo.
Juanma Barranquero <lekktu@gmail.com>
parents: 42268
diff changeset
638 "Report a linting warning.
104036
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
639 See `elint-error'."
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
640 (elint-log "Warning" string args))
19210
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
641
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
642 (defun elint-log-message (errstr)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
643 "Insert ERRSTR last in the lint log buffer."
104036
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
644 (with-current-buffer (elint-get-log-buffer)
19210
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
645 (goto-char (point-max))
104036
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
646 (let ((inhibit-read-only t))
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
647 (or (bolp) (newline))
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
648 ;; Do we have to say where we are?
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
649 (unless elint-top-form-logged
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
650 (insert
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
651 (let* ((form (elint-top-form-form elint-top-form))
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
652 (top (car form)))
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
653 (cond
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
654 ((memq top '(defun defsubst))
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
655 (format "\nIn function %s:\n" (cadr form)))
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
656 ((eq top 'defmacro)
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
657 (format "\nIn macro %s:\n" (cadr form)))
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
658 ((memq top '(defvar defconst))
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
659 (format "\nIn variable %s:\n" (cadr form)))
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
660 (t "\nIn top level expression:\n"))))
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
661 (setq elint-top-form-logged t))
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
662 (insert errstr "\n"))))
19210
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
663
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
664 (defun elint-clear-log (&optional header)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
665 "Clear the lint log buffer.
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
666 Insert HEADER followed by a blank line if non-nil."
104036
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
667 (let ((dir default-directory))
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
668 (with-current-buffer (elint-get-log-buffer)
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
669 (setq default-directory dir)
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
670 (let ((inhibit-read-only t))
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
671 (erase-buffer)
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
672 (if header (insert header "\n"))))))
19210
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
673
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
674 (defun elint-display-log ()
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
675 "Display the lint log buffer."
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
676 (let ((pop-up-windows t))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
677 (display-buffer (elint-get-log-buffer))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
678 (sit-for 0)))
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
679
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
680 (defun elint-get-log-buffer ()
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
681 "Return a log buffer for elint."
104036
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
682 (or (get-buffer elint-log-buffer)
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
683 (with-current-buffer (get-buffer-create elint-log-buffer)
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
684 (or (eq major-mode 'compilation-mode)
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
685 (compilation-mode))
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
686 (setq buffer-undo-list t)
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
687 (current-buffer))))
20014
2ecea967337d (elint-check-defcustom-form): New function.
Karl Heuer <kwzh@gnu.org>
parents: 19210
diff changeset
688
19210
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
689 ;;;
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
690 ;;; Initializing code
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
691 ;;;
20014
2ecea967337d (elint-check-defcustom-form): New function.
Karl Heuer <kwzh@gnu.org>
parents: 19210
diff changeset
692
19210
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
693 ;;;###autoload
104049
7fcfa9c429bd (elint-current-buffer, elint-defun):
Glenn Morris <rgm@gnu.org>
parents: 104036
diff changeset
694 (defun elint-initialize (&optional reinit)
7fcfa9c429bd (elint-current-buffer, elint-defun):
Glenn Morris <rgm@gnu.org>
parents: 104036
diff changeset
695 "Initialize elint.
7fcfa9c429bd (elint-current-buffer, elint-defun):
Glenn Morris <rgm@gnu.org>
parents: 104036
diff changeset
696 If elint is already initialized, this does nothing, unless
7fcfa9c429bd (elint-current-buffer, elint-defun):
Glenn Morris <rgm@gnu.org>
parents: 104036
diff changeset
697 optional prefix argument REINIT is non-nil."
7fcfa9c429bd (elint-current-buffer, elint-defun):
Glenn Morris <rgm@gnu.org>
parents: 104036
diff changeset
698 (interactive "P")
7fcfa9c429bd (elint-current-buffer, elint-defun):
Glenn Morris <rgm@gnu.org>
parents: 104036
diff changeset
699 (if (and elint-builtin-variables (not reinit))
7fcfa9c429bd (elint-current-buffer, elint-defun):
Glenn Morris <rgm@gnu.org>
parents: 104036
diff changeset
700 (message "Elint is already initialized")
7fcfa9c429bd (elint-current-buffer, elint-defun):
Glenn Morris <rgm@gnu.org>
parents: 104036
diff changeset
701 (message "Initializing elint...")
7fcfa9c429bd (elint-current-buffer, elint-defun):
Glenn Morris <rgm@gnu.org>
parents: 104036
diff changeset
702 (setq elint-builtin-variables (elint-find-builtin-variables)
7fcfa9c429bd (elint-current-buffer, elint-defun):
Glenn Morris <rgm@gnu.org>
parents: 104036
diff changeset
703 elint-autoloaded-variables (elint-find-autoloaded-variables))
7fcfa9c429bd (elint-current-buffer, elint-defun):
Glenn Morris <rgm@gnu.org>
parents: 104036
diff changeset
704 (mapc (lambda (x) (or (not (symbolp (car x)))
7fcfa9c429bd (elint-current-buffer, elint-defun):
Glenn Morris <rgm@gnu.org>
parents: 104036
diff changeset
705 (eq (cdr x) 'unknown)
7fcfa9c429bd (elint-current-buffer, elint-defun):
Glenn Morris <rgm@gnu.org>
parents: 104036
diff changeset
706 (put (car x) 'elint-args (cdr x))))
7fcfa9c429bd (elint-current-buffer, elint-defun):
Glenn Morris <rgm@gnu.org>
parents: 104036
diff changeset
707 (elint-find-builtin-args))
7fcfa9c429bd (elint-current-buffer, elint-defun):
Glenn Morris <rgm@gnu.org>
parents: 104036
diff changeset
708 (if elint-unknown-builtin-args
7fcfa9c429bd (elint-current-buffer, elint-defun):
Glenn Morris <rgm@gnu.org>
parents: 104036
diff changeset
709 (mapc (lambda (x) (put (car x) 'elint-args (cdr x)))
7fcfa9c429bd (elint-current-buffer, elint-defun):
Glenn Morris <rgm@gnu.org>
parents: 104036
diff changeset
710 elint-unknown-builtin-args))
7fcfa9c429bd (elint-current-buffer, elint-defun):
Glenn Morris <rgm@gnu.org>
parents: 104036
diff changeset
711 (message "Initializing elint...done")))
104036
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
712
19210
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
713
104036
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
714 (defun elint-find-builtin-variables ()
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
715 "Return a list of all built-in variables."
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
716 ;; Cribbed from help-fns.el.
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
717 (let ((docbuf " *DOC*")
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
718 vars var)
104049
7fcfa9c429bd (elint-current-buffer, elint-defun):
Glenn Morris <rgm@gnu.org>
parents: 104036
diff changeset
719 (save-excursion
7fcfa9c429bd (elint-current-buffer, elint-defun):
Glenn Morris <rgm@gnu.org>
parents: 104036
diff changeset
720 (if (get-buffer docbuf)
7fcfa9c429bd (elint-current-buffer, elint-defun):
Glenn Morris <rgm@gnu.org>
parents: 104036
diff changeset
721 (progn
7fcfa9c429bd (elint-current-buffer, elint-defun):
Glenn Morris <rgm@gnu.org>
parents: 104036
diff changeset
722 (set-buffer docbuf)
7fcfa9c429bd (elint-current-buffer, elint-defun):
Glenn Morris <rgm@gnu.org>
parents: 104036
diff changeset
723 (goto-char (point-min)))
7fcfa9c429bd (elint-current-buffer, elint-defun):
Glenn Morris <rgm@gnu.org>
parents: 104036
diff changeset
724 (set-buffer (get-buffer-create docbuf))
7fcfa9c429bd (elint-current-buffer, elint-defun):
Glenn Morris <rgm@gnu.org>
parents: 104036
diff changeset
725 (insert-file-contents-literally
7fcfa9c429bd (elint-current-buffer, elint-defun):
Glenn Morris <rgm@gnu.org>
parents: 104036
diff changeset
726 (expand-file-name internal-doc-file-name doc-directory)))
7fcfa9c429bd (elint-current-buffer, elint-defun):
Glenn Morris <rgm@gnu.org>
parents: 104036
diff changeset
727 (while (search-forward "V" nil t)
7fcfa9c429bd (elint-current-buffer, elint-defun):
Glenn Morris <rgm@gnu.org>
parents: 104036
diff changeset
728 (and (setq var (intern-soft
7fcfa9c429bd (elint-current-buffer, elint-defun):
Glenn Morris <rgm@gnu.org>
parents: 104036
diff changeset
729 (buffer-substring (point) (line-end-position))))
7fcfa9c429bd (elint-current-buffer, elint-defun):
Glenn Morris <rgm@gnu.org>
parents: 104036
diff changeset
730 (boundp var)
7fcfa9c429bd (elint-current-buffer, elint-defun):
Glenn Morris <rgm@gnu.org>
parents: 104036
diff changeset
731 (setq vars (cons var vars))))
7fcfa9c429bd (elint-current-buffer, elint-defun):
Glenn Morris <rgm@gnu.org>
parents: 104036
diff changeset
732 vars)))
104036
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
733
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
734 (defun elint-find-autoloaded-variables ()
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
735 "Return a list of all autoloaded variables."
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
736 (let (var vars)
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
737 (with-temp-buffer
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
738 (insert-file-contents (locate-library "loaddefs.el"))
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
739 (while (re-search-forward "^(defvar \\([[:alnum:]_-]+\\)" nil t)
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
740 (and (setq var (intern-soft (match-string 1)))
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
741 (boundp var)
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
742 (setq vars (cons var vars)))))
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
743 vars))
19210
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
744
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
745 (defun elint-find-builtins ()
104036
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
746 "Return a list of all built-in functions."
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
747 (let (subrs)
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
748 (mapatoms (lambda (s) (and (fboundp s) (subrp (symbol-function s))
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
749 (setq subrs (cons s subrs)))))
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
750 subrs))
19210
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
751
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
752 (defun elint-find-builtin-args (&optional list)
104036
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
753 "Return a list of the built-in functions and their arguments.
19210
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
754 If LIST is nil, call `elint-find-builtins' to get a list of all built-in
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
755 functions, otherwise use LIST.
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
756
104036
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
757 Each function is represented by a cons cell:
19210
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
758 \(function-symbol . args)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
759 If no documentation could be found args will be `unknown'."
102230
5ae300b1d079 (elint-unknown-builtin-args): Fix encode-time spec. (Bug#2453)
Glenn Morris <rgm@gnu.org>
parents: 100908
diff changeset
760 (mapcar (lambda (f)
5ae300b1d079 (elint-unknown-builtin-args): Fix encode-time spec. (Bug#2453)
Glenn Morris <rgm@gnu.org>
parents: 100908
diff changeset
761 (let ((doc (documentation f t)))
5ae300b1d079 (elint-unknown-builtin-args): Fix encode-time spec. (Bug#2453)
Glenn Morris <rgm@gnu.org>
parents: 100908
diff changeset
762 (or (and doc
5ae300b1d079 (elint-unknown-builtin-args): Fix encode-time spec. (Bug#2453)
Glenn Morris <rgm@gnu.org>
parents: 100908
diff changeset
763 (string-match "\n\n(fn\\(.*)\\)\\'" doc)
5ae300b1d079 (elint-unknown-builtin-args): Fix encode-time spec. (Bug#2453)
Glenn Morris <rgm@gnu.org>
parents: 100908
diff changeset
764 (ignore-errors
104036
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
765 ;; "BODY...)" -> "&rest BODY)".
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
766 (read (replace-regexp-in-string
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
767 "\\([^ ]+\\)\\.\\.\\.)\\'" "&rest \\1)"
1a42628a650e (elint-standard-variables): Remove most members,
Glenn Morris <rgm@gnu.org>
parents: 102230
diff changeset
768 (format "(%s %s" f (match-string 1 doc)) t))))
102230
5ae300b1d079 (elint-unknown-builtin-args): Fix encode-time spec. (Bug#2453)
Glenn Morris <rgm@gnu.org>
parents: 100908
diff changeset
769 (cons f 'unknown))))
5ae300b1d079 (elint-unknown-builtin-args): Fix encode-time spec. (Bug#2453)
Glenn Morris <rgm@gnu.org>
parents: 100908
diff changeset
770 (or list (elint-find-builtins))))
19210
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
771
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
772 (provide 'elint)
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
773
93975
1e3a407766b9 Fix up comment convention on the arch-tag lines.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 87649
diff changeset
774 ;; arch-tag: b2f061e2-af84-4ddc-8e39-f5e969ac228f
19210
ad26cf3804c3 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
775 ;;; elint.el ends here