aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard M. Stallman2004-11-25 16:33:53 +0000
committerRichard M. Stallman2004-11-25 16:33:53 +0000
commit2aa13ec4e008ea45bcc342fdbeee375724426eaf (patch)
treec96f4a56ac9256b31211eb8a284bc9ccc931ffd6
parent1b43611263791754929581fade05f49c551a898b (diff)
downloademacs-2aa13ec4e008ea45bcc342fdbeee375724426eaf.tar.gz
emacs-2aa13ec4e008ea45bcc342fdbeee375724426eaf.zip
Much whitespace and capitalization change.
Move `provide' to end. Require `compile' only when compiling.
-rw-r--r--lisp/progmodes/flymake.el1912
1 files changed, 711 insertions, 1201 deletions
diff --git a/lisp/progmodes/flymake.el b/lisp/progmodes/flymake.el
index 737071203e0..13ecd1c367f 100644
--- a/lisp/progmodes/flymake.el
+++ b/lisp/progmodes/flymake.el
@@ -32,9 +32,6 @@
32 32
33;;; Code: 33;;; Code:
34 34
35;;;_* Provide
36(provide 'flymake)
37
38;;;; [[ Overlay compatibility 35;;;; [[ Overlay compatibility
39(autoload 'make-overlay "overlay" "Overlay compatibility kit." t) 36(autoload 'make-overlay "overlay" "Overlay compatibility kit." t)
40(autoload 'overlayp "overlay" "Overlay compatibility kit." t) 37(autoload 'overlayp "overlay" "Overlay compatibility kit." t)
@@ -91,6 +88,7 @@
91 splitted 88 splitted
92 ) 89 )
93) 90)
91
94(defun flymake-split-string(str pattern) 92(defun flymake-split-string(str pattern)
95 (cond 93 (cond
96 ((equal flymake-emacs 'xemacs) (flymake-split-string-remove-empty-edges str pattern)) 94 ((equal flymake-emacs 'xemacs) (flymake-split-string-remove-empty-edges str pattern))
@@ -101,23 +99,17 @@
101(defun flymake-get-temp-dir() 99(defun flymake-get-temp-dir()
102 (cond 100 (cond
103 ((equal flymake-emacs 'xemacs) (temp-directory)) 101 ((equal flymake-emacs 'xemacs) (temp-directory))
104 (t temporary-file-directory) 102 (t temporary-file-directory)))
105 )
106)
107 103
108(defun flymake-line-beginning-position() 104(defun flymake-line-beginning-position ()
109 (save-excursion 105 (save-excursion
110 (beginning-of-line) 106 (beginning-of-line)
111 (point) 107 (point)))
112 )
113)
114 108
115(defun flymake-line-end-position() 109(defun flymake-line-end-position ()
116 (save-excursion 110 (save-excursion
117 (end-of-line) 111 (end-of-line)
118 (point) 112 (point)))
119 )
120)
121 113
122(defun flymake-popup-menu(pos menu-data) 114(defun flymake-popup-menu(pos menu-data)
123 (cond 115 (cond
@@ -130,9 +122,7 @@
130 (popup-menu (flymake-make-xemacs-menu menu-data) (make-event 'button-press fake-event-props)) 122 (popup-menu (flymake-make-xemacs-menu menu-data) (make-event 'button-press fake-event-props))
131 ) 123 )
132 ) 124 )
133 (t (x-popup-menu pos (flymake-make-emacs-menu menu-data))) 125 (t (x-popup-menu pos (flymake-make-emacs-menu menu-data)))))
134 )
135)
136 126
137(defun flymake-make-emacs-menu(menu-data) 127(defun flymake-make-emacs-menu(menu-data)
138 (let* ((menu-title (nth 0 menu-data)) 128 (let* ((menu-title (nth 0 menu-data))
@@ -142,23 +132,18 @@
142 (setq menu-commands (mapcar (lambda (foo) 132 (setq menu-commands (mapcar (lambda (foo)
143 (cons (nth 0 foo) (nth 1 foo))) 133 (cons (nth 0 foo) (nth 1 foo)))
144 menu-items)) 134 menu-items))
145 (list menu-title (cons "" menu-commands)) 135 (list menu-title (cons "" menu-commands))))
146 )
147)
148 136
149(defun flymake-nop() 137(defun flymake-nop ())
150)
151 138
152(defun flymake-make-xemacs-menu(menu-data) 139(defun flymake-make-xemacs-menu (menu-data)
153 (let* ((menu-title (nth 0 menu-data)) 140 (let* ((menu-title (nth 0 menu-data))
154 (menu-items (nth 1 menu-data)) 141 (menu-items (nth 1 menu-data))
155 (menu-commands nil)) 142 (menu-commands nil))
156 (setq menu-commands (mapcar (lambda (foo) 143 (setq menu-commands (mapcar (lambda (foo)
157 (vector (nth 0 foo) (or (nth 1 foo) '(flymake-nop)) t)) 144 (vector (nth 0 foo) (or (nth 1 foo) '(flymake-nop)) t))
158 menu-items)) 145 menu-items))
159 (cons menu-title menu-commands) 146 (cons menu-title menu-commands)))
160 )
161)
162 147
163(defun flymake-xemacs-window-edges(&optional window) 148(defun flymake-xemacs-window-edges(&optional window)
164 (let ((edges (window-pixel-edges window)) 149 (let ((edges (window-pixel-edges window))
@@ -196,11 +181,10 @@
196 "Logging level, only messages with level > flymake-log-level will not be logged 181 "Logging level, only messages with level > flymake-log-level will not be logged
197-1 = NONE, 0 = ERROR, 1 = WARNING, 2 = INFO, 3 = DEBUG" 182-1 = NONE, 0 = ERROR, 1 = WARNING, 2 = INFO, 3 = DEBUG"
198 :group 'flymake 183 :group 'flymake
199 :type 'integer 184 :type 'integer)
200)
201 185
202(defun flymake-log(level text &rest args) 186(defun flymake-log (level text &rest args)
203 "Log a message with optional arguments" 187 "Log a message with optional arguments."
204 (if (<= level flymake-log-level) 188 (if (<= level flymake-log-level)
205 (let* ((msg (apply 'format text args))) 189 (let* ((msg (apply 'format text args)))
206 (message msg) 190 (message msg)
@@ -209,107 +193,85 @@
209 ; (insert "\n") 193 ; (insert "\n")
210 ; (flymake-save-buffer-in-file (current-buffer) "d:/flymake.log" t) ; make log file name customizable 194 ; (flymake-save-buffer-in-file (current-buffer) "d:/flymake.log" t) ; make log file name customizable
211 ;) 195 ;)
212 ) 196 )))
213 )
214)
215 197
216(defun flymake-ins-after(list pos val) 198(defun flymake-ins-after (list pos val)
217 "insert val into list after position pos" 199 "Insert VAL into LIST after position POS."
218 (let ((tmp (copy-sequence list))) ; (???) 200 (let ((tmp (copy-sequence list))) ; (???)
219 (setcdr (nthcdr pos tmp) (cons val (nthcdr (1+ pos) tmp))) 201 (setcdr (nthcdr pos tmp) (cons val (nthcdr (1+ pos) tmp)))
220 tmp 202 tmp))
221 )
222)
223 203
224(defun flymake-set-at(list pos val) 204(defun flymake-set-at (list pos val)
225 "set val at position pos in list" 205 "Set VAL at position POS in LIST"
226 (let ((tmp (copy-sequence list))) ; (???) 206 (let ((tmp (copy-sequence list))) ; (???)
227 (setcar (nthcdr pos tmp) val) 207 (setcar (nthcdr pos tmp) val)
228 tmp 208 tmp))
229 )
230)
231 209
232(defvar flymake-pid-to-names(flymake-makehash) 210(defvar flymake-pid-to-names (flymake-makehash)
233 "pid -> source buffer name, output file name mapping" 211 "pid -> source buffer name, output file name mapping.")
234)
235 212
236(defun flymake-reg-names(pid source-buffer-name) 213(defun flymake-reg-names (pid source-buffer-name)
237 "Save into in pid map" 214 "Save into in PID map."
238 (unless (stringp source-buffer-name) 215 (unless (stringp source-buffer-name)
239 (error "invalid buffer name") 216 (error "Invalid buffer name"))
240 ) 217 (puthash pid (list source-buffer-name) flymake-pid-to-names))
241 (puthash pid (list source-buffer-name) flymake-pid-to-names)
242)
243 218
244(defun flymake-get-source-buffer-name(pid) 219(defun flymake-get-source-buffer-name (pid)
245 "Return buffer name stored in pid map" 220 "Return buffer name stored in PID map."
246 (nth 0 (gethash pid flymake-pid-to-names)) 221 (nth 0 (gethash pid flymake-pid-to-names)))
247)
248 222
249(defun flymake-unreg-names(pid) 223(defun flymake-unreg-names (pid)
250 "Delete pid->buffer name mapping" 224 "Delete PID->buffer name mapping."
251 (remhash pid flymake-pid-to-names) 225 (remhash pid flymake-pid-to-names))
252)
253 226
254(defun flymake-get-buffer-var(buffer var-name) 227(defun flymake-get-buffer-var (buffer var-name)
255 "switch to buffer if necessary and return local variable var" 228 "Switch to BUFFER if necessary and return local variable VAR-NAME."
256 (unless (bufferp buffer) 229 (unless (bufferp buffer)
257 (error "invalid buffer") 230 (error "Invalid buffer"))
258 )
259 231
260 (if (eq buffer (current-buffer)) 232 (if (eq buffer (current-buffer))
261 (symbol-value var-name) 233 (symbol-value var-name)
262 ;else
263 (save-excursion 234 (save-excursion
264 (set-buffer buffer) 235 (set-buffer buffer)
265 (symbol-value var-name) 236 (symbol-value var-name))))
266 )
267 )
268)
269 237
270(defun flymake-set-buffer-var(buffer var-name var-value) 238(defun flymake-set-buffer-var (buffer var-name var-value)
271 "switch to buffer if necessary and set local variable var-name to var-value" 239 "Switch to BUFFER if necessary and set local variable VAR-NAME to VAR-VALUE."
272 (unless (bufferp buffer) 240 (unless (bufferp buffer)
273 (error "invalid buffer") 241 (error "Invalid buffer"))
274 )
275 242
276 (if (eq buffer (current-buffer)) 243 (if (eq buffer (current-buffer))
277 (set var-name var-value) 244 (set var-name var-value)
278 ;else
279 (save-excursion 245 (save-excursion
280 (set-buffer buffer) 246 (set-buffer buffer)
281 (set var-name var-value) 247 (set var-name var-value))))
282 ) 248
283 ) 249(defvar flymake-buffer-data (flymake-makehash)
284) 250 "Data specific to syntax check tool, in name-value pairs.")
285 251
286(defvar flymake-buffer-data(flymake-makehash)
287 "data specific to syntax check tool, in name-value pairs"
288)
289(make-variable-buffer-local 'flymake-buffer-data) 252(make-variable-buffer-local 'flymake-buffer-data)
290(defun flymake-get-buffer-data(buffer)
291 (flymake-get-buffer-var buffer 'flymake-buffer-data)
292)
293(defun flymake-set-buffer-data(buffer data)
294 (flymake-set-buffer-var buffer 'flymake-buffer-data data)
295)
296(defun flymake-get-buffer-value(buffer name)
297 (gethash name (flymake-get-buffer-data buffer))
298)
299(defun flymake-set-buffer-value(buffer name value)
300 (puthash name value (flymake-get-buffer-data buffer))
301)
302 253
303(defvar flymake-output-residual nil 254(defun flymake-get-buffer-data (buffer)
304 "" 255 (flymake-get-buffer-var buffer 'flymake-buffer-data))
305) 256
257(defun flymake-set-buffer-data (buffer data)
258 (flymake-set-buffer-var buffer 'flymake-buffer-data data))
259
260(defun flymake-get-buffer-value (buffer name)
261 (gethash name (flymake-get-buffer-data buffer)))
262
263(defun flymake-set-buffer-value (buffer name value)
264 (puthash name value (flymake-get-buffer-data buffer)))
265
266(defvar flymake-output-residual nil "")
267
306(make-variable-buffer-local 'flymake-output-residual) 268(make-variable-buffer-local 'flymake-output-residual)
307(defun flymake-get-buffer-output-residual(buffer) 269
308 (flymake-get-buffer-var buffer 'flymake-output-residual) 270(defun flymake-get-buffer-output-residual (buffer)
309) 271 (flymake-get-buffer-var buffer 'flymake-output-residual))
310(defun flymake-set-buffer-output-residual(buffer residual) 272
311 (flymake-set-buffer-var buffer 'flymake-output-residual residual) 273(defun flymake-set-buffer-output-residual (buffer residual)
312) 274 (flymake-set-buffer-var buffer 'flymake-output-residual residual))
313 275
314(defcustom flymake-allowed-file-name-masks '((".+\\.c$" flymake-simple-make-init flymake-simple-cleanup flymake-get-real-file-name) 276(defcustom flymake-allowed-file-name-masks '((".+\\.c$" flymake-simple-make-init flymake-simple-cleanup flymake-get-real-file-name)
315 (".+\\.cpp$" flymake-simple-make-init flymake-simple-cleanup flymake-get-real-file-name) 277 (".+\\.cpp$" flymake-simple-make-init flymake-simple-cleanup flymake-get-real-file-name)
@@ -332,176 +294,130 @@
332; ("[ \t]*\\input[ \t]*{\\(.*\\)\\(%s\\)}" 1 2 )) 294; ("[ \t]*\\input[ \t]*{\\(.*\\)\\(%s\\)}" 1 2 ))
333; (".+\\.tex$" 1) 295; (".+\\.tex$" 1)
334 ) 296 )
335 "*Files syntax checking is allowed for" 297 "*Files syntax checking is allowed for."
336 :group 'flymake 298 :group 'flymake
337 :type '(repeat (string symbol symbol symbol)) 299 :type '(repeat (string symbol symbol symbol)))
338)
339 300
340(defun flymake-get-file-name-mode-and-masks(file-name) 301(defun flymake-get-file-name-mode-and-masks (file-name)
341 "return the corresponding entry from flymake-allowed-file-name-masks" 302 "Return the corresponding entry from 'flymake-allowed-file-name-masks'."
342 (unless (stringp file-name) 303 (unless (stringp file-name)
343 (error "invalid file-name") 304 (error "Invalid file-name"))
344 )
345 (let ((count (length flymake-allowed-file-name-masks)) 305 (let ((count (length flymake-allowed-file-name-masks))
346 (idx 0) 306 (idx 0)
347 (mode-and-masks nil)) 307 (mode-and-masks nil))
348 (while (and (not mode-and-masks) (< idx count)) 308 (while (and (not mode-and-masks) (< idx count))
349 (if (string-match (nth 0 (nth idx flymake-allowed-file-name-masks)) file-name) 309 (if (string-match (nth 0 (nth idx flymake-allowed-file-name-masks)) file-name)
350 (setq mode-and-masks (cdr (nth idx flymake-allowed-file-name-masks))) 310 (setq mode-and-masks (cdr (nth idx flymake-allowed-file-name-masks))))
351 ) 311 (setq idx (1+ idx)))
352 (setq idx (1+ idx))
353 )
354 (flymake-log 3 "file %s, init=%s" file-name (car mode-and-masks)) 312 (flymake-log 3 "file %s, init=%s" file-name (car mode-and-masks))
355 mode-and-masks 313 mode-and-masks))
356 )
357)
358 314
359(defun flymake-can-syntax-check-file(file-name) 315(defun flymake-can-syntax-check-file (file-name)
360 "Determine whether we can syntax check file-name: nil if cannot, non-nil if can" 316 "Determine whether we can syntax check FILE-NAME.
361 (if (flymake-get-init-function file-name) 317Return nil if we cannot, non-nil if we can."
362 t 318 (if (flymake-get-init-function file-name) t nil))
363 ;else
364 nil
365 )
366)
367 319
368(defun flymake-get-init-function(file-name) 320(defun flymake-get-init-function (file-name)
369 "return init function to be used for the file" 321 "Return init function to be used for the file."
370 (let* ((init-f (nth 0 (flymake-get-file-name-mode-and-masks file-name)))) 322 (let* ((init-f (nth 0 (flymake-get-file-name-mode-and-masks file-name))))
371 ;(flymake-log 0 "calling %s" init-f) 323 ;(flymake-log 0 "calling %s" init-f)
372 ;(funcall init-f (current-buffer)) 324 ;(funcall init-f (current-buffer))
373 init-f 325 init-f))
374 )
375)
376 326
377(defun flymake-get-cleanup-function(file-name) 327(defun flymake-get-cleanup-function (file-name)
378 "return cleanup function to be used for the file" 328 "Return cleanup function to be used for the file."
379 (nth 1 (flymake-get-file-name-mode-and-masks file-name)) 329 (nth 1 (flymake-get-file-name-mode-and-masks file-name)))
380)
381 330
382(defun flymake-get-real-file-name-function(file-name) 331(defun flymake-get-real-file-name-function (file-name)
383 "" 332 (or (nth 2 (flymake-get-file-name-mode-and-masks file-name)) 'flymake-get-real-file-name))
384 (or (nth 2 (flymake-get-file-name-mode-and-masks file-name)) 'flymake-get-real-file-name)
385)
386 333
387(defcustom flymake-buildfile-dirs '("." ".." "../.." "../../.." "../../../.." "../../../../.." "../../../../../.." "../../../../../../.." "../../../../../../../.." "../../../../../../../../.." "../../../../../../../../../.." "../../../../../../../../../../..") 334(defcustom flymake-buildfile-dirs '("." ".." "../.." "../../.." "../../../.." "../../../../.." "../../../../../.." "../../../../../../.." "../../../../../../../.." "../../../../../../../../.." "../../../../../../../../../.." "../../../../../../../../../../..")
388 "dirs to look for buildfile" 335 "Dirs to look for buildfile."
389 :group 'flymake 336 :group 'flymake
390 :type '(repeat (string)) 337 :type '(repeat (string)))
391)
392 338
393(defvar flymake-find-buildfile-cache (flymake-makehash 'equal)) 339(defvar flymake-find-buildfile-cache (flymake-makehash 'equal))
394(defun flymake-get-buildfile-from-cache(dir-name)
395 (gethash dir-name flymake-find-buildfile-cache)
396)
397(defun flymake-add-buildfile-to-cache(dir-name buildfile)
398 (puthash dir-name buildfile flymake-find-buildfile-cache)
399)
400(defun flymake-clear-buildfile-cache()
401 (clrhash flymake-find-buildfile-cache)
402)
403 340
404(defun flymake-find-buildfile(buildfile-name source-dir-name dirs) 341(defun flymake-get-buildfile-from-cache (dir-name)
405 "find buildfile (i.e. Makefile, build.xml, etc.) starting from current directory. Return its path or nil if not found" 342 (gethash dir-name flymake-find-buildfile-cache))
343
344(defun flymake-add-buildfile-to-cache (dir-name buildfile)
345 (puthash dir-name buildfile flymake-find-buildfile-cache))
346
347(defun flymake-clear-buildfile-cache ()
348 (clrhash flymake-find-buildfile-cache))
349
350(defun flymake-find-buildfile (buildfile-name source-dir-name dirs)
351 "Find buildfile starting from current directory.
352Buildfile includes Makefile, build.xml etc.
353Return its path if found, or nil if not found."
406 (if (flymake-get-buildfile-from-cache source-dir-name) 354 (if (flymake-get-buildfile-from-cache source-dir-name)
407 (progn 355 (progn
408 (flymake-get-buildfile-from-cache source-dir-name) 356 (flymake-get-buildfile-from-cache source-dir-name))
409 )
410 ;else
411 (let* ((buildfile-dir nil) 357 (let* ((buildfile-dir nil)
412 (buildfile nil) 358 (buildfile nil)
413 (dir-count (length dirs)) 359 (dir-count (length dirs))
414 (dir-idx 0) 360 (dir-idx 0)
415 (found nil)) 361 (found nil))
416
417 (while (and (not found) (< dir-idx dir-count)) 362 (while (and (not found) (< dir-idx dir-count))
418
419 (setq buildfile-dir (concat source-dir-name (nth dir-idx dirs))) 363 (setq buildfile-dir (concat source-dir-name (nth dir-idx dirs)))
420 (setq buildfile (concat buildfile-dir "/" buildfile-name)) 364 (setq buildfile (concat buildfile-dir "/" buildfile-name))
421
422 (when (file-exists-p buildfile) 365 (when (file-exists-p buildfile)
423 (setq found t) 366 (setq found t))
424 ) 367 (setq dir-idx (1+ dir-idx)))
425
426 (setq dir-idx (1+ dir-idx))
427 )
428 (if found 368 (if found
429 (progn 369 (progn
430 (flymake-log 3 "found buildfile at %s/%s" buildfile-dir buildfile-name) 370 (flymake-log 3 "found buildfile at %s/%s" buildfile-dir buildfile-name)
431 (flymake-add-buildfile-to-cache source-dir-name buildfile-dir) 371 (flymake-add-buildfile-to-cache source-dir-name buildfile-dir)
432 buildfile-dir 372 buildfile-dir)
433 )
434 ;else
435 (progn 373 (progn
436 (flymake-log 3 "buildfile for %s not found" source-dir-name) 374 (flymake-log 3 "buildfile for %s not found" source-dir-name)
437 nil 375 nil)))))
438 )
439 )
440 )
441 )
442)
443 376
444(defun flymake-fix-path-name(name) 377(defun flymake-fix-path-name (name)
445 "replace all occurences of '\' with '/'" 378 "Replace all occurences of '\' with '/'."
446 (when name 379 (when name
447 (let* ((new-name (flymake-replace-regexp-in-string "[\\]" "/" (expand-file-name name))) 380 (let* ((new-name (flymake-replace-regexp-in-string "[\\]" "/" (expand-file-name name)))
448 (last-char (elt new-name (1- (length new-name))))) 381 (last-char (elt new-name (1- (length new-name)))))
449 (setq new-name (flymake-replace-regexp-in-string "\\./" "" new-name)) 382 (setq new-name (flymake-replace-regexp-in-string "\\./" "" new-name))
450 (if (equal "/" (char-to-string last-char)) 383 (if (equal "/" (char-to-string last-char))
451 (setq new-name (substring new-name 0 (1- (length new-name)))) 384 (setq new-name (substring new-name 0 (1- (length new-name)))))
452 ) 385 new-name)))
453 new-name
454 )
455 )
456)
457 386
458(defun flymake-same-files(file-name-one file-name-two) 387(defun flymake-same-files (file-name-one file-name-two)
459 "t if file-name-one and file-name-two actually point to the same file" 388 "Check if FILE-NAME-ONE and FILE-NAME-TWO point to same file.
460 (equal (flymake-fix-path-name file-name-one) (flymake-fix-path-name file-name-two)) 389Return t if so, nil if not."
461) 390 (equal (flymake-fix-path-name file-name-one) (flymake-fix-path-name file-name-two)))
462 391
463(defun flymake-ensure-ends-with-slash(path) 392(defun flymake-ensure-ends-with-slash (path)
464 (if (not (= (elt path (1- (length path))) (string-to-char "/"))) 393 (if (not (= (elt path (1- (length path))) (string-to-char "/")))
465 (concat path "/") 394 (concat path "/")
466 ;else 395 path))
467 path
468 )
469)
470 396
471(defun flymake-get-common-path-prefix(string-one string-two) 397(defun flymake-get-common-path-prefix (string-one string-two)
472 "return common prefix for two paths" 398 "Return common prefix for two paths STRING-ONE and STRING-TWO."
473 (when (and string-one string-two) 399 (when (and string-one string-two)
474 (let* ((slash-pos-one -1) 400 (let* ((slash-pos-one -1)
475 (slash-pos-two -1) 401 (slash-pos-two -1)
476 (done nil) 402 (done nil)
477 (prefix nil)) 403 (prefix nil))
478
479 (setq string-one (flymake-ensure-ends-with-slash string-one)) 404 (setq string-one (flymake-ensure-ends-with-slash string-one))
480 (setq string-two (flymake-ensure-ends-with-slash string-two)) 405 (setq string-two (flymake-ensure-ends-with-slash string-two))
481
482 (while (not done) 406 (while (not done)
483 (setq slash-pos-one (string-match "/" string-one (1+ slash-pos-one))) 407 (setq slash-pos-one (string-match "/" string-one (1+ slash-pos-one)))
484 (setq slash-pos-two (string-match "/" string-two (1+ slash-pos-two))) 408 (setq slash-pos-two (string-match "/" string-two (1+ slash-pos-two)))
485
486 (if (and slash-pos-one slash-pos-two 409 (if (and slash-pos-one slash-pos-two
487 (= slash-pos-one slash-pos-two) 410 (= slash-pos-one slash-pos-two)
488 (string= (substring string-one 0 slash-pos-one) (substring string-two 0 slash-pos-two))) 411 (string= (substring string-one 0 slash-pos-one) (substring string-two 0 slash-pos-two)))
489 (progn 412 (progn
490 (setq prefix (substring string-one 0 (1+ slash-pos-one))) 413 (setq prefix (substring string-one 0 (1+ slash-pos-one))))
491 ) 414 (setq done t)))
492 ;else 415 prefix)))
493 (setq done t)
494 )
495 )
496 prefix
497 )
498 )
499)
500 416
501(defun flymake-build-relative-path(from-dir to-dir) 417(defun flymake-build-relative-path (from-dir to-dir)
502 "return rel: from-dir/rel == to-dir" 418 "Return rel: FROM-DIR/rel == TO-DIR."
503 (if (not (equal (elt from-dir 0) (elt to-dir 0))) 419 (if (not (equal (elt from-dir 0) (elt to-dir 0)))
504 (error "first chars in paths %s, %s must be equal (same drive)" from-dir to-dir) 420 (error "First chars in paths %s, %s must be equal (same drive)" from-dir to-dir)
505 ;else 421 ;else
506 (let* ((from (flymake-ensure-ends-with-slash (flymake-fix-path-name from-dir))) 422 (let* ((from (flymake-ensure-ends-with-slash (flymake-fix-path-name from-dir)))
507 (to (flymake-ensure-ends-with-slash (flymake-fix-path-name to-dir))) 423 (to (flymake-ensure-ends-with-slash (flymake-fix-path-name to-dir)))
@@ -511,45 +427,36 @@
511 (to-suffix (substring to (length prefix))) 427 (to-suffix (substring to (length prefix)))
512 (idx 0) 428 (idx 0)
513 (rel nil)) 429 (rel nil))
514 430 (if (and (> (length to-suffix) 0) (equal "/" (char-to-string (elt to-suffix 0))))
515 (if (and (> (length to-suffix) 0) (equal "/" (char-to-string (elt to-suffix 0)))) 431 (setq to-suffix (substring to-suffix 1)))
516 (setq to-suffix (substring to-suffix 1))
517 )
518 432
519 (while (< idx up-count) 433 (while (< idx up-count)
520 (if (> (length rel) 0) 434 (if (> (length rel) 0)
521 (setq rel (concat rel "/")) 435 (setq rel (concat rel "/")))
522 )
523 (setq rel (concat rel "..")) 436 (setq rel (concat rel ".."))
524 (setq idx (1+ idx)) 437 (setq idx (1+ idx)))
525 )
526 (if (> (length rel) 0) 438 (if (> (length rel) 0)
527 (setq rel (concat rel "/")) 439 (setq rel (concat rel "/")))
528 )
529 (if (> (length to-suffix) 0) 440 (if (> (length to-suffix) 0)
530 (setq rel (concat rel to-suffix)) 441 (setq rel (concat rel to-suffix)))
531 ) 442 (or rel "./"))))
532
533 (or rel "./")
534 )
535 )
536)
537 443
538(defcustom flymake-master-file-dirs '("." "./src" "./UnitTest") 444(defcustom flymake-master-file-dirs '("." "./src" "./UnitTest")
539 "dirs where to llok for master files" 445 "Dirs where to llok for master files."
540 :group 'flymake 446 :group 'flymake
541 :type '(repeat (string)) 447 :type '(repeat (string)))
542)
543 448
544(defcustom flymake-master-file-count-limit 32 449(defcustom flymake-master-file-count-limit 32
545 "max number of master files to check" 450 "Max number of master files to check."
546 :group 'flymake 451 :group 'flymake
547 :type 'integer 452 :type 'integer)
548)
549 453
550(defun flymake-find-possible-master-files(file-name master-file-dirs masks) 454(defvar flymake-included-file-name nil " ") ; this is used to pass a parameter to a sort predicate below
551 "find (by name and location) all posible master files, which are .cpp and .c for and .h. 455
552Files are searched for starting from the .h directory and max max-level parent dirs. 456(defun flymake-find-possible-master-files (file-name master-file-dirs masks)
457 "Find (by name and location) all posible master files.
458Mater files are .cpp and .c for and .h. Files are searched for
459starting from the .h directory and max max-level parent dirs.
553File contents are not checked." 460File contents are not checked."
554 (let* ((dir-idx 0) 461 (let* ((dir-idx 0)
555 (dir-count (length master-file-dirs)) 462 (dir-count (length master-file-dirs))
@@ -572,53 +479,40 @@ File contents are not checked."
572 (setq files (cons (nth file-idx dir-files) files)) 479 (setq files (cons (nth file-idx dir-files) files))
573 (when (>= (length files) flymake-master-file-count-limit) 480 (when (>= (length files) flymake-master-file-count-limit)
574 (flymake-log 3 "master file count limit (%d) reached" flymake-master-file-count-limit) 481 (flymake-log 3 "master file count limit (%d) reached" flymake-master-file-count-limit)
575 (setq done t) 482 (setq done t)))
576 ) 483 (setq file-idx (1+ file-idx))))
577 ) 484 (setq masks-idx (1+ masks-idx))))
578 (setq file-idx (1+ file-idx)) 485 (setq dir-idx (1+ dir-idx)))
579 )
580 )
581 (setq masks-idx (1+ masks-idx))
582 )
583 )
584 (setq dir-idx (1+ dir-idx))
585 )
586 (when files 486 (when files
587 (setq flymake-included-file-name (file-name-nondirectory file-name)) 487 (setq flymake-included-file-name (file-name-nondirectory file-name))
588 (setq files (sort files 'flymake-master-file-compare)) 488 (setq files (sort files 'flymake-master-file-compare))
589 (setq flymake-included-file-name nil) 489 (setq flymake-included-file-name nil))
590 )
591 (flymake-log 3 "found %d possible master file(s)" (length files)) 490 (flymake-log 3 "found %d possible master file(s)" (length files))
592 files 491 files))
593 )
594)
595
596(defvar flymake-included-file-name nil ; this is used to pass a parameter to a sort predicate below
597 ""
598)
599 492
600(defun flymake-master-file-compare(file-one file-two) 493(defun flymake-master-file-compare (file-one file-two)
601 "used in sort to move most possible file names to the beginning of the list (File.h -> File.cpp moved to top" 494 "Compare two files speccified by FILE-ONE and FILE-TWO.
495This function is used in sort to move most possible file names
496to the beginning of the list (File.h -> File.cpp moved to top."
602 (and (equal (file-name-sans-extension flymake-included-file-name) 497 (and (equal (file-name-sans-extension flymake-included-file-name)
603 (file-name-sans-extension (file-name-nondirectory file-one))) 498 (file-name-sans-extension (file-name-nondirectory file-one)))
604 (not (equal file-one file-two)) 499 (not (equal file-one file-two))))
605 )
606)
607 500
608(defcustom flymake-check-file-limit 8192 501(defcustom flymake-check-file-limit 8192
609 "max number of chars to look at when checking possible master file" 502 "Max number of chars to look at when checking possible master file."
610 :group 'flymake 503 :group 'flymake
611 :type 'integer 504 :type 'integer)
612)
613 505
614(defun flymake-check-patch-master-file-buffer(master-file-temp-buffer 506(defun flymake-check-patch-master-file-buffer (master-file-temp-buffer
615 master-file-name patched-master-file-name 507 master-file-name patched-master-file-name
616 source-file-name patched-source-file-name 508 source-file-name patched-source-file-name
617 include-dirs regexp-list) 509 include-dirs regexp-list)
618 "check whether master-file-name is indeed a master file for source-file-name. 510 "Check if MASTER-FILE-NAME is a master file for SOURCE-FILE-NAME.
619For .cpp master file this means it includes source-file-name (.h). 511For .cpp master file this means it includes SOURCE-FILE-NAME (.h).
620If yes, patch a copy of master-file-name to include patched-source-file-name instead of source-file-name. 512If yes, patch a copy of MASTER-FILE-NAME to include PATCHED-SOURCE-FILE-NAME
621Whenether a buffer for master-file-name exists, use it as a source instead of reading master file from disk" 513instead of SOURCE-FILE-NAME.
514Whether a buffer for MATER-FILE-NAME exists, use it as a source
515instead of reading master file from disk."
622 (let* ((found nil) 516 (let* ((found nil)
623 (regexp (format (nth 0 regexp-list) ; "[ \t]*#[ \t]*include[ \t]*\"\\([\w0-9/\\_\.]*[/\\]*\\)\\(%s\\)\"" 517 (regexp (format (nth 0 regexp-list) ; "[ \t]*#[ \t]*include[ \t]*\"\\([\w0-9/\\_\.]*[/\\]*\\)\\(%s\\)\""
624 (file-name-nondirectory source-file-name))) 518 (file-name-nondirectory source-file-name)))
@@ -632,8 +526,7 @@ Whenether a buffer for master-file-name exists, use it as a source instead of re
632 (progn 526 (progn
633 (set-buffer master-file-temp-buffer) 527 (set-buffer master-file-temp-buffer)
634 (when (> search-limit (point-max)) 528 (when (> search-limit (point-max))
635 (setq search-limit (point-max)) 529 (setq search-limit (point-max)))
636 )
637 (flymake-log 3 "checking %s against regexp %s" master-file-name regexp) 530 (flymake-log 3 "checking %s against regexp %s" master-file-name regexp)
638 (goto-char (point-min)) 531 (goto-char (point-min))
639 (while (and (< (point) search-limit) (re-search-forward regexp search-limit t)) 532 (while (and (< (point) search-limit) (re-search-forward regexp search-limit t))
@@ -650,50 +543,34 @@ Whenether a buffer for master-file-name exists, use it as a source instead of re
650 ; replace-match is not used here as it fails in xemacs with 543 ; replace-match is not used here as it fails in xemacs with
651 ; 'last match not a buffer' error as check-includes calls replace-in-string 544 ; 'last match not a buffer' error as check-includes calls replace-in-string
652 (flymake-replace-region (current-buffer) match-beg match-end 545 (flymake-replace-region (current-buffer) match-beg match-end
653 (file-name-nondirectory patched-source-file-name)) 546 (file-name-nondirectory patched-source-file-name))))
654 ) 547 (forward-line 1)))
655 )
656 (forward-line 1)
657 )
658 )
659 (when found 548 (when found
660 (flymake-save-buffer-in-file (current-buffer) patched-master-file-name) 549 (flymake-save-buffer-in-file (current-buffer) patched-master-file-name)))
661 )
662 )
663 ;+(flymake-log 3 "killing buffer %s" (buffer-name master-file-temp-buffer)) 550 ;+(flymake-log 3 "killing buffer %s" (buffer-name master-file-temp-buffer))
664 (kill-buffer master-file-temp-buffer) 551 (kill-buffer master-file-temp-buffer)))
665 )
666 )
667 ;+(flymake-log 3 "check-patch master file %s: %s" master-file-name found) 552 ;+(flymake-log 3 "check-patch master file %s: %s" master-file-name found)
668 (when found 553 (when found
669 (flymake-log 2 "found master file %s" master-file-name) 554 (flymake-log 2 "found master file %s" master-file-name))
670 ) 555 found))
671 found
672 )
673)
674 556
675(defun flymake-replace-region(buffer beg end rep) 557(defun flymake-replace-region (buffer beg end rep)
676 "replace text in buffer in region (beg; end) with rep" 558 "Replace text in BUFFER in region (BEG END) with REP."
677 (save-excursion 559 (save-excursion
678 (delete-region beg end) 560 (delete-region beg end)
679 (goto-char beg) 561 (goto-char beg)
680 (insert rep) 562 (insert rep)))
681 )
682)
683 563
684(defun flymake-read-file-to-temp-buffer(file-name) 564(defun flymake-read-file-to-temp-buffer (file-name)
685 "isert contents of file-name into newly created temp buffer" 565 "Insert contents of FILE-NAME into newly created temp buffer."
686 (let* ((temp-buffer (get-buffer-create (generate-new-buffer-name (concat "flymake:" (file-name-nondirectory file-name)))))) 566 (let* ((temp-buffer (get-buffer-create (generate-new-buffer-name (concat "flymake:" (file-name-nondirectory file-name))))))
687 (save-excursion 567 (save-excursion
688 (set-buffer temp-buffer) 568 (set-buffer temp-buffer)
689 (insert-file-contents file-name) 569 (insert-file-contents file-name))
690 ) 570 temp-buffer))
691 temp-buffer
692 )
693)
694 571
695(defun flymake-copy-buffer-to-temp-buffer(buffer) 572(defun flymake-copy-buffer-to-temp-buffer (buffer)
696 "copy contents of buffer into newly created temp buffer" 573 "Copy contents of BUFFER into newly created temp buffer."
697 (let ((contents nil) 574 (let ((contents nil)
698 (temp-buffer nil)) 575 (temp-buffer nil))
699 (save-excursion 576 (save-excursion
@@ -702,17 +579,14 @@ Whenether a buffer for master-file-name exists, use it as a source instead of re
702 579
703 (setq temp-buffer (get-buffer-create (generate-new-buffer-name (concat "flymake:" (buffer-name buffer))))) 580 (setq temp-buffer (get-buffer-create (generate-new-buffer-name (concat "flymake:" (buffer-name buffer)))))
704 (set-buffer temp-buffer) 581 (set-buffer temp-buffer)
705 (insert contents) 582 (insert contents))
706 ) 583 temp-buffer))
707 temp-buffer
708 )
709)
710 584
711(defun flymake-check-include(source-file-name inc-path inc-name include-dirs) 585(defun flymake-check-include (source-file-name inc-path inc-name include-dirs)
712 "t if source-file-name is the one found via include dirs using inc-path and inc-name" 586 "Check if SOURCE-FILE-NAME can be found in include path.
587Return t if it can be found via include path using INC-PATH and INC-NAME."
713 (if (file-name-absolute-p inc-path) 588 (if (file-name-absolute-p inc-path)
714 (flymake-same-files source-file-name (concat inc-path "/" inc-name)) 589 (flymake-same-files source-file-name (concat inc-path "/" inc-name))
715 ;else
716 (let* ((count (length include-dirs)) 590 (let* ((count (length include-dirs))
717 (idx 0) 591 (idx 0)
718 (file-name nil) 592 (file-name nil)
@@ -720,30 +594,23 @@ Whenether a buffer for master-file-name exists, use it as a source instead of re
720 (while (and (not found) (< idx count)) 594 (while (and (not found) (< idx count))
721 (setq file-name (concat (file-name-directory source-file-name) "/" (nth idx include-dirs))) 595 (setq file-name (concat (file-name-directory source-file-name) "/" (nth idx include-dirs)))
722 (if (> (length inc-path) 0) 596 (if (> (length inc-path) 0)
723 (setq file-name (concat file-name "/" inc-path)) 597 (setq file-name (concat file-name "/" inc-path)))
724 )
725 (setq file-name (concat file-name "/" inc-name)) 598 (setq file-name (concat file-name "/" inc-name))
726 (when (flymake-same-files source-file-name file-name) 599 (when (flymake-same-files source-file-name file-name)
727 (setq found t) 600 (setq found t))
728 ) 601 (setq idx (1+ idx)))
729 (setq idx (1+ idx)) 602 found)))
730 )
731 found
732 )
733 )
734)
735 603
736(defun flymake-find-buffer-for-file(file-name) 604(defun flymake-find-buffer-for-file (file-name)
737 "buffer if there exists a buffer visiting file-name, nil otherwise" 605 "Check if there exists a buffer visiting FILE-NAME.
606Return t if so, nil if not."
738 (let ((buffer-name (get-file-buffer file-name))) 607 (let ((buffer-name (get-file-buffer file-name)))
739 (if buffer-name 608 (if buffer-name
740 (get-buffer buffer-name) 609 (get-buffer buffer-name))))
741 )
742 )
743)
744 610
745(defun flymake-create-master-file(source-file-name patched-source-file-name get-incl-dirs-f create-temp-f masks include-regexp-list) 611(defun flymake-create-master-file (source-file-name patched-source-file-name get-incl-dirs-f create-temp-f masks include-regexp-list)
746 "save source-file-name with a different name, find master file, patch it and save it to." 612 "Save SOURCE-FILE-NAME with a different name.
613Find master file, patch and save it."
747 (let* ((possible-master-files (flymake-find-possible-master-files source-file-name flymake-master-file-dirs masks)) 614 (let* ((possible-master-files (flymake-find-possible-master-files source-file-name flymake-master-file-dirs masks))
748 (master-file-count (length possible-master-files)) 615 (master-file-count (length possible-master-files))
749 (idx 0) 616 (idx 0)
@@ -757,9 +624,7 @@ Whenether a buffer for master-file-name exists, use it as a source instead of re
757 (setq patched-master-file-name (funcall create-temp-f master-file-name "flymake_master")) 624 (setq patched-master-file-name (funcall create-temp-f master-file-name "flymake_master"))
758 (if (flymake-find-buffer-for-file master-file-name) 625 (if (flymake-find-buffer-for-file master-file-name)
759 (setq temp-buffer (flymake-copy-buffer-to-temp-buffer (flymake-find-buffer-for-file master-file-name))) 626 (setq temp-buffer (flymake-copy-buffer-to-temp-buffer (flymake-find-buffer-for-file master-file-name)))
760 ;else 627 (setq temp-buffer (flymake-read-file-to-temp-buffer master-file-name)))
761 (setq temp-buffer (flymake-read-file-to-temp-buffer master-file-name))
762 )
763 (setq found 628 (setq found
764 (flymake-check-patch-master-file-buffer 629 (flymake-check-patch-master-file-buffer
765 temp-buffer 630 temp-buffer
@@ -769,62 +634,47 @@ Whenether a buffer for master-file-name exists, use it as a source instead of re
769 patched-source-file-name 634 patched-source-file-name
770 (funcall get-incl-dirs-f (file-name-directory master-file-name)) 635 (funcall get-incl-dirs-f (file-name-directory master-file-name))
771 include-regexp-list)) 636 include-regexp-list))
772 (setq idx (1+ idx)) 637 (setq idx (1+ idx)))
773 )
774 (if found 638 (if found
775 (list master-file-name patched-master-file-name) 639 (list master-file-name patched-master-file-name)
776 ;else
777 (progn 640 (progn
778 (flymake-log 3 "none of %d master file(s) checked includes %s" master-file-count 641 (flymake-log 3 "none of %d master file(s) checked includes %s" master-file-count
779 (file-name-nondirectory source-file-name)) 642 (file-name-nondirectory source-file-name))
780 nil 643 nil))))
781 )
782 )
783 )
784)
785 644
786(defun flymake-save-buffer-in-file(buffer file-name) 645(defun flymake-save-buffer-in-file (buffer file-name)
787 (or buffer 646 (or buffer
788 (error "invalid buffer") 647 (error "Invalid buffer"))
789 )
790 (save-excursion 648 (save-excursion
791 (save-restriction 649 (save-restriction
792 (set-buffer buffer) 650 (set-buffer buffer)
793 (widen) 651 (widen)
794 (make-directory (file-name-directory file-name) 1) 652 (make-directory (file-name-directory file-name) 1)
795 (write-region (point-min) (point-max) file-name nil 566) 653 (write-region (point-min) (point-max) file-name nil 566)))
796 ) 654 (flymake-log 3 "saved buffer %s in file %s" (buffer-name buffer) file-name))
797 )
798 (flymake-log 3 "saved buffer %s in file %s" (buffer-name buffer) file-name)
799)
800 655
801(defun flymake-save-string-to-file(file-name data) 656(defun flymake-save-string-to-file (file-name data)
802 "save string data to file file-name" 657 "Save string DATA to file FILE-NAME."
803 (write-region data nil file-name nil 566) 658 (write-region data nil file-name nil 566))
804)
805 659
806(defun flymake-read-file-to-string(file-name) 660(defun flymake-read-file-to-string (file-name)
807 "read file contents and return them as a string" 661 "Read contents of file FILE-NAME and return as a string."
808 (with-temp-buffer 662 (with-temp-buffer
809 (insert-file-contents file-name) 663 (insert-file-contents file-name)
810 (buffer-substring (point-min) (point-max)) 664 (buffer-substring (point-min) (point-max))))
811 )
812)
813 665
814(defun flymake-process-filter(process output) 666(defun flymake-process-filter (process output)
815 "flymake process filter: parse output, highlight err lines" 667 "Parse OUTPUT and highlight error lines.
668It's flymake process filter."
816 (let* ((pid (process-id process)) 669 (let* ((pid (process-id process))
817 (source-buffer (get-buffer (flymake-get-source-buffer-name pid)))) 670 (source-buffer (get-buffer (flymake-get-source-buffer-name pid))))
818 671
819 (flymake-log 3 "received %d byte(s) of output from process %d" (length output) pid) 672 (flymake-log 3 "received %d byte(s) of output from process %d" (length output) pid)
820 (when source-buffer 673 (when source-buffer
821 (flymake-parse-output-and-residual source-buffer output) 674 (flymake-parse-output-and-residual source-buffer output))))
822 )
823 )
824)
825 675
826(defun flymake-process-sentinel(process event) 676(defun flymake-process-sentinel (process event)
827 "Sentinel for syntax check buffers" 677 "Sentinel for syntax check buffers."
828 (if (memq (process-status process) '(signal exit)) 678 (if (memq (process-status process) '(signal exit))
829 (let*((exit-status (process-exit-status process)) 679 (let*((exit-status (process-exit-status process))
830 (command (process-command process)) 680 (command (process-command process))
@@ -847,24 +697,14 @@ Whenether a buffer for master-file-name exists, use it as a source instead of re
847 697
848 (flymake-parse-residual source-buffer) 698 (flymake-parse-residual source-buffer)
849 (flymake-post-syntax-check source-buffer exit-status command) 699 (flymake-post-syntax-check source-buffer exit-status command)
850 (flymake-set-buffer-is-running source-buffer nil) 700 (flymake-set-buffer-is-running source-buffer nil))))
851 )
852 )
853 )
854 (error 701 (error
855 (let ((err-str (format "Error in process sentinel for buffer %s: %s" 702 (let ((err-str (format "Error in process sentinel for buffer %s: %s"
856 source-buffer (error-message-string err)))) 703 source-buffer (error-message-string err))))
857 (flymake-log 0 err-str) 704 (flymake-log 0 err-str)
858 (flymake-set-buffer-is-running source-buffer nil) 705 (flymake-set-buffer-is-running source-buffer nil)))))))
859 )
860 )
861 )
862 )
863 )
864)
865 706
866(defun flymake-post-syntax-check(source-buffer exit-status command) 707(defun flymake-post-syntax-check (source-buffer exit-status command)
867 ""
868 (flymake-set-buffer-err-info source-buffer (flymake-get-buffer-new-err-info source-buffer)) 708 (flymake-set-buffer-err-info source-buffer (flymake-get-buffer-new-err-info source-buffer))
869 (flymake-set-buffer-new-err-info source-buffer nil) 709 (flymake-set-buffer-new-err-info source-buffer nil)
870 710
@@ -885,22 +725,14 @@ Whenether a buffer for master-file-name exists, use it as a source instead of re
885 (if (and (equal 0 err-count) (equal 0 warn-count)) 725 (if (and (equal 0 err-count) (equal 0 warn-count))
886 (if (equal 0 exit-status) 726 (if (equal 0 exit-status)
887 (flymake-report-status source-buffer "" "") ; PASSED 727 (flymake-report-status source-buffer "" "") ; PASSED
888 ;else
889 (if (not (flymake-get-buffer-check-was-interrupted source-buffer)) 728 (if (not (flymake-get-buffer-check-was-interrupted source-buffer))
890 (flymake-report-fatal-status (current-buffer) "CFGERR" 729 (flymake-report-fatal-status (current-buffer) "CFGERR"
891 (format "Configuration error has occured while running %s" command)) 730 (format "Configuration error has occured while running %s" command))
892 ;else 731 (flymake-report-status source-buffer nil ""))) ; "STOPPED"
893 (flymake-report-status source-buffer nil "") ; "STOPPED" 732 (flymake-report-status source-buffer (format "%d/%d" err-count warn-count) ""))))
894 )
895 )
896 ;else
897 (flymake-report-status source-buffer (format "%d/%d" err-count warn-count) "")
898 )
899 )
900)
901 733
902(defun flymake-parse-output-and-residual(source-buffer output) 734(defun flymake-parse-output-and-residual (source-buffer output)
903 "split output into lines, merge in residual if necessary" 735 "Split OUTPUT into lines, merge in residual if necessary."
904 (save-excursion 736 (save-excursion
905 (set-buffer source-buffer) 737 (set-buffer source-buffer)
906 (let* ((buffer-residual (flymake-get-buffer-output-residual source-buffer)) 738 (let* ((buffer-residual (flymake-get-buffer-output-residual source-buffer))
@@ -912,13 +744,10 @@ Whenether a buffer for master-file-name exists, use it as a source instead of re
912 (flymake-set-buffer-output-residual source-buffer new-residual) 744 (flymake-set-buffer-output-residual source-buffer new-residual)
913 (flymake-set-buffer-new-err-info source-buffer (flymake-parse-err-lines 745 (flymake-set-buffer-new-err-info source-buffer (flymake-parse-err-lines
914 (flymake-get-buffer-new-err-info source-buffer) 746 (flymake-get-buffer-new-err-info source-buffer)
915 source-buffer lines)) 747 source-buffer lines)))))
916 )
917 )
918)
919 748
920(defun flymake-parse-residual(source-buffer) 749(defun flymake-parse-residual (source-buffer)
921 "parse residual if it's non empty" 750 "Parse residual if it's non empty."
922 (save-excursion 751 (save-excursion
923 (set-buffer source-buffer) 752 (set-buffer source-buffer)
924 (when (flymake-get-buffer-output-residual source-buffer) 753 (when (flymake-get-buffer-output-residual source-buffer)
@@ -926,114 +755,108 @@ Whenether a buffer for master-file-name exists, use it as a source instead of re
926 (flymake-get-buffer-new-err-info source-buffer) 755 (flymake-get-buffer-new-err-info source-buffer)
927 source-buffer 756 source-buffer
928 (list (flymake-get-buffer-output-residual source-buffer)))) 757 (list (flymake-get-buffer-output-residual source-buffer))))
929 (flymake-set-buffer-output-residual source-buffer nil) 758 (flymake-set-buffer-output-residual source-buffer nil))))
930 )
931 )
932)
933 759
934(defvar flymake-err-info nil 760(defvar flymake-err-info nil
935 "sorted list of line numbers and lists of err info in the form (file, err-text)." 761 "Sorted list of line numbers and lists of err info in the form (file, err-text).")
936) 762
937(make-variable-buffer-local 'flymake-err-info) 763(make-variable-buffer-local 'flymake-err-info)
938(defun flymake-get-buffer-err-info(buffer) 764
939 (flymake-get-buffer-var buffer 'flymake-err-info) 765(defun flymake-get-buffer-err-info (buffer)
940) 766 (flymake-get-buffer-var buffer 'flymake-err-info))
941(defun flymake-set-buffer-err-info(buffer err-info) 767
942 (flymake-set-buffer-var buffer 'flymake-err-info err-info) 768(defun flymake-set-buffer-err-info (buffer err-info)
943) 769 (flymake-set-buffer-var buffer 'flymake-err-info err-info))
944(defun flymake-er-make-er(line-no line-err-info-list) 770
945 (list line-no line-err-info-list) 771(defun flymake-er-make-er (line-no line-err-info-list)
946) 772 (list line-no line-err-info-list))
947(defun flymake-er-get-line(err-info) 773
948 (nth 0 err-info) 774(defun flymake-er-get-line (err-info)
949) 775 (nth 0 err-info))
950(defun flymake-er-get-line-err-info-list(err-info) 776
951 (nth 1 err-info) 777(defun flymake-er-get-line-err-info-list (err-info)
952) 778 (nth 1 err-info))
953 779
954(defvar flymake-new-err-info nil 780(defvar flymake-new-err-info nil
955 "the same as flymake -err-info, effective when a syntax check is in progress" 781 "Same as 'flymake-err-info', effective when a syntax check is in progress.")
956) 782
957(make-variable-buffer-local 'flymake-new-err-info) 783(make-variable-buffer-local 'flymake-new-err-info)
958(defun flymake-get-buffer-new-err-info(buffer) 784
959 (flymake-get-buffer-var buffer 'flymake-new-err-info) 785(defun flymake-get-buffer-new-err-info (buffer)
960) 786 (flymake-get-buffer-var buffer 'flymake-new-err-info))
961(defun flymake-set-buffer-new-err-info(buffer new-err-info) 787
962 (flymake-set-buffer-var buffer 'flymake-new-err-info new-err-info) 788(defun flymake-set-buffer-new-err-info (buffer new-err-info)
963) 789 (flymake-set-buffer-var buffer 'flymake-new-err-info new-err-info))
964 790
965;; getters/setters for line-err-info: (file, line, type, text). 791;; getters/setters for line-err-info: (file, line, type, text).
966(defun flymake-ler-make-ler(file line type text &optional full-file) 792(defun flymake-ler-make-ler (file line type text &optional full-file)
967 (list file line type text full-file) 793 (list file line type text full-file))
968) 794
969(defun flymake-ler-get-file(line-err-info) 795(defun flymake-ler-get-file (line-err-info)
970 (nth 0 line-err-info) 796 (nth 0 line-err-info))
971) 797
972(defun flymake-ler-get-line(line-err-info) 798(defun flymake-ler-get-line (line-err-info)
973 (nth 1 line-err-info) 799 (nth 1 line-err-info))
974) 800
975(defun flymake-ler-get-type(line-err-info) 801(defun flymake-ler-get-type (line-err-info)
976 (nth 2 line-err-info) 802 (nth 2 line-err-info))
977) 803
978(defun flymake-ler-get-text(line-err-info) 804(defun flymake-ler-get-text (line-err-info)
979 (nth 3 line-err-info) 805 (nth 3 line-err-info))
980) 806
981(defun flymake-ler-get-full-file(line-err-info) 807(defun flymake-ler-get-full-file (line-err-info)
982 (nth 4 line-err-info) 808 (nth 4 line-err-info))
983) 809
984(defun flymake-ler-set-file(line-err-info file) 810(defun flymake-ler-set-file (line-err-info file)
985 (flymake-ler-make-ler file 811 (flymake-ler-make-ler file
986 (flymake-ler-get-line line-err-info) 812 (flymake-ler-get-line line-err-info)
987 (flymake-ler-get-type line-err-info) 813 (flymake-ler-get-type line-err-info)
988 (flymake-ler-get-text line-err-info) 814 (flymake-ler-get-text line-err-info)
989 (flymake-ler-get-full-file line-err-info)) 815 (flymake-ler-get-full-file line-err-info)))
990) 816
991(defun flymake-ler-set-full-file(line-err-info full-file) 817(defun flymake-ler-set-full-file (line-err-info full-file)
992 (flymake-ler-make-ler (flymake-ler-get-file line-err-info) 818 (flymake-ler-make-ler (flymake-ler-get-file line-err-info)
993 (flymake-ler-get-line line-err-info) 819 (flymake-ler-get-line line-err-info)
994 (flymake-ler-get-type line-err-info) 820 (flymake-ler-get-type line-err-info)
995 (flymake-ler-get-text line-err-info) 821 (flymake-ler-get-text line-err-info)
996 full-file) 822 full-file))
997) 823
998(defun flymake-ler-set-line(line-err-info line) 824(defun flymake-ler-set-line (line-err-info line)
999 (flymake-ler-make-ler (flymake-ler-get-file line-err-info) 825 (flymake-ler-make-ler (flymake-ler-get-file line-err-info)
1000 line 826 line
1001 (flymake-ler-get-type line-err-info) 827 (flymake-ler-get-type line-err-info)
1002 (flymake-ler-get-text line-err-info) 828 (flymake-ler-get-text line-err-info)
1003 (flymake-ler-get-full-file line-err-info)) 829 (flymake-ler-get-full-file line-err-info)))
1004)
1005 830
1006(defun flymake-get-line-err-count(line-err-info-list type) 831(defun flymake-get-line-err-count (line-err-info-list type)
1007 "return number of errors of specified type - e or w" 832 "Return number of errors of specified TYPE.
833Value of TYPE is eigher e or w."
1008 (let* ((idx 0) 834 (let* ((idx 0)
1009 (count (length line-err-info-list)) 835 (count (length line-err-info-list))
1010 (err-count 0)) 836 (err-count 0))
1011 837
1012 (while (< idx count) 838 (while (< idx count)
1013 (when (equal type (flymake-ler-get-type (nth idx line-err-info-list))) 839 (when (equal type (flymake-ler-get-type (nth idx line-err-info-list)))
1014 (setq err-count (1+ err-count)) 840 (setq err-count (1+ err-count)))
1015 ) 841 (setq idx (1+ idx)))
1016 (setq idx (1+ idx)) 842 err-count))
1017 )
1018 err-count
1019 )
1020)
1021 843
1022(defun flymake-get-err-count(err-info-list type) 844(defun flymake-get-err-count (err-info-list type)
1023 "return number of errors of specified type for the err-info-list" 845 "Return number of errors of specified TYPE for ERR-INFO-LIST."
1024 (let* ((idx 0) 846 (let* ((idx 0)
1025 (count (length err-info-list)) 847 (count (length err-info-list))
1026 (err-count 0)) 848 (err-count 0))
1027 (while (< idx count) 849 (while (< idx count)
1028 (setq err-count (+ err-count (flymake-get-line-err-count (nth 1 (nth idx err-info-list)) type))) 850 (setq err-count (+ err-count (flymake-get-line-err-count (nth 1 (nth idx err-info-list)) type)))
1029 (setq idx (1+ idx)) 851 (setq idx (1+ idx)))
1030 ) 852 err-count))
1031 err-count 853
1032 ) 854(defun flymake-fix-line-numbers (err-info-list min-line max-line)
1033) 855 "Replace line numbers with fixed value.
1034 856If line-numbers is less than MIN-LINE, set line numbers to MIN-LINE.
1035(defun flymake-fix-line-numbers(err-info-list min-line max-line) 857If line numbers is greater than MAX-LINE, set line numbers to MAX-LINE.
1036 "replace line-numbers < min-line with min-line and > max-line with max-line - as some compilers might report line number outside the file being compiled" 858The reason for this fix is because some compilers might report
859line number outside the file being compiled."
1037 (let* ((count (length err-info-list)) 860 (let* ((count (length err-info-list))
1038 (err-info nil) 861 (err-info nil)
1039 (line 0)) 862 (line 0))
@@ -1043,36 +866,27 @@ Whenether a buffer for master-file-name exists, use it as a source instead of re
1043 (when (or (< line min-line) (> line max-line)) 866 (when (or (< line min-line) (> line max-line))
1044 (setq line (if (< line min-line) min-line max-line)) 867 (setq line (if (< line min-line) min-line max-line))
1045 (setq err-info-list (flymake-set-at err-info-list (1- count) 868 (setq err-info-list (flymake-set-at err-info-list (1- count)
1046 (flymake-er-make-er line 869 (flymake-er-make-er line
1047 (flymake-er-get-line-err-info-list err-info)))) 870 (flymake-er-get-line-err-info-list err-info)))))
1048 ) 871 (setq count (1- count))))
1049 (setq count (1- count)) 872 err-info-list)
1050 )
1051 )
1052 err-info-list
1053)
1054 873
1055(defun flymake-highlight-err-lines(buffer err-info-list) 874(defun flymake-highlight-err-lines (buffer err-info-list)
1056 "highlight err-lines in buffer using info from err-info-list" 875 "Highlight error lines in BUFFER using info from ERR-INFO-LIST."
1057 (save-excursion 876 (save-excursion
1058 (set-buffer buffer) 877 (set-buffer buffer)
1059 (let* ((idx 0) 878 (let* ((idx 0)
1060 (count (length err-info-list))) 879 (count (length err-info-list)))
1061 (while (< idx count) 880 (while (< idx count)
1062 (flymake-highlight-line (car (nth idx err-info-list)) (nth 1 (nth idx err-info-list))) 881 (flymake-highlight-line (car (nth idx err-info-list)) (nth 1 (nth idx err-info-list)))
1063 (setq idx (1+ idx)) 882 (setq idx (1+ idx))))))
1064 )
1065 )
1066 )
1067)
1068 883
1069(defun flymake-overlay-p(ov) 884(defun flymake-overlay-p (ov)
1070 "Determine whether overlay was created by flymake" 885 "Determine whether overlay OV was created by flymake."
1071 (and (overlayp ov) (overlay-get ov 'flymake-overlay)) 886 (and (overlayp ov) (overlay-get ov 'flymake-overlay)))
1072)
1073 887
1074(defun flymake-make-overlay(beg end tooltip-text face mouse-face) 888(defun flymake-make-overlay (beg end tooltip-text face mouse-face)
1075 "Allocate a flymake overlay in range beg end" 889 "Allocate a flymake overlay in range BEG and END."
1076 (when (not (flymake-region-has-flymake-overlays beg end)) 890 (when (not (flymake-region-has-flymake-overlays beg end))
1077 (let ((ov (make-overlay beg end nil t t))) 891 (let ((ov (make-overlay beg end nil t t)))
1078 (overlay-put ov 'face face) 892 (overlay-put ov 'face face)
@@ -1081,14 +895,11 @@ Whenether a buffer for master-file-name exists, use it as a source instead of re
1081 (overlay-put ov 'flymake-overlay t) 895 (overlay-put ov 'flymake-overlay t)
1082 (overlay-put ov 'priority 100) 896 (overlay-put ov 'priority 100)
1083 ;+(flymake-log 3 "created overlay %s" ov) 897 ;+(flymake-log 3 "created overlay %s" ov)
1084 ov 898 ov)
1085 ) 899 (flymake-log 3 "created an overlay at (%d-%d)" beg end)))
1086 (flymake-log 3 "created an overlay at (%d-%d)" beg end)
1087 )
1088)
1089 900
1090(defun flymake-delete-own-overlays(buffer) 901(defun flymake-delete-own-overlays (buffer)
1091 "Delete all flymake overlays in buffer" 902 "Delete all flymake overlays in BUFFER."
1092 (save-excursion 903 (save-excursion
1093 (set-buffer buffer) 904 (set-buffer buffer)
1094 (let ((ov (overlays-in (point-min) (point-max)))) 905 (let ((ov (overlays-in (point-min) (point-max))))
@@ -1097,44 +908,35 @@ Whenether a buffer for master-file-name exists, use it as a source instead of re
1097 (delete-overlay (car ov)) 908 (delete-overlay (car ov))
1098 ;+(flymake-log 3 "deleted overlay %s" ov) 909 ;+(flymake-log 3 "deleted overlay %s" ov)
1099 ) 910 )
1100 (setq ov (cdr ov)) 911 (setq ov (cdr ov))))))
1101 )
1102 )
1103 )
1104)
1105 912
1106(defun flymake-region-has-flymake-overlays(beg end) 913(defun flymake-region-has-flymake-overlays (beg end)
1107 "t if specified regions has at least one flymake overlay, nil otrherwise" 914 "Check if region specified by BEG and END has overlay.
915Return t if it has at least one flymake overlay, nil if no overlay."
1108 (let ((ov (overlays-in beg end)) 916 (let ((ov (overlays-in beg end))
1109 (has-flymake-overlays nil)) 917 (has-flymake-overlays nil))
1110 (while (consp ov) 918 (while (consp ov)
1111 (when (flymake-overlay-p (car ov)) 919 (when (flymake-overlay-p (car ov))
1112 (setq has-flymake-overlays t) 920 (setq has-flymake-overlays t))
1113 ) 921 (setq ov (cdr ov)))))
1114 (setq ov (cdr ov))
1115 )
1116 )
1117)
1118 922
1119(defface flymake-errline-face 923(defface flymake-errline-face
1120;+ '((((class color)) (:foreground "OrangeRed" :bold t :underline t)) 924;+ '((((class color)) (:foreground "OrangeRed" :bold t :underline t))
1121;+ '((((class color)) (:underline "OrangeRed")) 925;+ '((((class color)) (:underline "OrangeRed"))
1122 '((((class color)) (:background "LightPink")) 926 '((((class color)) (:background "LightPink"))
1123 (t (:bold t))) 927 (t (:bold t)))
1124 "Face used for marking error lines" 928 "Face used for marking error lines."
1125 :group 'flymake 929 :group 'flymake)
1126)
1127 930
1128(defface flymake-warnline-face 931(defface flymake-warnline-face
1129 '((((class color)) (:background "LightBlue2")) 932 '((((class color)) (:background "LightBlue2"))
1130 (t (:bold t))) 933 (t (:bold t)))
1131 "Face used for marking warning lines" 934 "Face used for marking warning lines."
1132 :group 'flymake 935 :group 'flymake)
1133)
1134
1135 936
1136(defun flymake-highlight-line(line-no line-err-info-list) 937(defun flymake-highlight-line (line-no line-err-info-list)
1137 "highlight line line-no in current buffer, perhaps use text from line-err-info-list to enhance highlighting" 938 "Highlight line LINE-NO in current buffer.
939Perhaps use text from LINE-ERR-INFO-ILST to enhance highlighting."
1138 (goto-line line-no) 940 (goto-line line-no)
1139 (let* ((line-beg (flymake-line-beginning-position)) 941 (let* ((line-beg (flymake-line-beginning-position))
1140 (line-end (flymake-line-end-position)) 942 (line-end (flymake-line-end-position))
@@ -1145,38 +947,33 @@ Whenether a buffer for master-file-name exists, use it as a source instead of re
1145 947
1146 (goto-char line-beg) 948 (goto-char line-beg)
1147 (while (looking-at "[ \t]") 949 (while (looking-at "[ \t]")
1148 (forward-char) 950 (forward-char))
1149 )
1150 951
1151 (setq beg (point)) 952 (setq beg (point))
1152 953
1153 (goto-char line-end) 954 (goto-char line-end)
1154 (while (and (looking-at "[ \t\r\n]") (> (point) 1)) 955 (while (and (looking-at "[ \t\r\n]") (> (point) 1))
1155 (backward-char) 956 (backward-char))
1156 )
1157 957
1158 (setq end (1+ (point))) 958 (setq end (1+ (point)))
1159 959
1160 (when (<= end beg) 960 (when (<= end beg)
1161 (setq beg line-beg) 961 (setq beg line-beg)
1162 (setq end line-end) 962 (setq end line-end))
1163 ) 963
1164 (when (= end beg) 964 (when (= end beg)
1165 (goto-char end) 965 (goto-char end)
1166 (forward-line) 966 (forward-line)
1167 (setq end (point)) 967 (setq end (point)))
1168 ) 968
1169 (if (> (flymake-get-line-err-count line-err-info-list "e") 0) 969 (if (> (flymake-get-line-err-count line-err-info-list "e") 0)
1170 (setq face 'flymake-errline-face) 970 (setq face 'flymake-errline-face)
1171 ;else 971 (setq face 'flymake-warnline-face))
1172 (setq face 'flymake-warnline-face)
1173 )
1174 (flymake-make-overlay beg end tooltip-text face nil)
1175 )
1176)
1177 972
1178(defun flymake-parse-err-lines(err-info-list source-buffer lines) 973 (flymake-make-overlay beg end tooltip-text face nil)))
1179 "parse err lines, store info in err-info-list" 974
975(defun flymake-parse-err-lines (err-info-list source-buffer lines)
976 "Parse err LINES, store info in ERR-INFO-LIST."
1180 (let* ((count (length lines)) 977 (let* ((count (length lines))
1181 (idx 0) 978 (idx 0)
1182 (line-err-info nil) 979 (line-err-info nil)
@@ -1192,36 +989,28 @@ Whenether a buffer for master-file-name exists, use it as a source instead of re
1192 989
1193 (if (flymake-same-files real-file-name source-file-name) 990 (if (flymake-same-files real-file-name source-file-name)
1194 (setq line-err-info (flymake-ler-set-file line-err-info nil)) 991 (setq line-err-info (flymake-ler-set-file line-err-info nil))
1195 ;else 992 (setq line-err-info (flymake-ler-set-file line-err-info (file-name-nondirectory real-file-name))))
1196 (setq line-err-info (flymake-ler-set-file line-err-info (file-name-nondirectory real-file-name)))
1197 )
1198 993
1199 (setq err-info-list (flymake-add-err-info err-info-list line-err-info)) 994 (setq err-info-list (flymake-add-err-info err-info-list line-err-info)))
1200 )
1201 (flymake-log 3 "parsed '%s', %s line-err-info" (nth idx lines) (if line-err-info "got" "no")) 995 (flymake-log 3 "parsed '%s', %s line-err-info" (nth idx lines) (if line-err-info "got" "no"))
1202 (setq idx (1+ idx)) 996 (setq idx (1+ idx)))
1203 ) 997 err-info-list))
1204 err-info-list
1205 )
1206)
1207 998
1208(defun flymake-split-output(output) 999(defun flymake-split-output (output)
1209 "split output into lines, return last one as residual if it does not end with newline char. Returns ((lines) residual)" 1000 "Split OUTPUT into lines.
1001Return last one as residual if it does not end with newline char. Returns ((lines) residual)."
1210 (when (and output (> (length output) 0)) 1002 (when (and output (> (length output) 0))
1211 (let* ((lines (flymake-split-string output "[\n\r]+")) 1003 (let* ((lines (flymake-split-string output "[\n\r]+"))
1212 (complete (equal "\n" (char-to-string (aref output (1- (length output)))))) 1004 (complete (equal "\n" (char-to-string (aref output (1- (length output))))))
1213 (residual nil)) 1005 (residual nil))
1214 (when (not complete) 1006 (when (not complete)
1215 (setq residual (car (last lines))) 1007 (setq residual (car (last lines)))
1216 (setq lines (butlast lines)) 1008 (setq lines (butlast lines)))
1217 ) 1009 (list lines residual))))
1218 (list lines residual)
1219 )
1220 )
1221)
1222 1010
1223(defun flymake-reformat-err-line-patterns-from-compile-el(original-list) 1011(defun flymake-reformat-err-line-patterns-from-compile-el (original-list)
1224 "grab error line patterns from original list in compile.el format, convert to flymake internal format" 1012 "Grab error line patterns from ORIGINAL-LIST in compile.el format.
1013Convert it to flymake internal format."
1225 (let* ((converted-list '())) 1014 (let* ((converted-list '()))
1226 (mapcar 1015 (mapcar
1227 (lambda (item) 1016 (lambda (item)
@@ -1236,17 +1025,13 @@ Whenether a buffer for master-file-name exists, use it as a source instead of re
1236 (if (consp col) (setq col (car col))) 1025 (if (consp col) (setq col (car col)))
1237 1026
1238 (when (not (functionp line)) 1027 (when (not (functionp line))
1239 (setq converted-list (cons (list regexp file line col) converted-list)) 1028 (setq converted-list (cons (list regexp file line col) converted-list)))))
1240 ) 1029 original-list)
1241 ) 1030 converted-list))
1242 ) 1031
1243 original-list 1032(eval-when-compile
1244 ) 1033 (require 'compile))
1245 converted-list
1246 )
1247)
1248 1034
1249(require 'compile)
1250(defvar flymake-err-line-patterns ; regexp file-idx line-idx col-idx (optional) text-idx(optional), match-end to end of string is error text 1035(defvar flymake-err-line-patterns ; regexp file-idx line-idx col-idx (optional) text-idx(optional), match-end to end of string is error text
1251 (append 1036 (append
1252 '( 1037 '(
@@ -1267,12 +1052,11 @@ Whenether a buffer for master-file-name exists, use it as a source instead of re
1267 ; LaTeX warnings (fileless) ("\\(LaTeX \\(Warning\\|Error\\): .*\\) on input line \\([0-9]+\\)" 20 3 nil 1) 1052 ; LaTeX warnings (fileless) ("\\(LaTeX \\(Warning\\|Error\\): .*\\) on input line \\([0-9]+\\)" 20 3 nil 1)
1268 ; ant/javac 1053 ; ant/javac
1269 (" *\\(\\[javac\\]\\)? *\\(\\([a-zA-Z]:\\)?[^:(\t\n]+\\)\:\\([0-9]+\\)\:[ \t\n]*\\(.+\\)" 1054 (" *\\(\\[javac\\]\\)? *\\(\\([a-zA-Z]:\\)?[^:(\t\n]+\\)\:\\([0-9]+\\)\:[ \t\n]*\\(.+\\)"
1270 2 4 nil 5) 1055 2 4 nil 5))
1271 )
1272 ;; compilation-error-regexp-alist) 1056 ;; compilation-error-regexp-alist)
1273 (flymake-reformat-err-line-patterns-from-compile-el compilation-error-regexp-alist-alist)) 1057 (flymake-reformat-err-line-patterns-from-compile-el compilation-error-regexp-alist-alist))
1274 "patterns for matching error/warning lines, (regexp file-idx line-idx err-text-idx). Use flymake-reformat-err-line-patterns-from-compile-el to add patterns from compile.el" 1058 "patterns for matching error/warning lines, (regexp file-idx line-idx err-text-idx). Use flymake-reformat-err-line-patterns-from-compile-el to add patterns from compile.el")
1275) 1059
1276;(defcustom flymake-err-line-patterns 1060;(defcustom flymake-err-line-patterns
1277; '( 1061; '(
1278; ; MS Visual C++ 6.0 1062; ; MS Visual C++ 6.0
@@ -1286,8 +1070,9 @@ Whenether a buffer for master-file-name exists, use it as a source instead of re
1286; :type '(repeat (string number number number)) 1070; :type '(repeat (string number number number))
1287;) 1071;)
1288 1072
1289(defun flymake-parse-line(line) 1073(defun flymake-parse-line (line)
1290 "parse line to see whether it's an error of warning, return it's components or nil for no match" 1074 "Parse LINE to see if it is an error of warning.
1075Return its components if so, nil if no."
1291 (let ((raw-file-name nil) 1076 (let ((raw-file-name nil)
1292 (line-no 0) 1077 (line-no 0)
1293 (err-type "e") 1078 (err-type "e")
@@ -1311,72 +1096,48 @@ Whenether a buffer for master-file-name exists, use it as a source instead of re
1311 ) 1096 )
1312 (flymake-log 3 "parse line: file-idx=%s line-idx=%s file=%s line=%s text=%s" file-idx line-idx 1097 (flymake-log 3 "parse line: file-idx=%s line-idx=%s file=%s line=%s text=%s" file-idx line-idx
1313 raw-file-name line-no err-text) 1098 raw-file-name line-no err-text)
1314 (setq matched t) 1099 (setq matched t)))
1315 ) 1100 (setq idx (1+ idx)))
1316 )
1317 (setq idx (1+ idx))
1318 )
1319 (if matched 1101 (if matched
1320 (flymake-ler-make-ler raw-file-name line-no err-type err-text) 1102 (flymake-ler-make-ler raw-file-name line-no err-type err-text)
1321 ; else 1103 ())))
1322 ()
1323 )
1324 )
1325)
1326 1104
1327(defun flymake-find-err-info(err-info-list line-no) 1105(defun flymake-find-err-info (err-info-list line-no)
1328 "find (line-err-info-list pos) for specified line-no" 1106 "Find (line-err-info-list pos) for specified LINE-NO."
1329 (if err-info-list 1107 (if err-info-list
1330 (let* ((line-err-info-list nil) 1108 (let* ((line-err-info-list nil)
1331 (pos 0) 1109 (pos 0)
1332 (count (length err-info-list))) 1110 (count (length err-info-list)))
1333 1111
1334 (while (and (< pos count) (< (car (nth pos err-info-list)) line-no)) 1112 (while (and (< pos count) (< (car (nth pos err-info-list)) line-no))
1335 (setq pos (1+ pos)) 1113 (setq pos (1+ pos)))
1336 )
1337 (when (and (< pos count) (equal (car (nth pos err-info-list)) line-no)) 1114 (when (and (< pos count) (equal (car (nth pos err-info-list)) line-no))
1338 (setq line-err-info-list (flymake-er-get-line-err-info-list (nth pos err-info-list))) 1115 (setq line-err-info-list (flymake-er-get-line-err-info-list (nth pos err-info-list))))
1339 ) 1116 (list line-err-info-list pos))
1340 (list line-err-info-list pos) 1117 '(nil 0)))
1341 )
1342 ;else
1343 '(nil 0)
1344 )
1345)
1346 1118
1347(defun flymake-line-err-info-is-less-or-equal(line-one line-two) 1119(defun flymake-line-err-info-is-less-or-equal (line-one line-two)
1348 (or (string< (flymake-ler-get-type line-one) (flymake-ler-get-type line-two)) 1120 (or (string< (flymake-ler-get-type line-one) (flymake-ler-get-type line-two))
1349 (and (string= (flymake-ler-get-type line-one) (flymake-ler-get-type line-two)) 1121 (and (string= (flymake-ler-get-type line-one) (flymake-ler-get-type line-two))
1350 (not (flymake-ler-get-file line-one)) (flymake-ler-get-file line-two) 1122 (not (flymake-ler-get-file line-one)) (flymake-ler-get-file line-two))
1351 )
1352 (and (string= (flymake-ler-get-type line-one) (flymake-ler-get-type line-two)) 1123 (and (string= (flymake-ler-get-type line-one) (flymake-ler-get-type line-two))
1353 (or (and (flymake-ler-get-file line-one) (flymake-ler-get-file line-two)) 1124 (or (and (flymake-ler-get-file line-one) (flymake-ler-get-file line-two))
1354 (and (not (flymake-ler-get-file line-one)) (not (flymake-ler-get-file line-two))) 1125 (and (not (flymake-ler-get-file line-one)) (not (flymake-ler-get-file line-two)))))))
1355 )
1356 )
1357 )
1358)
1359 1126
1360(defun flymake-add-line-err-info(line-err-info-list line-err-info) 1127(defun flymake-add-line-err-info (line-err-info-list line-err-info)
1361 "insert new err info favoring sorting: err-type e/w, filename nil/non-nill" 1128 "Insert new err info favoring sorting: err-type e/w, filename nil/non-nil."
1362 (if (not line-err-info-list) 1129 (if (not line-err-info-list)
1363 (list line-err-info) 1130 (list line-err-info)
1364 ;else
1365 (let* ((count (length line-err-info-list)) 1131 (let* ((count (length line-err-info-list))
1366 (idx 0)) 1132 (idx 0))
1367 (while (and (< idx count) (flymake-line-err-info-is-less-or-equal (nth idx line-err-info-list) line-err-info)) 1133 (while (and (< idx count) (flymake-line-err-info-is-less-or-equal (nth idx line-err-info-list) line-err-info))
1368 (setq idx (1+ idx)) 1134 (setq idx (1+ idx)))
1369 )
1370 (cond ((equal 0 idx) (setq line-err-info-list (cons line-err-info line-err-info-list))) 1135 (cond ((equal 0 idx) (setq line-err-info-list (cons line-err-info line-err-info-list)))
1371 (t (setq line-err-info-list (flymake-ins-after line-err-info-list (1- idx) line-err-info))) 1136 (t (setq line-err-info-list (flymake-ins-after line-err-info-list (1- idx) line-err-info))))
1372 ) 1137 line-err-info-list)))
1373 line-err-info-list
1374 )
1375 )
1376)
1377 1138
1378(defun flymake-add-err-info(err-info-list line-err-info) 1139(defun flymake-add-err-info (err-info-list line-err-info)
1379 "add error info (file line type text) to err info list preserving sort order" 1140 "Add error info (file line type text) to err info list preserving sort order."
1380 (let* ((count (length err-info-list)) 1141 (let* ((count (length err-info-list))
1381 (line-no (if (flymake-ler-get-file line-err-info) 1 (flymake-ler-get-line line-err-info))) 1142 (line-no (if (flymake-ler-get-file line-err-info) 1 (flymake-ler-get-line line-err-info)))
1382 (info-and-pos (flymake-find-err-info err-info-list line-no)) 1143 (info-and-pos (flymake-find-err-info err-info-list line-no))
@@ -1386,25 +1147,20 @@ Whenether a buffer for master-file-name exists, use it as a source instead of re
1386 (err-info nil)) 1147 (err-info nil))
1387 1148
1388 (if exists 1149 (if exists
1389 (setq line-err-info-list (flymake-er-get-line-err-info-list (car (nthcdr pos err-info-list)))) 1150 (setq line-err-info-list (flymake-er-get-line-err-info-list (car (nthcdr pos err-info-list)))))
1390 )
1391 (setq line-err-info-list (flymake-add-line-err-info line-err-info-list line-err-info)) 1151 (setq line-err-info-list (flymake-add-line-err-info line-err-info-list line-err-info))
1392 1152
1393 (setq err-info (flymake-er-make-er line-no line-err-info-list)) 1153 (setq err-info (flymake-er-make-er line-no line-err-info-list))
1394 (cond (exists (setq err-info-list (flymake-set-at err-info-list pos err-info))) 1154 (cond (exists (setq err-info-list (flymake-set-at err-info-list pos err-info)))
1395 ((equal 0 pos) (setq err-info-list (cons err-info err-info-list))) 1155 ((equal 0 pos) (setq err-info-list (cons err-info err-info-list)))
1396 (t (setq err-info-list (flymake-ins-after err-info-list (1- pos) err-info))) 1156 (t (setq err-info-list (flymake-ins-after err-info-list (1- pos) err-info))))
1397 ) 1157 err-info-list))
1398 err-info-list
1399 )
1400)
1401 1158
1402(defun flymake-get-project-include-dirs-imp(basedir) 1159(defun flymake-get-project-include-dirs-imp (basedir)
1403 "include dirs for the project current file belongs to" 1160 "Include dirs for the project current file belongs to."
1404 (if (flymake-get-project-include-dirs-from-cache basedir) 1161 (if (flymake-get-project-include-dirs-from-cache basedir)
1405 (progn 1162 (progn
1406 (flymake-get-project-include-dirs-from-cache basedir) 1163 (flymake-get-project-include-dirs-from-cache basedir))
1407 )
1408 ;else 1164 ;else
1409 (let* ((command-line (concat "make -C\"" basedir "\" DUMPVARS=INCLUDE_DIRS dumpvars")) 1165 (let* ((command-line (concat "make -C\"" basedir "\" DUMPVARS=INCLUDE_DIRS dumpvars"))
1410 (output (shell-command-to-string command-line)) 1166 (output (shell-command-to-string command-line))
@@ -1413,62 +1169,49 @@ Whenether a buffer for master-file-name exists, use it as a source instead of re
1413 (idx 0) 1169 (idx 0)
1414 (inc-dirs nil)) 1170 (inc-dirs nil))
1415 (while (and (< idx count) (not (string-match "^INCLUDE_DIRS=.*" (nth idx lines)))) 1171 (while (and (< idx count) (not (string-match "^INCLUDE_DIRS=.*" (nth idx lines))))
1416 (setq idx (1+ idx)) 1172 (setq idx (1+ idx)))
1417 )
1418 (when (< idx count) 1173 (when (< idx count)
1419 (let* ((inc-lines (flymake-split-string (nth idx lines) " *-I")) 1174 (let* ((inc-lines (flymake-split-string (nth idx lines) " *-I"))
1420 (inc-count (length inc-lines))) 1175 (inc-count (length inc-lines)))
1421 (while (> inc-count 0) 1176 (while (> inc-count 0)
1422 (when (not (string-match "^INCLUDE_DIRS=.*" (nth (1- inc-count) inc-lines))) 1177 (when (not (string-match "^INCLUDE_DIRS=.*" (nth (1- inc-count) inc-lines)))
1423 (setq inc-dirs (cons (flymake-replace-regexp-in-string "\"" "" (nth (1- inc-count) inc-lines)) inc-dirs)) 1178 (setq inc-dirs (cons (flymake-replace-regexp-in-string "\"" "" (nth (1- inc-count) inc-lines)) inc-dirs)))
1424 ) 1179 (setq inc-count (1- inc-count)))))
1425 (setq inc-count (1- inc-count))
1426 )
1427 )
1428 )
1429 (flymake-add-project-include-dirs-to-cache basedir inc-dirs) 1180 (flymake-add-project-include-dirs-to-cache basedir inc-dirs)
1430 inc-dirs 1181 inc-dirs)))
1431 )
1432 )
1433)
1434 1182
1435(defcustom flymake-get-project-include-dirs-function 'flymake-get-project-include-dirs-imp 1183(defcustom flymake-get-project-include-dirs-function 'flymake-get-project-include-dirs-imp
1436 "function used to get project inc dirs, one paramater: basedir name" 1184 "Function used to get project inc dirs, one paramater: basedir name."
1437 :group 'flymake 1185 :group 'flymake
1438 :type 'function 1186 :type 'function)
1439)
1440 1187
1441(defun flymake-get-project-include-dirs(basedir) 1188(defun flymake-get-project-include-dirs (basedir)
1442 (funcall flymake-get-project-include-dirs-function basedir) 1189 (funcall flymake-get-project-include-dirs-function basedir))
1443)
1444 1190
1445(defun flymake-get-system-include-dirs() 1191(defun flymake-get-system-include-dirs ()
1446 "system include dirs - from the 'INCLUDE' env setting" 1192 "System include dirs - from the 'INCLUDE' env setting."
1447 (let* ((includes (getenv "INCLUDE"))) 1193 (let* ((includes (getenv "INCLUDE")))
1448 (if includes (flymake-split-string includes path-separator) nil) 1194 (if includes (flymake-split-string includes path-separator) nil)))
1449 )
1450)
1451 1195
1452(defvar flymake-project-include-dirs-cache (flymake-makehash 'equal)) 1196(defvar flymake-project-include-dirs-cache (flymake-makehash 'equal))
1453(defun flymake-get-project-include-dirs-from-cache(base-dir)
1454 (gethash base-dir flymake-project-include-dirs-cache)
1455)
1456(defun flymake-add-project-include-dirs-to-cache(base-dir include-dirs)
1457 (puthash base-dir include-dirs flymake-project-include-dirs-cache)
1458)
1459(defun flymake-clear-project-include-dirs-cache()
1460 (clrhash flymake-project-include-dirs-cache)
1461)
1462 1197
1463(defun flymake-get-include-dirs(base-dir) 1198(defun flymake-get-project-include-dirs-from-cache (base-dir)
1464 "dirs to use when resolving local filenames" 1199 (gethash base-dir flymake-project-include-dirs-cache))
1200
1201(defun flymake-add-project-include-dirs-to-cache (base-dir include-dirs)
1202 (puthash base-dir include-dirs flymake-project-include-dirs-cache))
1203
1204(defun flymake-clear-project-include-dirs-cache ()
1205 (clrhash flymake-project-include-dirs-cache))
1206
1207(defun flymake-get-include-dirs (base-dir)
1208 "Get dirs to use when resolving local file names."
1465 (let* ((include-dirs (append '(".") (flymake-get-project-include-dirs base-dir) (flymake-get-system-include-dirs)))) 1209 (let* ((include-dirs (append '(".") (flymake-get-project-include-dirs base-dir) (flymake-get-system-include-dirs))))
1466 include-dirs 1210 include-dirs))
1467 )
1468)
1469 1211
1470(defun flymake-find-file(rel-file-name include-dirs) 1212(defun flymake-find-file (rel-file-name include-dirs)
1471 "iterate through include-dirs, return first 'include-dir/rel-file-name' that exists, or just rel-file-name if not" 1213 "Iterate through include-dirs to find file REL-FILE-NAME.
1214Return first 'INCLUDE-DIRS/REL-FILE-NAME' that exists, or just REL-FILE-NAME if not."
1472 (let* ((count (length include-dirs)) 1215 (let* ((count (length include-dirs))
1473 (idx 0) 1216 (idx 0)
1474 (found nil) 1217 (found nil)
@@ -1478,64 +1221,46 @@ Whenether a buffer for master-file-name exists, use it as a source instead of re
1478 (let* ((dir (nth idx include-dirs))) 1221 (let* ((dir (nth idx include-dirs)))
1479 (setq full-file-name (concat dir "/" rel-file-name)) 1222 (setq full-file-name (concat dir "/" rel-file-name))
1480 (when (file-exists-p full-file-name) 1223 (when (file-exists-p full-file-name)
1481 (setq found t) 1224 (setq found t)))
1482 ) 1225 (setq idx (1+ idx)))
1483 )
1484 (setq idx (1+ idx))
1485 )
1486 (if found 1226 (if found
1487 full-file-name 1227 full-file-name
1488 ;else 1228 rel-file-name)))
1489 rel-file-name
1490 )
1491 )
1492)
1493 1229
1494(defun flymake-restore-formatting(source-buffer) 1230(defun flymake-restore-formatting (source-buffer)
1495 "Remove any formatting made by flymake" 1231 "Remove any formatting made by flymake."
1496) 1232)
1497 1233
1498(defun flymake-get-program-dir(buffer) 1234(defun flymake-get-program-dir (buffer)
1499 "dir to start profram in" 1235 "Get dir to start program in."
1500 (unless (bufferp buffer) 1236 (unless (bufferp buffer)
1501 (error "invlid buffer") 1237 (error "Invlid buffer"))
1502 )
1503 (save-excursion 1238 (save-excursion
1504 (set-buffer buffer) 1239 (set-buffer buffer)
1505 default-directory 1240 default-directory))
1506 )
1507)
1508 1241
1509(defun flymake-safe-delete-file(file-name) 1242(defun flymake-safe-delete-file (file-name)
1510 (when (and file-name (file-exists-p file-name)) 1243 (when (and file-name (file-exists-p file-name))
1511 (delete-file file-name) 1244 (delete-file file-name)
1512 (flymake-log 1 "deleted file %s" file-name) 1245 (flymake-log 1 "deleted file %s" file-name)))
1513 )
1514)
1515 1246
1516(defun flymake-safe-delete-directory(dir-name) 1247(defun flymake-safe-delete-directory (dir-name)
1517 (condition-case err 1248 (condition-case err
1518 (progn 1249 (progn
1519 (delete-directory dir-name) 1250 (delete-directory dir-name)
1520 (flymake-log 1 "deleted dir %s" dir-name) 1251 (flymake-log 1 "deleted dir %s" dir-name))
1521 )
1522 (error 1252 (error
1523 (flymake-log 1 "failed to delete dir %s, error ignored" dir-name) 1253 (flymake-log 1 "Failed to delete dir %s, error ignored" dir-name))))
1524 )
1525 )
1526)
1527 1254
1528(defcustom flymake-compilation-prevents-syntax-check t 1255(defcustom flymake-compilation-prevents-syntax-check t
1529 "if non-nil, syntax check won't be started in case compilation is running" 1256 "If non-nil, syntax check won't be started in case compilation is running."
1530 :group 'flymake 1257 :group 'flymake
1531 :type 'boolean 1258 :type 'boolean)
1532)
1533 1259
1534(defun flymake-start-syntax-check(buffer) 1260(defun flymake-start-syntax-check (buffer)
1535 "start syntax checking for buffer" 1261 "Start syntax checking for buffer BUFFER."
1536 (unless (bufferp buffer) 1262 (unless (bufferp buffer)
1537 (error "expected a buffer") 1263 (error "Expected a buffer"))
1538 )
1539 (save-excursion 1264 (save-excursion
1540 (set-buffer buffer) 1265 (set-buffer buffer)
1541 (flymake-log 3 "flymake is running: %s" (flymake-get-buffer-is-running buffer)) 1266 (flymake-log 3 "flymake is running: %s" (flymake-get-buffer-is-running buffer))
@@ -1559,32 +1284,20 @@ Whenether a buffer for master-file-name exists, use it as a source instead of re
1559 (if (not cmd-and-args) 1284 (if (not cmd-and-args)
1560 (progn 1285 (progn
1561 (flymake-log 0 "init function %s for %s failed, cleaning up" init-f source-file-name) 1286 (flymake-log 0 "init function %s for %s failed, cleaning up" init-f source-file-name)
1562 (funcall cleanup-f buffer) 1287 (funcall cleanup-f buffer))
1563 )
1564 ;else
1565 (progn 1288 (progn
1566 (flymake-set-buffer-last-change-time buffer nil) 1289 (flymake-set-buffer-last-change-time buffer nil)
1567 (flymake-start-syntax-check-process buffer cmd args dir) 1290 (flymake-start-syntax-check-process buffer cmd args dir))))))))
1568 )
1569 )
1570 )
1571 )
1572 )
1573 )
1574)
1575
1576(defun flymake-start-syntax-check-process(buffer cmd args dir)
1577 "start syntax check-process"
1578 1291
1292(defun flymake-start-syntax-check-process (buffer cmd args dir)
1293 "Start syntax check process."
1579 (let* ((process nil)) 1294 (let* ((process nil))
1580 (condition-case err 1295 (condition-case err
1581 (progn 1296 (progn
1582 (when dir 1297 (when dir
1583 (let ((default-directory dir)) 1298 (let ((default-directory dir))
1584 (flymake-log 3 "starting process on dir %s" default-directory) 1299 (flymake-log 3 "starting process on dir %s" default-directory)))
1585 ) 1300 (setq process (get-process (apply 'start-process "flymake-proc" nil cmd args)))
1586 )
1587 (setq process (get-process (apply 'start-process "flymake-proc" nil cmd args)))
1588 (set-process-sentinel process 'flymake-process-sentinel) 1301 (set-process-sentinel process 'flymake-process-sentinel)
1589 (set-process-filter process 'flymake-process-filter) 1302 (set-process-filter process 'flymake-process-filter)
1590 1303
@@ -1597,8 +1310,7 @@ Whenether a buffer for master-file-name exists, use it as a source instead of re
1597 (flymake-report-status buffer nil "*") 1310 (flymake-report-status buffer nil "*")
1598 (flymake-log 2 "started process %d, command=%s, dir=%s" 1311 (flymake-log 2 "started process %d, command=%s, dir=%s"
1599 (process-id process) (process-command process) default-directory) 1312 (process-id process) (process-command process) default-directory)
1600 process 1313 process)
1601 )
1602 (error 1314 (error
1603 (let* ((err-str (format "Failed to launch syntax check process '%s' with args %s: %s" 1315 (let* ((err-str (format "Failed to launch syntax check process '%s' with args %s: %s"
1604 cmd args (error-message-string err))) 1316 cmd args (error-message-string err)))
@@ -1606,108 +1318,95 @@ Whenether a buffer for master-file-name exists, use it as a source instead of re
1606 (cleanup-f (flymake-get-cleanup-function source-file-name))) 1318 (cleanup-f (flymake-get-cleanup-function source-file-name)))
1607 (flymake-log 0 err-str) 1319 (flymake-log 0 err-str)
1608 (funcall cleanup-f buffer) 1320 (funcall cleanup-f buffer)
1609 (flymake-report-fatal-status buffer "PROCERR" err-str) 1321 (flymake-report-fatal-status buffer "PROCERR" err-str))))))
1610 )
1611 )
1612 )
1613 )
1614)
1615 1322
1616(defun flymake-kill-process(pid &optional rest) 1323(defun flymake-kill-process (pid &optional rest)
1617 "kill process pid" 1324 "Kill process PID."
1618 (signal-process pid 9) 1325 (signal-process pid 9)
1619 (let* ((buffer-name (flymake-get-source-buffer-name pid))) 1326 (let* ((buffer-name (flymake-get-source-buffer-name pid)))
1620 (when (and buffer-name (get-buffer buffer-name)) 1327 (when (and buffer-name (get-buffer buffer-name))
1621 (flymake-set-buffer-check-was-interrupted (get-buffer buffer-name) t) 1328 (flymake-set-buffer-check-was-interrupted (get-buffer buffer-name) t)))
1622 ) 1329 (flymake-log 1 "killed process %d" pid))
1623 )
1624 (flymake-log 1 "killed process %d" pid)
1625)
1626 1330
1627(defun flymake-stop-all-syntax-checks() 1331(defun flymake-stop-all-syntax-checks ()
1628 "kill all syntax check processes" 1332 "Kill all syntax check processes."
1629 (interactive) 1333 (interactive)
1630 (let ((pids (copy-hash-table flymake-pid-to-names))) 1334 (let ((pids (copy-hash-table flymake-pid-to-names)))
1631 (maphash 'flymake-kill-process pids) 1335 (maphash 'flymake-kill-process pids)))
1632 )
1633)
1634 1336
1635(defun flymake-compilation-is-running() 1337(defun flymake-compilation-is-running ()
1636 (and (boundp 'compilation-in-progress) 1338 (and (boundp 'compilation-in-progress)
1637 compilation-in-progress) 1339 compilation-in-progress))
1638)
1639 1340
1640(defun flymake-compile() 1341(defun flymake-compile ()
1641 "kill all flymake syntax checks, start compilation" 1342 "Kill all flymake syntax checks, start compilation."
1642 (interactive) 1343 (interactive)
1643 (flymake-stop-all-syntax-checks) 1344 (flymake-stop-all-syntax-checks)
1644 (call-interactively 'compile) 1345 (call-interactively 'compile))
1645)
1646 1346
1647(defvar flymake-is-running nil 1347(defvar flymake-is-running nil
1648 "t if flymake syntax check process is running for the current buffer" 1348 "If t, flymake syntax check process is running for the current buffer")
1649) 1349
1650(make-variable-buffer-local 'flymake-is-running) 1350(make-variable-buffer-local 'flymake-is-running)
1651(defun flymake-get-buffer-is-running(buffer) 1351
1652 (flymake-get-buffer-var buffer 'flymake-is-running) 1352(defun flymake-get-buffer-is-running (buffer)
1653) 1353 (flymake-get-buffer-var buffer 'flymake-is-running))
1654(defun flymake-set-buffer-is-running(buffer is-running) 1354
1655 (flymake-set-buffer-var buffer 'flymake-is-running is-running) 1355(defun flymake-set-buffer-is-running (buffer is-running)
1656) 1356 (flymake-set-buffer-var buffer 'flymake-is-running is-running))
1657 1357
1658(defvar flymake-timer nil 1358(defvar flymake-timer nil
1659 "timer for starting syntax checks" 1359 "Timer for starting syntax check.")
1660) 1360
1661(make-variable-buffer-local 'flymake-timer) 1361(make-variable-buffer-local 'flymake-timer)
1662(defun flymake-get-buffer-timer(buffer) 1362
1663 (flymake-get-buffer-var buffer 'flymake-timer) 1363(defun flymake-get-buffer-timer (buffer)
1664) 1364 (flymake-get-buffer-var buffer 'flymake-timer))
1665(defun flymake-set-buffer-timer(buffer timer) 1365
1666 (flymake-set-buffer-var buffer 'flymake-timer timer) 1366(defun flymake-set-buffer-timer (buffer timer)
1667) 1367 (flymake-set-buffer-var buffer 'flymake-timer timer))
1668 1368
1669(defvar flymake-last-change-time nil 1369(defvar flymake-last-change-time nil
1670 "time of last buffer change" 1370 "Time of last buffer change.")
1671) 1371
1672(make-variable-buffer-local 'flymake-last-change-time) 1372(make-variable-buffer-local 'flymake-last-change-time)
1673(defun flymake-get-buffer-last-change-time(buffer) 1373
1674 (flymake-get-buffer-var buffer 'flymake-last-change-time) 1374(defun flymake-get-buffer-last-change-time (buffer)
1675) 1375 (flymake-get-buffer-var buffer 'flymake-last-change-time))
1676(defun flymake-set-buffer-last-change-time(buffer change-time) 1376
1677 (flymake-set-buffer-var buffer 'flymake-last-change-time change-time) 1377(defun flymake-set-buffer-last-change-time (buffer change-time)
1678) 1378 (flymake-set-buffer-var buffer 'flymake-last-change-time change-time))
1679 1379
1680(defvar flymake-check-start-time nil 1380(defvar flymake-check-start-time nil
1681 "time at which syntax check was started") 1381 "Time at which syntax check was started.")
1382
1682(make-variable-buffer-local 'flymake-check-start-time) 1383(make-variable-buffer-local 'flymake-check-start-time)
1683(defun flymake-get-buffer-check-start-time(buffer) 1384
1684 (flymake-get-buffer-var buffer 'flymake-check-start-time) 1385(defun flymake-get-buffer-check-start-time (buffer)
1685) 1386 (flymake-get-buffer-var buffer 'flymake-check-start-time))
1686(defun flymake-set-buffer-check-start-time(buffer check-start-time) 1387
1687 (flymake-set-buffer-var buffer 'flymake-check-start-time check-start-time) 1388(defun flymake-set-buffer-check-start-time (buffer check-start-time)
1688) 1389 (flymake-set-buffer-var buffer 'flymake-check-start-time check-start-time))
1689 1390
1690(defvar flymake-check-was-interrupted nil 1391(defvar flymake-check-was-interrupted nil
1691 "t if syntax check was killed by flymake-compile" 1392 "t if syntax check was killed by flymake-compile")
1692) 1393
1693(make-variable-buffer-local 'flymake-check-was-interrupted) 1394(make-variable-buffer-local 'flymake-check-was-interrupted)
1694(defun flymake-get-buffer-check-was-interrupted(buffer) 1395
1695 (flymake-get-buffer-var buffer 'flymake-check-was-interrupted) 1396(defun flymake-get-buffer-check-was-interrupted (buffer)
1696) 1397 (flymake-get-buffer-var buffer 'flymake-check-was-interrupted))
1697(defun flymake-set-buffer-check-was-interrupted(buffer interrupted) 1398
1698 (flymake-set-buffer-var buffer 'flymake-check-was-interrupted interrupted) 1399(defun flymake-set-buffer-check-was-interrupted (buffer interrupted)
1699) 1400 (flymake-set-buffer-var buffer 'flymake-check-was-interrupted interrupted))
1700 1401
1701(defcustom flymake-no-changes-timeout 0.5 1402(defcustom flymake-no-changes-timeout 0.5
1702 "time to wait after last change before starting compilation" 1403 "Time to wait after last change before starting compilation."
1703 :group 'flymake 1404 :group 'flymake
1704 :type 'number 1405 :type 'number)
1705)
1706 1406
1707(defun flymake-on-timer-event(buffer) 1407(defun flymake-on-timer-event (buffer)
1708 "start a syntax check for buffer if necessary" 1408 "Start a syntax check for buffer BUFFER if necessary."
1709 ;+(flymake-log 3 "timer: running=%s, time=%s, cur-time=%s" (flymake-get-buffer-is-running buffer) (flymake-get-buffer-last-change-time buffer) (flymake-float-time)) 1409 ;+(flymake-log 3 "timer: running=%s, time=%s, cur-time=%s" (flymake-get-buffer-is-running buffer) (flymake-get-buffer-last-change-time buffer) (flymake-float-time))
1710
1711 (when (and (bufferp buffer) (not (flymake-get-buffer-is-running buffer))) 1410 (when (and (bufferp buffer) (not (flymake-get-buffer-is-running buffer)))
1712 (save-excursion 1411 (save-excursion
1713 (set-buffer buffer) 1412 (set-buffer buffer)
@@ -1715,48 +1414,36 @@ Whenether a buffer for master-file-name exists, use it as a source instead of re
1715 (> (flymake-float-time) (+ flymake-no-changes-timeout (flymake-get-buffer-last-change-time buffer)))) 1414 (> (flymake-float-time) (+ flymake-no-changes-timeout (flymake-get-buffer-last-change-time buffer))))
1716 (flymake-set-buffer-last-change-time buffer nil) 1415 (flymake-set-buffer-last-change-time buffer nil)
1717 (flymake-log 3 "starting syntax check as more than 1 second passed since last change") 1416 (flymake-log 3 "starting syntax check as more than 1 second passed since last change")
1718 (flymake-start-syntax-check buffer) 1417 (flymake-start-syntax-check buffer)))))
1719 )
1720 )
1721 )
1722)
1723 1418
1724(defun flymake-start-syntax-check-for-current-buffer() 1419(defun flymake-start-syntax-check-for-current-buffer ()
1725 "run flymake-start-syntax-check for current buffer if it isn't already running" 1420 "Run 'flymake-start-syntax-check' for current buffer if it isn't already running."
1726 (interactive) 1421 (interactive)
1727 (flymake-start-syntax-check (current-buffer)) 1422 (flymake-start-syntax-check (current-buffer)))
1728)
1729 1423
1730(defun flymake-current-line-no() 1424(defun flymake-current-line-no ()
1731 "return number of current line in current buffer" 1425 "Return number of current line in current buffer."
1732 (interactive) 1426 (interactive)
1733 (let ((beg (point-min)) 1427 (let ((beg (point-min))
1734 (end (if (= (point) (point-max)) (point) (1+ (point))))) 1428 (end (if (= (point) (point-max)) (point) (1+ (point)))))
1735 (count-lines beg end) 1429 (count-lines beg end)))
1736 )
1737)
1738 1430
1739(defun flymake-get-line-count(buffer) 1431(defun flymake-get-line-count (buffer)
1740 "return number of lines in buffer" 1432 "Return number of lines in buffer BUFFER."
1741 (unless (bufferp buffer) 1433 (unless (bufferp buffer)
1742 (error "invalid buffer") 1434 (error "Invalid buffer"))
1743 )
1744 (save-excursion 1435 (save-excursion
1745 (set-buffer buffer) 1436 (set-buffer buffer)
1746 (count-lines (point-min) (point-max)) 1437 (count-lines (point-min) (point-max))))
1747 )
1748)
1749 1438
1750(defun flymake-count-lines(buffer) 1439(defun flymake-count-lines (buffer)
1751 "return number of lines in buffer" 1440 "Return number of lines in buffer BUFFER."
1752 (save-excursion 1441 (save-excursion
1753 (set-buffer buffer) 1442 (set-buffer buffer)
1754 (count-lines (point-min) (point-max)) 1443 (count-lines (point-min) (point-max))))
1755 )
1756)
1757 1444
1758(defun flymake-get-point-pixel-pos() 1445(defun flymake-get-point-pixel-pos ()
1759 "return point position in pixels: (x, y)" 1446 "Return point position in pixels: (x, y)."
1760 (let ((mouse-pos (mouse-position)) 1447 (let ((mouse-pos (mouse-position))
1761 (pixel-pos nil) 1448 (pixel-pos nil)
1762 (ret nil)) 1449 (ret nil))
@@ -1765,20 +1452,14 @@ Whenether a buffer for master-file-name exists, use it as a source instead of re
1765 (set-mouse-position (flymake-selected-frame) (current-column) (flymake-current-row)) 1452 (set-mouse-position (flymake-selected-frame) (current-column) (flymake-current-row))
1766 (setq pixel-pos (mouse-pixel-position)) 1453 (setq pixel-pos (mouse-pixel-position))
1767 (set-mouse-position (car mouse-pos) (car (cdr mouse-pos)) (cdr (cdr mouse-pos))) 1454 (set-mouse-position (car mouse-pos) (car (cdr mouse-pos)) (cdr (cdr mouse-pos)))
1768 (setq ret (list (car (cdr pixel-pos)) (cdr (cdr pixel-pos)))) 1455 (setq ret (list (car (cdr pixel-pos)) (cdr (cdr pixel-pos)))))
1769 )
1770 ;else
1771 (progn 1456 (progn
1772 (setq ret '(0 0)) 1457 (setq ret '(0 0))))
1773 )
1774 )
1775 (flymake-log 3 "mouse pos is %s" ret) 1458 (flymake-log 3 "mouse pos is %s" ret)
1776 ret 1459 ret))
1777 )
1778)
1779 1460
1780(defun flymake-display-err-menu-for-current-line() 1461(defun flymake-display-err-menu-for-current-line ()
1781 "Display a menu with errors/warnings for current line if it has errors and/or warnings" 1462 "Display a menu with errors/warnings for current line if it has errors and/or warnings."
1782 (interactive) 1463 (interactive)
1783 (let* ((line-no (flymake-current-line-no)) 1464 (let* ((line-no (flymake-current-line-no))
1784 (line-err-info-list (nth 0 (flymake-find-err-info (flymake-get-buffer-err-info (current-buffer)) line-no))) 1465 (line-err-info-list (nth 0 (flymake-find-err-info (flymake-get-buffer-err-info (current-buffer)) line-no)))
@@ -1792,17 +1473,11 @@ Whenether a buffer for master-file-name exists, use it as a source instead of re
1792 (setq choice (flymake-popup-menu menu-pos menu-data)) 1473 (setq choice (flymake-popup-menu menu-pos menu-data))
1793 (flymake-log 3 "choice=%s" choice) 1474 (flymake-log 3 "choice=%s" choice)
1794 (when choice 1475 (when choice
1795 (eval choice) 1476 (eval choice)))
1796 ) 1477 (flymake-log 1 "no errors for line %d" line-no))))
1797 )
1798 ;else
1799 (flymake-log 1 "no errors for line %d" line-no)
1800 )
1801 )
1802)
1803 1478
1804(defun flymake-make-err-menu-data(line-no line-err-info-list) 1479(defun flymake-make-err-menu-data (line-no line-err-info-list)
1805 "Make a (menu-title (item-title item-action)*) list with errors/warnings from line-err-info" 1480 "Make a (menu-title (item-title item-action)*) list with errors/warnings from line-err-info."
1806 (let* ((menu-items nil)) 1481 (let* ((menu-items nil))
1807 (when line-err-info-list 1482 (when line-err-info-list
1808 (let* ((count (length line-err-info-list)) 1483 (let* ((count (length line-err-info-list))
@@ -1813,76 +1488,65 @@ Whenether a buffer for master-file-name exists, use it as a source instead of re
1813 (full-file (flymake-ler-get-full-file (nth (1- count) line-err-info-list))) 1488 (full-file (flymake-ler-get-full-file (nth (1- count) line-err-info-list)))
1814 (line (flymake-ler-get-line (nth (1- count) line-err-info-list)))) 1489 (line (flymake-ler-get-line (nth (1- count) line-err-info-list))))
1815 (if file 1490 (if file
1816 (setq menu-item-text (concat menu-item-text " - " file "(" (format "%d" line) ")")) 1491 (setq menu-item-text (concat menu-item-text " - " file "(" (format "%d" line) ")")))
1817 )
1818 (setq menu-items (cons (list menu-item-text 1492 (setq menu-items (cons (list menu-item-text
1819 (if file (list 'flymake-goto-file-and-line full-file line) nil)) 1493 (if file (list 'flymake-goto-file-and-line full-file line) nil))
1820 menu-items)) 1494 menu-items)))
1821 ) 1495 (setq count (1- count)))
1822 (setq count (1- count)) 1496 (flymake-log 3 "created menu-items with %d item(s)" (length menu-items))))
1823 )
1824 (flymake-log 3 "created menu-items with %d item(s)" (length menu-items))
1825 )
1826 )
1827 (if menu-items 1497 (if menu-items
1828 (let* ((menu-title (format "Line %d: %d error(s), %d warning(s)" line-no 1498 (let* ((menu-title (format "Line %d: %d error(s), %d warning(s)" line-no
1829 (flymake-get-line-err-count line-err-info-list "e") 1499 (flymake-get-line-err-count line-err-info-list "e")
1830 (flymake-get-line-err-count line-err-info-list "w")))) 1500 (flymake-get-line-err-count line-err-info-list "w"))))
1831 (list menu-title menu-items) 1501 (list menu-title menu-items))
1832 ) 1502 nil)))
1833 ;else
1834 nil
1835 )
1836 )
1837)
1838 1503
1839(defun flymake-goto-file-and-line(file line) 1504(defun flymake-goto-file-and-line (file line)
1840 "try to get buffer for file and goto line line in it" 1505 "Try to get buffer for file and goto line line in it"
1841 (if (not (file-exists-p file)) 1506 (if (not (file-exists-p file))
1842 (flymake-log 1 "file %s does not exists" file) 1507 (flymake-log 1 "file %s does not exists" file)
1843 ;else
1844 (progn 1508 (progn
1845 (find-file file) 1509 (find-file file)
1846 (goto-line line) 1510 (goto-line line))))
1847 )
1848 )
1849)
1850;; flymake minor mode declarations
1851 1511
1512;; flymake minor mode declarations
1852(defvar flymake-mode nil) 1513(defvar flymake-mode nil)
1514
1853(make-variable-buffer-local 'flymake-mode) 1515(make-variable-buffer-local 'flymake-mode)
1854 1516
1855(defvar flymake-mode-line nil 1517(defvar flymake-mode-line nil
1856 "" 1518 "")
1857) 1519
1858(make-variable-buffer-local 'flymake-mode-line) 1520(make-variable-buffer-local 'flymake-mode-line)
1859(defun flymake-get-buffer-mode-line(buffer) 1521
1860 (flymake-get-buffer-var buffer 'flymake-mode-line) 1522(defun flymake-get-buffer-mode-line (buffer)
1861) 1523 (flymake-get-buffer-var buffer 'flymake-mode-line))
1862(defun flymake-set-buffer-mode-line(buffer mode-line-string) 1524
1863 (flymake-set-buffer-var buffer 'flymake-mode-line mode-line-string) 1525(defun flymake-set-buffer-mode-line (buffer mode-line-string)
1864) 1526 (flymake-set-buffer-var buffer 'flymake-mode-line mode-line-string))
1865 1527
1866(defvar flymake-mode-line-e-w nil) 1528(defvar flymake-mode-line-e-w nil)
1529
1867(make-variable-buffer-local 'flymake-mode-line-e-w) 1530(make-variable-buffer-local 'flymake-mode-line-e-w)
1868(defun flymake-get-buffer-mode-line-e-w(buffer) 1531
1869 (flymake-get-buffer-var buffer 'flymake-mode-line-e-w) 1532(defun flymake-get-buffer-mode-line-e-w (buffer)
1870) 1533 (flymake-get-buffer-var buffer 'flymake-mode-line-e-w))
1871(defun flymake-set-buffer-mode-line-e-w(buffer e-w) 1534
1872 (flymake-set-buffer-var buffer 'flymake-mode-line-e-w e-w) 1535(defun flymake-set-buffer-mode-line-e-w (buffer e-w)
1873) 1536 (flymake-set-buffer-var buffer 'flymake-mode-line-e-w e-w))
1874 1537
1875(defvar flymake-mode-line-status nil) 1538(defvar flymake-mode-line-status nil)
1539
1876(make-variable-buffer-local 'flymake-mode-line-status) 1540(make-variable-buffer-local 'flymake-mode-line-status)
1877(defun flymake-get-buffer-mode-line-status(buffer)
1878 (flymake-get-buffer-var buffer 'flymake-mode-line-status)
1879)
1880(defun flymake-set-buffer-mode-line-status(buffer status)
1881 (flymake-set-buffer-var buffer 'flymake-mode-line-status status)
1882)
1883 1541
1884(defun flymake-report-status(buffer e-w &optional status) 1542(defun flymake-get-buffer-mode-line-status (buffer)
1885 "show status in the mode line" 1543 (flymake-get-buffer-var buffer 'flymake-mode-line-status))
1544
1545(defun flymake-set-buffer-mode-line-status (buffer status)
1546 (flymake-set-buffer-var buffer 'flymake-mode-line-status status))
1547
1548(defun flymake-report-status (buffer e-w &optional status)
1549 "Show status in mode line."
1886 (when (bufferp buffer) 1550 (when (bufferp buffer)
1887 (save-excursion 1551 (save-excursion
1888 (set-buffer buffer) 1552 (set-buffer buffer)
@@ -1890,33 +1554,25 @@ Whenether a buffer for master-file-name exists, use it as a source instead of re
1890 (flymake-set-buffer-mode-line-e-w buffer e-w) 1554 (flymake-set-buffer-mode-line-e-w buffer e-w)
1891 ) 1555 )
1892 (when status 1556 (when status
1893 (flymake-set-buffer-mode-line-status buffer status) 1557 (flymake-set-buffer-mode-line-status buffer status))
1894 )
1895 (let* ((mode-line " Flymake")) 1558 (let* ((mode-line " Flymake"))
1896 (when (> (length (flymake-get-buffer-mode-line-e-w buffer)) 0) 1559 (when (> (length (flymake-get-buffer-mode-line-e-w buffer)) 0)
1897 (setq mode-line (concat mode-line ":" (flymake-get-buffer-mode-line-e-w buffer))) 1560 (setq mode-line (concat mode-line ":" (flymake-get-buffer-mode-line-e-w buffer))))
1898 )
1899 (setq mode-line (concat mode-line (flymake-get-buffer-mode-line-status buffer))) 1561 (setq mode-line (concat mode-line (flymake-get-buffer-mode-line-status buffer)))
1900 (flymake-set-buffer-mode-line buffer mode-line) 1562 (flymake-set-buffer-mode-line buffer mode-line)
1901 (force-mode-line-update) 1563 (force-mode-line-update)))))
1902 )
1903 )
1904 )
1905)
1906 1564
1907(defun flymake-display-warning(warning) 1565(defun flymake-display-warning (warning)
1908 "display a warning to the user" 1566 "Display a warning to user."
1909 (message-box warning) 1567 (message-box warning))
1910)
1911 1568
1912(defcustom flymake-gui-warnings-enabled t 1569(defcustom flymake-gui-warnings-enabled t
1913 "enables/disables gui warnings" 1570 "Enables/disables gui warnings."
1914 :group 'flymake 1571 :group 'flymake
1915 :type 'boolean 1572 :type 'boolean)
1916)
1917 1573
1918(defun flymake-report-fatal-status(buffer status warning) 1574(defun flymake-report-fatal-status (buffer status warning)
1919 "display a warning and switch flymake mode OFF" 1575 "Display a warning and switch flymake mode off."
1920 (when flymake-gui-warnings-enabled 1576 (when flymake-gui-warnings-enabled
1921 (flymake-display-warning (format "Flymake: %s. Flymake will be switched OFF" warning)) 1577 (flymake-display-warning (format "Flymake: %s. Flymake will be switched OFF" warning))
1922 ) 1578 )
@@ -1924,12 +1580,10 @@ Whenether a buffer for master-file-name exists, use it as a source instead of re
1924 (set-buffer buffer) 1580 (set-buffer buffer)
1925 (flymake-mode 0) 1581 (flymake-mode 0)
1926 (flymake-log 0 "switched OFF Flymake mode for buffer %s due to fatal status %s, warning %s" 1582 (flymake-log 0 "switched OFF Flymake mode for buffer %s due to fatal status %s, warning %s"
1927 (buffer-name buffer) status warning) 1583 (buffer-name buffer) status warning)))
1928 )
1929)
1930 1584
1931(defun flymake-mode(&optional arg) 1585(defun flymake-mode (&optional arg)
1932 "toggle flymake-mode" 1586 "Toggle flymake mode on/off."
1933 (interactive) 1587 (interactive)
1934 (let ((old-flymake-mode flymake-mode) 1588 (let ((old-flymake-mode flymake-mode)
1935 (turn-on nil)) 1589 (turn-on nil))
@@ -1938,30 +1592,27 @@ Whenether a buffer for master-file-name exists, use it as a source instead of re
1938 (if (null arg) 1592 (if (null arg)
1939 (not flymake-mode) 1593 (not flymake-mode)
1940 ;else 1594 ;else
1941 (> (prefix-numeric-value arg) 0)) 1595 (> (prefix-numeric-value arg) 0)))
1942 )
1943 1596
1944 (if turn-on 1597 (if turn-on
1945 (if (flymake-can-syntax-check-file (buffer-file-name)) 1598 (if (flymake-can-syntax-check-file (buffer-file-name))
1946 (flymake-mode-on) 1599 (flymake-mode-on)
1947 ;else 1600 (flymake-log 2 "flymake cannot check syntax in buffer %s" (buffer-name)))
1948 (flymake-log 2 "flymake cannot check syntax in buffer %s" (buffer-name)) 1601 (flymake-mode-off))
1949 ) 1602 (force-mode-line-update)))
1950 ;else 1603
1951 (flymake-mode-off) 1604(defcustom flymake-start-syntax-check-on-find-file t
1952 ) 1605 "Start syntax check on find file."
1953 (force-mode-line-update) 1606 :group 'flymake
1954 ) 1607 :type 'boolean)
1955)
1956 1608
1957;;;###autoload 1609;;;###autoload
1958(unless (assq 'flymake-mode minor-mode-alist) 1610(unless (assq 'flymake-mode minor-mode-alist)
1959 (setq minor-mode-alist (cons '(flymake-mode flymake-mode-line) minor-mode-alist)) 1611 (setq minor-mode-alist (cons '(flymake-mode flymake-mode-line) minor-mode-alist)))
1960)
1961 1612
1962;;;###autoload 1613;;;###autoload
1963(defun flymake-mode-on() 1614(defun flymake-mode-on ()
1964 "turn flymake mode on" 1615 "Turn flymake mode on."
1965 (when (not flymake-mode) 1616 (when (not flymake-mode)
1966 (make-local-variable 'after-change-functions) 1617 (make-local-variable 'after-change-functions)
1967 (setq after-change-functions (cons 'flymake-after-change-function after-change-functions)) 1618 (setq after-change-functions (cons 'flymake-after-change-function after-change-functions))
@@ -1976,14 +1627,11 @@ Whenether a buffer for master-file-name exists, use it as a source instead of re
1976 (setq flymake-mode t) 1627 (setq flymake-mode t)
1977 (flymake-log 1 "flymake mode turned ON for buffer %s" (buffer-name (current-buffer))) 1628 (flymake-log 1 "flymake mode turned ON for buffer %s" (buffer-name (current-buffer)))
1978 (when flymake-start-syntax-check-on-find-file 1629 (when flymake-start-syntax-check-on-find-file
1979 (flymake-start-syntax-check-for-current-buffer) ; will be started by on-load hook 1630 (flymake-start-syntax-check-for-current-buffer)))) ; will be started by on-load hook
1980 )
1981 )
1982)
1983 1631
1984;;;###autoload 1632;;;###autoload
1985(defun flymake-mode-off() 1633(defun flymake-mode-off ()
1986 "turn flymake mode off" 1634 "Turn flymake mode off."
1987 (when flymake-mode 1635 (when flymake-mode
1988 (setq after-change-functions (delq 'flymake-after-change-function after-change-functions)) 1636 (setq after-change-functions (delq 'flymake-after-change-function after-change-functions))
1989 (remove-hook 'after-save-hook (function flymake-after-save-hook) t) 1637 (remove-hook 'after-save-hook (function flymake-after-save-hook) t)
@@ -1994,57 +1642,39 @@ Whenether a buffer for master-file-name exists, use it as a source instead of re
1994 1642
1995 (when (flymake-get-buffer-timer (current-buffer)) 1643 (when (flymake-get-buffer-timer (current-buffer))
1996 (cancel-timer (flymake-get-buffer-timer (current-buffer))) 1644 (cancel-timer (flymake-get-buffer-timer (current-buffer)))
1997 (flymake-set-buffer-timer (current-buffer) nil) 1645 (flymake-set-buffer-timer (current-buffer) nil))
1998 )
1999 1646
2000 (flymake-set-buffer-is-running (current-buffer) nil) 1647 (flymake-set-buffer-is-running (current-buffer) nil)
2001 1648
2002 (setq flymake-mode nil) 1649 (setq flymake-mode nil)
2003 (flymake-log 1 "flymake mode turned OFF for buffer %s" (buffer-name (current-buffer))) 1650 (flymake-log 1 "flymake mode turned OFF for buffer %s" (buffer-name (current-buffer)))))
2004 )
2005)
2006 1651
2007(defcustom flymake-start-syntax-check-on-newline t 1652(defcustom flymake-start-syntax-check-on-newline t
2008 "start syntax check if newline char was added/removed from the buffer" 1653 "Start syntax check if newline char was added/removed from the buffer."
2009 :group 'flymake 1654 :group 'flymake
2010 :type 'boolean 1655 :type 'boolean)
2011)
2012 1656
2013(defun flymake-after-change-function(start stop len) 1657(defun flymake-after-change-function (start stop len)
2014 "Start syntax check for current buffer if it isn't already running" 1658 "Start syntax check for current buffer if it isn't already running"
2015 ;+(flymake-log 0 "setting change time to %s" (flymake-float-time)) 1659 ;+(flymake-log 0 "setting change time to %s" (flymake-float-time))
2016 (let((new-text (buffer-substring start stop))) 1660 (let((new-text (buffer-substring start stop)))
2017 (when (and flymake-start-syntax-check-on-newline (equal new-text "\n")) 1661 (when (and flymake-start-syntax-check-on-newline (equal new-text "\n"))
2018 (flymake-log 3 "starting syntax check as new-line has been seen") 1662 (flymake-log 3 "starting syntax check as new-line has been seen")
2019 (flymake-start-syntax-check-for-current-buffer) 1663 (flymake-start-syntax-check-for-current-buffer))
2020 ) 1664 (flymake-set-buffer-last-change-time (current-buffer) (flymake-float-time))))
2021 (flymake-set-buffer-last-change-time (current-buffer) (flymake-float-time))
2022 )
2023)
2024 1665
2025(defun flymake-after-save-hook() 1666(defun flymake-after-save-hook ()
2026 (if (local-variable-p 'flymake-mode (current-buffer)) ; (???) other way to determine whether flymake is active in buffer being saved? 1667 (if (local-variable-p 'flymake-mode (current-buffer)) ; (???) other way to determine whether flymake is active in buffer being saved?
2027 (progn 1668 (progn
2028 (flymake-log 3 "starting syntax check as buffer was saved") 1669 (flymake-log 3 "starting syntax check as buffer was saved")
2029 (flymake-start-syntax-check-for-current-buffer) ; no more mode 3. cannot start check if mode 3 (to temp copies) is active - (???) 1670 (flymake-start-syntax-check-for-current-buffer)))) ; no more mode 3. cannot start check if mode 3 (to temp copies) is active - (???)
2030 )
2031 )
2032)
2033 1671
2034(defun flymake-kill-buffer-hook() 1672(defun flymake-kill-buffer-hook ()
2035 (when (flymake-get-buffer-timer (current-buffer)) 1673 (when (flymake-get-buffer-timer (current-buffer))
2036 (cancel-timer (flymake-get-buffer-timer (current-buffer))) 1674 (cancel-timer (flymake-get-buffer-timer (current-buffer)))
2037 (flymake-set-buffer-timer (current-buffer) nil) 1675 (flymake-set-buffer-timer (current-buffer) nil)))
2038 )
2039)
2040
2041(defcustom flymake-start-syntax-check-on-find-file t
2042 "statr syntax check on find file"
2043 :group 'flymake
2044 :type 'boolean
2045)
2046 1676
2047(defun flymake-find-file-hook() 1677(defun flymake-find-file-hook ()
2048 ;+(when flymake-start-syntax-check-on-find-file 1678 ;+(when flymake-start-syntax-check-on-find-file
2049 ;+ (flymake-log 3 "starting syntax check on file open") 1679 ;+ (flymake-log 3 "starting syntax check on file open")
2050 ;+ (flymake-start-syntax-check-for-current-buffer) 1680 ;+ (flymake-start-syntax-check-for-current-buffer)
@@ -2052,153 +1682,109 @@ Whenether a buffer for master-file-name exists, use it as a source instead of re
2052 (when (and (not (local-variable-p 'flymake-mode (current-buffer))) 1682 (when (and (not (local-variable-p 'flymake-mode (current-buffer)))
2053 (flymake-can-syntax-check-file (buffer-file-name (current-buffer)))) 1683 (flymake-can-syntax-check-file (buffer-file-name (current-buffer))))
2054 (flymake-mode) 1684 (flymake-mode)
2055 (flymake-log 3 "automatically turned ON flymake mode") 1685 (flymake-log 3 "automatically turned ON flymake mode")))
2056 )
2057)
2058 1686
2059(defun flymake-get-first-err-line-no(err-info-list) 1687(defun flymake-get-first-err-line-no (err-info-list)
2060 "return first line-no with error" 1688 "Return first line with error."
2061 (when err-info-list 1689 (when err-info-list
2062 (flymake-er-get-line (car err-info-list)) 1690 (flymake-er-get-line (car err-info-list))))
2063 )
2064)
2065 1691
2066(defun flymake-get-last-err-line-no(err-info-list) 1692(defun flymake-get-last-err-line-no (err-info-list)
2067 "return last line-no with error" 1693 "Return last line with error."
2068 (when err-info-list 1694 (when err-info-list
2069 (flymake-er-get-line (nth (1- (length err-info-list)) err-info-list)) 1695 (flymake-er-get-line (nth (1- (length err-info-list)) err-info-list))))
2070 )
2071)
2072 1696
2073(defun flymake-get-next-err-line-no(err-info-list line-no) 1697(defun flymake-get-next-err-line-no (err-info-list line-no)
2074 "return next line with erroe" 1698 "Return next line with error."
2075 (when err-info-list 1699 (when err-info-list
2076 (let* ((count (length err-info-list)) 1700 (let* ((count (length err-info-list))
2077 (idx 0)) 1701 (idx 0))
2078 (while (and (< idx count) (>= line-no (flymake-er-get-line (nth idx err-info-list)))) 1702 (while (and (< idx count) (>= line-no (flymake-er-get-line (nth idx err-info-list))))
2079 (setq idx (1+ idx)) 1703 (setq idx (1+ idx)))
2080 )
2081 (if (< idx count) 1704 (if (< idx count)
2082 (flymake-er-get-line (nth idx err-info-list)) 1705 (flymake-er-get-line (nth idx err-info-list))))))
2083 )
2084 )
2085 )
2086)
2087 1706
2088(defun flymake-get-prev-err-line-no(err-info-list line-no) 1707(defun flymake-get-prev-err-line-no (err-info-list line-no)
2089 "return prev line with error" 1708 "Return prev line with error."
2090 (when err-info-list 1709 (when err-info-list
2091 (let* ((count (length err-info-list))) 1710 (let* ((count (length err-info-list)))
2092 (while (and (> count 0) (<= line-no (flymake-er-get-line (nth (1- count) err-info-list)))) 1711 (while (and (> count 0) (<= line-no (flymake-er-get-line (nth (1- count) err-info-list))))
2093 (setq count (1- count)) 1712 (setq count (1- count)))
2094 )
2095 (if (> count 0) 1713 (if (> count 0)
2096 (flymake-er-get-line (nth (1- count) err-info-list)) 1714 (flymake-er-get-line (nth (1- count) err-info-list))))))
2097 )
2098 )
2099 )
2100)
2101 1715
2102(defun flymake-skip-whitespace() 1716(defun flymake-skip-whitespace ()
2103 "move forward until nonwhitespace is reached" 1717 "Move forward until non-whitespace is reached."
2104 (while (looking-at "[ \t]") 1718 (while (looking-at "[ \t]")
2105 (forward-char) 1719 (forward-char)))
2106 )
2107)
2108 1720
2109(defun flymake-goto-line(line-no) 1721(defun flymake-goto-line (line-no)
2110 "goto-line, then skip whitespace" 1722 "goto-line, then skip whitespace"
2111 (goto-line line-no) 1723 (goto-line line-no)
2112 (flymake-skip-whitespace) 1724 (flymake-skip-whitespace))
2113)
2114 1725
2115(defun flymake-goto-next-error() 1726(defun flymake-goto-next-error ()
2116 "go to next error in err ring" 1727 "go to next error in err ring"
2117 (interactive) 1728 (interactive)
2118 (let ((line-no (flymake-get-next-err-line-no (flymake-get-buffer-err-info (current-buffer)) (flymake-current-line-no)))) 1729 (let ((line-no (flymake-get-next-err-line-no (flymake-get-buffer-err-info (current-buffer)) (flymake-current-line-no))))
2119 (when (not line-no) 1730 (when (not line-no)
2120 (setq line-no (flymake-get-first-err-line-no (flymake-get-buffer-err-info (current-buffer)))) 1731 (setq line-no (flymake-get-first-err-line-no (flymake-get-buffer-err-info (current-buffer))))
2121 (flymake-log 1 "passed end of file") 1732 (flymake-log 1 "passed end of file"))
2122 )
2123 (if line-no 1733 (if line-no
2124 (flymake-goto-line line-no) 1734 (flymake-goto-line line-no)
2125 ;else 1735 (flymake-log 1 "no errors in current buffer"))))
2126 (flymake-log 1 "no errors in current buffer")
2127 )
2128 )
2129)
2130 1736
2131(defun flymake-goto-prev-error() 1737(defun flymake-goto-prev-error ()
2132 "go to prev error in err ring" 1738 "go to prev error in err ring"
2133 (interactive) 1739 (interactive)
2134 (let ((line-no (flymake-get-prev-err-line-no (flymake-get-buffer-err-info (current-buffer)) (flymake-current-line-no)))) 1740 (let ((line-no (flymake-get-prev-err-line-no (flymake-get-buffer-err-info (current-buffer)) (flymake-current-line-no))))
2135 (when (not line-no) 1741 (when (not line-no)
2136 (setq line-no (flymake-get-last-err-line-no (flymake-get-buffer-err-info (current-buffer)))) 1742 (setq line-no (flymake-get-last-err-line-no (flymake-get-buffer-err-info (current-buffer))))
2137 (flymake-log 1 "passed beginning of file") 1743 (flymake-log 1 "passed beginning of file"))
2138 )
2139 (if line-no 1744 (if line-no
2140 (flymake-goto-line line-no) 1745 (flymake-goto-line line-no)
2141 ;else 1746 (flymake-log 1 "no errors in current buffer"))))
2142 (flymake-log 1 "no errors in current buffer")
2143 )
2144 )
2145)
2146 1747
2147(defun flymake-patch-err-text(string) 1748(defun flymake-patch-err-text (string)
2148 (if (string-match "^[\n\t :0-9]*\\(.*\\)$" string) 1749 (if (string-match "^[\n\t :0-9]*\\(.*\\)$" string)
2149 (match-string 1 string) 1750 (match-string 1 string)
2150 ;else 1751 string))
2151 string
2152 )
2153)
2154 1752
2155;;;; general init-cleanup and helper routines 1753;;;; general init-cleanup and helper routines
2156 1754(defun flymake-create-temp-inplace (file-name prefix)
2157(defun flymake-create-temp-inplace(file-name prefix)
2158 (unless (stringp file-name) 1755 (unless (stringp file-name)
2159 (error "invalid file-name") 1756 (error "Invalid file-name"))
2160 )
2161 (or prefix 1757 (or prefix
2162 (setq prefix "flymake") 1758 (setq prefix "flymake"))
2163 )
2164 (let* ((temp-name (concat (file-name-sans-extension file-name) 1759 (let* ((temp-name (concat (file-name-sans-extension file-name)
2165 "_" prefix 1760 "_" prefix
2166 (and (file-name-extension file-name) 1761 (and (file-name-extension file-name)
2167 (concat "." (file-name-extension file-name)))))) 1762 (concat "." (file-name-extension file-name))))))
2168 (flymake-log 3 "create-temp-inplace: file=%s temp=%s" file-name temp-name) 1763 (flymake-log 3 "create-temp-inplace: file=%s temp=%s" file-name temp-name)
2169 temp-name 1764 temp-name))
2170 )
2171)
2172 1765
2173(defun flymake-create-temp-with-folder-structure(file-name prefix) 1766(defun flymake-create-temp-with-folder-structure (file-name prefix)
2174 (unless (stringp file-name) 1767 (unless (stringp file-name)
2175 (error "invalid file-name") 1768 (error "Invalid file-name"))
2176 )
2177 1769
2178 (let* ((dir (file-name-directory file-name)) 1770 (let* ((dir (file-name-directory file-name))
2179 (slash-pos (string-match "/" dir)) 1771 (slash-pos (string-match "/" dir))
2180 (temp-dir (concat (flymake-ensure-ends-with-slash (flymake-get-temp-dir)) (substring dir (1+ slash-pos))))) 1772 (temp-dir (concat (flymake-ensure-ends-with-slash (flymake-get-temp-dir)) (substring dir (1+ slash-pos)))))
2181 1773
2182 (file-truename (concat (flymake-ensure-ends-with-slash temp-dir) 1774 (file-truename (concat (flymake-ensure-ends-with-slash temp-dir)
2183 (file-name-nondirectory file-name))) 1775 (file-name-nondirectory file-name)))))
2184 )
2185)
2186 1776
2187(defun flymake-strrchr(str ch) 1777(defun flymake-strrchr (str ch)
2188 (let* ((count (length str)) 1778 (let* ((count (length str))
2189 (pos nil)) 1779 (pos nil))
2190 (while (and (not pos) (> count 0)) 1780 (while (and (not pos) (> count 0))
2191 (if (= ch (elt str (1- count))) 1781 (if (= ch (elt str (1- count)))
2192 (setq pos (1- count)) 1782 (setq pos (1- count)))
2193 ) 1783 (setq count (1- count)))
2194 (setq count (1- count)) 1784 pos))
2195 )
2196 pos
2197 )
2198)
2199 1785
2200(defun flymake-delete-temp-directory(dir-name) 1786(defun flymake-delete-temp-directory (dir-name)
2201 "attempt to delete temp dir created by flymake-create-temp-with-folder-structure, do not fail on error" 1787 "attempt to delete temp dir created by flymake-create-temp-with-folder-structure, do not fail on error."
2202 (let* ((temp-dir (flymake-get-temp-dir)) 1788 (let* ((temp-dir (flymake-get-temp-dir))
2203 (suffix (substring dir-name (1+ (length temp-dir)))) 1789 (suffix (substring dir-name (1+ (length temp-dir))))
2204 (slash-pos nil)) 1790 (slash-pos nil))
@@ -2209,35 +1795,27 @@ Whenether a buffer for master-file-name exists, use it as a source instead of re
2209 (setq slash-pos (flymake-strrchr suffix (string-to-char "/"))) 1795 (setq slash-pos (flymake-strrchr suffix (string-to-char "/")))
2210 (if slash-pos 1796 (if slash-pos
2211 (setq suffix (substring suffix 0 slash-pos)) 1797 (setq suffix (substring suffix 0 slash-pos))
2212 ;else 1798 (setq suffix "")))))
2213 (setq suffix "")
2214 )
2215 )
2216 )
2217)
2218 1799
2219(defun flymake-init-create-temp-buffer-copy(buffer create-temp-f) 1800(defun flymake-init-create-temp-buffer-copy (buffer create-temp-f)
2220 "make a temporary copy of the current buffer, save its name in buffer data and return the name" 1801 "Make a temporary copy of the current buffer, save its name in buffer data and return the name."
2221 (let* ((source-file-name (buffer-file-name buffer)) 1802 (let* ((source-file-name (buffer-file-name buffer))
2222 (temp-source-file-name (funcall create-temp-f source-file-name "flymake"))) 1803 (temp-source-file-name (funcall create-temp-f source-file-name "flymake")))
2223 1804
2224 (flymake-save-buffer-in-file buffer temp-source-file-name) 1805 (flymake-save-buffer-in-file buffer temp-source-file-name)
2225 (flymake-set-buffer-value buffer "temp-source-file-name" temp-source-file-name) 1806 (flymake-set-buffer-value buffer "temp-source-file-name" temp-source-file-name)
1807 temp-source-file-name))
2226 1808
2227 temp-source-file-name 1809(defun flymake-simple-cleanup (buffer)
2228 ) 1810 "Do cleanup after 'flymake-init-create-temp-buffer-copy'.
2229) 1811Delete temp file."
2230
2231(defun flymake-simple-cleanup(buffer)
2232 "cleanup after flymake-init-create-temp-buffer-copy -- delete temp file"
2233 (let* ((temp-source-file-name (flymake-get-buffer-value buffer "temp-source-file-name"))) 1812 (let* ((temp-source-file-name (flymake-get-buffer-value buffer "temp-source-file-name")))
2234 (flymake-safe-delete-file temp-source-file-name) 1813 (flymake-safe-delete-file temp-source-file-name)
2235 (flymake-set-buffer-last-change-time buffer nil) 1814 (flymake-set-buffer-last-change-time buffer nil)))
2236 )
2237)
2238 1815
2239(defun flymake-get-real-file-name(buffer file-name-from-err-msg) 1816(defun flymake-get-real-file-name (buffer file-name-from-err-msg)
2240 "Translate file name from error message to `real' file name. Return full-name. Names are real, not patched" 1817 "Translate file name from error message to `real' file name.
1818Return full-name. Names are real, not patched."
2241 (let* ((real-name nil) 1819 (let* ((real-name nil)
2242 (source-file-name (buffer-file-name buffer)) 1820 (source-file-name (buffer-file-name buffer))
2243 (master-file-name (flymake-get-buffer-value buffer "master-file-name")) 1821 (master-file-name (flymake-get-buffer-value buffer "master-file-name"))
@@ -2252,24 +1830,19 @@ Whenether a buffer for master-file-name exists, use it as a source instead of re
2252 (list temp-master-file-name master-file-name)))) 1830 (list temp-master-file-name master-file-name))))
2253 1831
2254 (when (equal 0 (length file-name-from-err-msg)) 1832 (when (equal 0 (length file-name-from-err-msg))
2255 (setq file-name-from-err-msg source-file-name) 1833 (setq file-name-from-err-msg source-file-name))
2256 )
2257 1834
2258 (setq real-name (flymake-get-full-patched-file-name file-name-from-err-msg base-dirs files)) 1835 (setq real-name (flymake-get-full-patched-file-name file-name-from-err-msg base-dirs files))
2259 ; if real-name is nil, than file name from err msg is none of the files we've patched 1836 ; if real-name is nil, than file name from err msg is none of the files we've patched
2260 (if (not real-name) 1837 (if (not real-name)
2261 (setq real-name (flymake-get-full-nonpatched-file-name file-name-from-err-msg base-dirs)) 1838 (setq real-name (flymake-get-full-nonpatched-file-name file-name-from-err-msg base-dirs)))
2262 )
2263 (if (not real-name) 1839 (if (not real-name)
2264 (setq real-name file-name-from-err-msg) 1840 (setq real-name file-name-from-err-msg))
2265 )
2266 (setq real-name (flymake-fix-path-name real-name)) 1841 (setq real-name (flymake-fix-path-name real-name))
2267 (flymake-log 3 "get-real-file-name: file-name=%s real-name=%s" file-name-from-err-msg real-name) 1842 (flymake-log 3 "get-real-file-name: file-name=%s real-name=%s" file-name-from-err-msg real-name)
2268 real-name 1843 real-name))
2269 )
2270)
2271 1844
2272(defun flymake-get-full-patched-file-name(file-name-from-err-msg base-dirs files) 1845(defun flymake-get-full-patched-file-name (file-name-from-err-msg base-dirs files)
2273 (let* ((base-dirs-count (length base-dirs)) 1846 (let* ((base-dirs-count (length base-dirs))
2274 (file-count (length files)) 1847 (file-count (length files))
2275 (real-name nil)) 1848 (real-name nil))
@@ -2284,48 +1857,31 @@ Whenether a buffer for master-file-name exists, use it as a source instead of re
2284 (when (and this-dir this-file (flymake-same-files 1857 (when (and this-dir this-file (flymake-same-files
2285 (flymake-get-absolute-file-name-basedir file-name-from-err-msg this-dir) 1858 (flymake-get-absolute-file-name-basedir file-name-from-err-msg this-dir)
2286 this-file)) 1859 this-file))
2287 (setq real-name this-real-name) 1860 (setq real-name this-real-name)))
2288 ) 1861 (setq file-count (1- file-count)))
2289 ) 1862 (setq base-dirs-count (1- base-dirs-count)))
2290 (setq file-count (1- file-count)) 1863 real-name))
2291 )
2292 (setq base-dirs-count (1- base-dirs-count))
2293 )
2294 real-name
2295 )
2296)
2297 1864
2298(defun flymake-get-full-nonpatched-file-name(file-name-from-err-msg base-dirs) 1865(defun flymake-get-full-nonpatched-file-name (file-name-from-err-msg base-dirs)
2299 (let* ((real-name nil)) 1866 (let* ((real-name nil))
2300 (if (file-name-absolute-p file-name-from-err-msg) 1867 (if (file-name-absolute-p file-name-from-err-msg)
2301 (setq real-name file-name-from-err-msg) 1868 (setq real-name file-name-from-err-msg)
2302 ;else
2303 (let* ((base-dirs-count (length base-dirs))) 1869 (let* ((base-dirs-count (length base-dirs)))
2304 (while (and (not real-name) (> base-dirs-count 0)) 1870 (while (and (not real-name) (> base-dirs-count 0))
2305 (let* ((full-name (flymake-get-absolute-file-name-basedir file-name-from-err-msg 1871 (let* ((full-name (flymake-get-absolute-file-name-basedir file-name-from-err-msg
2306 (nth (1- base-dirs-count) base-dirs)))) 1872 (nth (1- base-dirs-count) base-dirs))))
2307 (if (file-exists-p full-name) 1873 (if (file-exists-p full-name)
2308 (setq real-name full-name) 1874 (setq real-name full-name))
2309 ) 1875 (setq base-dirs-count (1- base-dirs-count))))))
2310 (setq base-dirs-count (1- base-dirs-count)) 1876 real-name))
2311 )
2312 )
2313 )
2314 )
2315 real-name
2316 )
2317)
2318 1877
2319(defun flymake-get-absolute-file-name-basedir(file-name dir-name) 1878(defun flymake-get-absolute-file-name-basedir (file-name dir-name)
2320 (if (file-name-absolute-p file-name) 1879 (if (file-name-absolute-p file-name)
2321 file-name 1880 file-name
2322 ;else 1881 (concat dir-name "/" file-name)))
2323 (concat dir-name "/" file-name)
2324 )
2325)
2326 1882
2327(defun flymake-init-find-buildfile-dir(buffer source-file-name buildfile-name) 1883(defun flymake-init-find-buildfile-dir (buffer source-file-name buildfile-name)
2328 "find buildfile, store its dir in buffer data and return its dir, if found" 1884 "Find buildfile, store its dir in buffer data and return its dir, if found."
2329 (let* ((buildfile-dir (flymake-find-buildfile buildfile-name 1885 (let* ((buildfile-dir (flymake-find-buildfile buildfile-name
2330 (file-name-directory source-file-name) 1886 (file-name-directory source-file-name)
2331 flymake-buildfile-dirs))) 1887 flymake-buildfile-dirs)))
@@ -2334,17 +1890,12 @@ Whenether a buffer for master-file-name exists, use it as a source instead of re
2334 (flymake-log 1 "no buildfile (%s) for %s" buildfile-name source-file-name) 1890 (flymake-log 1 "no buildfile (%s) for %s" buildfile-name source-file-name)
2335 (flymake-report-fatal-status buffer "NOMK" (format "No buildfile (%s) found for %s" buildfile-name source-file-name)) 1891 (flymake-report-fatal-status buffer "NOMK" (format "No buildfile (%s) found for %s" buildfile-name source-file-name))
2336 ) 1892 )
2337 ;else
2338 (progn 1893 (progn
2339 (flymake-set-buffer-value buffer "base-dir" buildfile-dir) 1894 (flymake-set-buffer-value buffer "base-dir" buildfile-dir)))
2340 ) 1895 buildfile-dir))
2341 )
2342 buildfile-dir
2343 )
2344)
2345 1896
2346(defun flymake-init-create-temp-source-and-master-buffer-copy(buffer get-incl-dirs-f create-temp-f master-file-masks include-regexp-list) 1897(defun flymake-init-create-temp-source-and-master-buffer-copy (buffer get-incl-dirs-f create-temp-f master-file-masks include-regexp-list)
2347 "find master file (or buffer), create it's copy along with a copy of the source file" 1898 "Find master file (or buffer), create it's copy along with a copy of the source file."
2348 (let* ((source-file-name (buffer-file-name buffer)) 1899 (let* ((source-file-name (buffer-file-name buffer))
2349 (temp-source-file-name (flymake-init-create-temp-buffer-copy buffer create-temp-f)) 1900 (temp-source-file-name (flymake-init-create-temp-buffer-copy buffer create-temp-f))
2350 (master-file-name nil) 1901 (master-file-name nil)
@@ -2359,85 +1910,67 @@ Whenether a buffer for master-file-name exists, use it as a source instead of re
2359 (flymake-log 1 "cannot find master file for %s" source-file-name) 1910 (flymake-log 1 "cannot find master file for %s" source-file-name)
2360 (flymake-report-status buffer "!" "") ; NOMASTER 1911 (flymake-report-status buffer "!" "") ; NOMASTER
2361 ) 1912 )
2362 ;else
2363 (progn 1913 (progn
2364 (setq master-file-name (nth 0 master-and-temp-master)) 1914 (setq master-file-name (nth 0 master-and-temp-master))
2365 (setq temp-master-file-name (nth 1 master-and-temp-master)) 1915 (setq temp-master-file-name (nth 1 master-and-temp-master))
2366 (flymake-set-buffer-value buffer "master-file-name" master-file-name) 1916 (flymake-set-buffer-value buffer "master-file-name" master-file-name)
2367 (flymake-set-buffer-value buffer "temp-master-file-name" temp-master-file-name) 1917 (flymake-set-buffer-value buffer "temp-master-file-name" temp-master-file-name)
2368 ) 1918 ))
2369 ) 1919 temp-master-file-name))
2370 temp-master-file-name
2371 )
2372)
2373 1920
2374(defun flymake-master-cleanup(buffer) 1921(defun flymake-master-cleanup (buffer)
2375 (flymake-simple-cleanup buffer) 1922 (flymake-simple-cleanup buffer)
2376 (flymake-safe-delete-file (flymake-get-buffer-value buffer "temp-master-file-name")) 1923 (flymake-safe-delete-file (flymake-get-buffer-value buffer "temp-master-file-name")))
2377)
2378 1924
2379;;;; make-specific init-cleanup routines 1925;;;; make-specific init-cleanup routines
2380 1926(defun flymake-get-syntax-check-program-args (source-file-name base-dir use-relative-base-dir use-relative-source get-cmd-line-f)
2381(defun flymake-get-syntax-check-program-args(source-file-name base-dir use-relative-base-dir use-relative-source get-cmd-line-f) 1927 "Create a command line for syntax check using GET-CMD-LINE-F."
2382 "create a command line for the syntax check command, using get-cmd-line-f"
2383 (let* ((my-base-dir base-dir) 1928 (let* ((my-base-dir base-dir)
2384 (my-source source-file-name)) 1929 (my-source source-file-name))
2385 1930
2386 (when use-relative-base-dir 1931 (when use-relative-base-dir
2387 (setq my-base-dir (flymake-build-relative-path (file-name-directory source-file-name) base-dir)) 1932 (setq my-base-dir (flymake-build-relative-path (file-name-directory source-file-name) base-dir)))
2388 )
2389 1933
2390 (when use-relative-source 1934 (when use-relative-source
2391 (setq my-source (concat (flymake-build-relative-path base-dir (file-name-directory source-file-name)) 1935 (setq my-source (concat (flymake-build-relative-path base-dir (file-name-directory source-file-name))
2392 (file-name-nondirectory source-file-name))) 1936 (file-name-nondirectory source-file-name))))
2393 ) 1937 (funcall get-cmd-line-f my-source my-base-dir)))
2394 1938
2395 (funcall get-cmd-line-f my-source my-base-dir) 1939(defun flymake-get-make-cmdline (source base-dir)
2396 )
2397)
2398
2399(defun flymake-get-make-cmdline(source base-dir)
2400 (list "make" 1940 (list "make"
2401 (list "-s" 1941 (list "-s"
2402 "-C" 1942 "-C"
2403 base-dir 1943 base-dir
2404 (concat "CHK_SOURCES=" source) 1944 (concat "CHK_SOURCES=" source)
2405 "SYNTAX_CHECK_MODE=1" 1945 "SYNTAX_CHECK_MODE=1"
2406 "check-syntax")) 1946 "check-syntax")))
2407)
2408 1947
2409(defun flymake-get-ant-cmdline(source base-dir) 1948(defun flymake-get-ant-cmdline (source base-dir)
2410 (list "ant" 1949 (list "ant"
2411 (list "-buildfile" 1950 (list "-buildfile"
2412 (concat base-dir "/" "build.xml") 1951 (concat base-dir "/" "build.xml")
2413 (concat "-DCHK_SOURCES=" source) 1952 (concat "-DCHK_SOURCES=" source)
2414 "check-syntax")) 1953 "check-syntax")))
2415)
2416 1954
2417(defun flymake-simple-make-init-impl(buffer create-temp-f use-relative-base-dir use-relative-source build-file-name get-cmdline-f) 1955(defun flymake-simple-make-init-impl (buffer create-temp-f use-relative-base-dir use-relative-source build-file-name get-cmdline-f)
2418 "create syntax check command line for a directly checked source file, use create-temp-f for creating temp copy" 1956 "Create syntax check command line for a directly checked source file.
2419 (let* ((args nil) 1957Use CREATE-TEMP-F for creating temp copy."
1958 (let* ((args nil)
2420 (source-file-name (buffer-file-name buffer)) 1959 (source-file-name (buffer-file-name buffer))
2421 (buildfile-dir (flymake-init-find-buildfile-dir buffer source-file-name build-file-name))) 1960 (buildfile-dir (flymake-init-find-buildfile-dir buffer source-file-name build-file-name)))
2422 (if buildfile-dir 1961 (if buildfile-dir
2423 (let* ((temp-source-file-name (flymake-init-create-temp-buffer-copy buffer create-temp-f))) 1962 (let* ((temp-source-file-name (flymake-init-create-temp-buffer-copy buffer create-temp-f)))
2424 (setq args (flymake-get-syntax-check-program-args temp-source-file-name buildfile-dir 1963 (setq args (flymake-get-syntax-check-program-args temp-source-file-name buildfile-dir
2425 use-relative-base-dir use-relative-source 1964 use-relative-base-dir use-relative-source
2426 get-cmdline-f)) 1965 get-cmdline-f))))
2427 ) 1966 args))
2428 )
2429 1967
2430 args 1968(defun flymake-simple-make-init (buffer)
2431 ) 1969 (flymake-simple-make-init-impl buffer 'flymake-create-temp-inplace t t "Makefile" 'flymake-get-make-cmdline))
2432)
2433
2434(defun flymake-simple-make-init(buffer)
2435 (flymake-simple-make-init-impl buffer 'flymake-create-temp-inplace t t "Makefile" 'flymake-get-make-cmdline)
2436)
2437 1970
2438(defun flymake-master-make-init(buffer get-incl-dirs-f master-file-masks include-regexp-list) 1971(defun flymake-master-make-init (buffer get-incl-dirs-f master-file-masks include-regexp-list)
2439 "create make command line for a source file checked via master file compilation" 1972 "create make command line for a source file checked via master file compilation"
2440 (let* ((make-args nil) 1973 (let* ((make-args nil)
2441 (temp-master-file-name (flymake-init-create-temp-source-and-master-buffer-copy 1974 (temp-master-file-name (flymake-init-create-temp-source-and-master-buffer-copy
2442 buffer get-incl-dirs-f 'flymake-create-temp-inplace 1975 buffer get-incl-dirs-f 'flymake-create-temp-inplace
2443 master-file-masks include-regexp-list))) 1976 master-file-masks include-regexp-list)))
@@ -2445,88 +1978,65 @@ Whenether a buffer for master-file-name exists, use it as a source instead of re
2445 (let* ((buildfile-dir (flymake-init-find-buildfile-dir buffer temp-master-file-name "Makefile"))) 1978 (let* ((buildfile-dir (flymake-init-find-buildfile-dir buffer temp-master-file-name "Makefile")))
2446 (if buildfile-dir 1979 (if buildfile-dir
2447 (setq make-args (flymake-get-syntax-check-program-args 1980 (setq make-args (flymake-get-syntax-check-program-args
2448 temp-master-file-name buildfile-dir nil nil 'flymake-get-make-cmdline)) 1981 temp-master-file-name buildfile-dir nil nil 'flymake-get-make-cmdline)))))
2449 ) 1982 make-args))
2450 )
2451 )
2452 1983
2453 make-args 1984(defun flymake-find-make-buildfile (source-dir)
2454 ) 1985 (flymake-find-buildfile "Makefile" source-dir flymake-buildfile-dirs))
2455)
2456
2457(defun flymake-find-make-buildfile(source-dir)
2458 (flymake-find-buildfile "Makefile" source-dir flymake-buildfile-dirs)
2459)
2460 1986
2461;;;; .h/make specific 1987;;;; .h/make specific
2462(defun flymake-master-make-header-init(buffer) 1988(defun flymake-master-make-header-init (buffer)
2463 (flymake-master-make-init buffer 1989 (flymake-master-make-init buffer
2464 'flymake-get-include-dirs 1990 'flymake-get-include-dirs
2465 '(".+\\.cpp$" ".+\\.c$") 1991 '(".+\\.cpp$" ".+\\.c$")
2466 '("[ \t]*#[ \t]*include[ \t]*\"\\([\w0-9/\\_\.]*[/\\]*\\)\\(%s\\)\"" 1 2)) 1992 '("[ \t]*#[ \t]*include[ \t]*\"\\([\w0-9/\\_\.]*[/\\]*\\)\\(%s\\)\"" 1 2)))
2467)
2468 1993
2469;;;; .java/make specific 1994;;;; .java/make specific
2470(defun flymake-simple-make-java-init(buffer) 1995(defun flymake-simple-make-java-init (buffer)
2471 (flymake-simple-make-init-impl buffer 'flymake-create-temp-with-folder-structure nil nil "Makefile" 'flymake-get-make-cmdline) 1996 (flymake-simple-make-init-impl buffer 'flymake-create-temp-with-folder-structure nil nil "Makefile" 'flymake-get-make-cmdline))
2472)
2473 1997
2474(defun flymake-simple-ant-java-init(buffer) 1998(defun flymake-simple-ant-java-init (buffer)
2475 (flymake-simple-make-init-impl buffer 'flymake-create-temp-with-folder-structure nil nil "build.xml" 'flymake-get-ant-cmdline) 1999 (flymake-simple-make-init-impl buffer 'flymake-create-temp-with-folder-structure nil nil "build.xml" 'flymake-get-ant-cmdline))
2476)
2477 2000
2478(defun flymake-simple-java-cleanup(buffer) 2001(defun flymake-simple-java-cleanup (buffer)
2479 "cleanup after flymake-simple-make-java-init -- delete temp file and dirs" 2002 "cleanup after flymake-simple-make-java-init -- delete temp file and dirs"
2480 (let* ((temp-source-file-name (flymake-get-buffer-value buffer "temp-source-file-name"))) 2003 (let* ((temp-source-file-name (flymake-get-buffer-value buffer "temp-source-file-name")))
2481 (flymake-safe-delete-file temp-source-file-name) 2004 (flymake-safe-delete-file temp-source-file-name)
2482 (when temp-source-file-name 2005 (when temp-source-file-name
2483 (flymake-delete-temp-directory (file-name-directory temp-source-file-name)) 2006 (flymake-delete-temp-directory (file-name-directory temp-source-file-name)))))
2484 )
2485 )
2486)
2487 2007
2488;;;; perl-specific init-cleanup routines 2008;;;; perl-specific init-cleanup routines
2489 2009(defun flymake-perl-init (buffer)
2490(defun flymake-perl-init(buffer)
2491 (let* ((temp-file (flymake-init-create-temp-buffer-copy buffer 'flymake-create-temp-inplace)) 2010 (let* ((temp-file (flymake-init-create-temp-buffer-copy buffer 'flymake-create-temp-inplace))
2492 (local-file (concat (flymake-build-relative-path (file-name-directory (buffer-file-name (current-buffer))) 2011 (local-file (concat (flymake-build-relative-path (file-name-directory (buffer-file-name (current-buffer)))
2493 (file-name-directory temp-file)) 2012 (file-name-directory temp-file))
2494 (file-name-nondirectory temp-file)))) 2013 (file-name-nondirectory temp-file))))
2495 (list "perl" (list "-wc " local-file)) 2014 (list "perl" (list "-wc " local-file))))
2496 )
2497)
2498 2015
2499;;;; tex-specific init-cleanup routines 2016;;;; tex-specific init-cleanup routines
2500 2017(defun flymake-get-tex-args (file-name)
2501(defun flymake-get-tex-args(file-name)
2502 ;(list "latex" (list "-c-style-errors" file-name)) 2018 ;(list "latex" (list "-c-style-errors" file-name))
2503 (list "texify" (list "--pdf" "--tex-option=-c-style-errors" file-name)) 2019 (list "texify" (list "--pdf" "--tex-option=-c-style-errors" file-name)))
2504)
2505 2020
2506(defun flymake-simple-tex-init(buffer) 2021(defun flymake-simple-tex-init (buffer)
2507 (flymake-get-tex-args (flymake-init-create-temp-buffer-copy buffer 'flymake-create-temp-inplace)) 2022 (flymake-get-tex-args (flymake-init-create-temp-buffer-copy buffer 'flymake-create-temp-inplace)))
2508)
2509 2023
2510(defun flymake-master-tex-init(buffer) 2024(defun flymake-master-tex-init (buffer)
2511 (let* ((temp-master-file-name (flymake-init-create-temp-source-and-master-buffer-copy 2025 (let* ((temp-master-file-name (flymake-init-create-temp-source-and-master-buffer-copy
2512 buffer 'flymake-get-include-dirs-dot 'flymake-create-temp-inplace 2026 buffer 'flymake-get-include-dirs-dot 'flymake-create-temp-inplace
2513 '(".+\\.tex$") 2027 '(".+\\.tex$")
2514 '("[ \t]*\\input[ \t]*{\\(.*\\)\\(%s\\)}" 1 2)))) 2028 '("[ \t]*\\input[ \t]*{\\(.*\\)\\(%s\\)}" 1 2))))
2515 (when temp-master-file-name 2029 (when temp-master-file-name
2516 (flymake-get-tex-args temp-master-file-name) 2030 (flymake-get-tex-args temp-master-file-name))))
2517 )
2518 )
2519)
2520 2031
2521(defun flymake-get-include-dirs-dot(base-dir) 2032(defun flymake-get-include-dirs-dot (base-dir)
2522 '(".") 2033 '("."))
2523)
2524 2034
2525;;;; xml-specific init-cleanup routines 2035;;;; xml-specific init-cleanup routines
2526
2527(defun flymake-xml-init(buffer) 2036(defun flymake-xml-init(buffer)
2528 (list "xml" (list "val" (flymake-init-create-temp-buffer-copy buffer 'flymake-create-temp-inplace))) 2037 (list "xml" (list "val" (flymake-init-create-temp-buffer-copy buffer 'flymake-create-temp-inplace))))
2529) 2038
2039(provide 'flymake)
2530 2040
2531;;; arch-tag: 8f0d6090-061d-4cac-8862-7c151c4a02dd 2041;;; arch-tag: 8f0d6090-061d-4cac-8862-7c151c4a02dd
2532;;; flymake.el ends here 2042;;; flymake.el ends here