comparison lisp/progmodes/flymake.el @ 61943:26bd7a854809

(flymake-split-string) (flymake-split-string, flymake-log, flymake-pid-to-names) (flymake-reg-names, flymake-get-source-buffer-name) (flymake-unreg-names, flymake-add-line-err-info) (flymake-add-err-info): Clarify docstrings. (flymake-popup-menu, flymake-make-emacs-menu) (flymake-make-xemacs-menu): Add docstrings. (flymake-get-buffer-*, flymake-set-buffer-*): Functions deleted. Set variables directly throughout.
author Richard M. Stallman <rms@gnu.org>
date Sat, 30 Apr 2005 20:13:39 +0000
parents b600a84e6555
children a7e02ef1e3d6
comparison
equal deleted inserted replaced
61942:cf8e7c12c048 61943:26bd7a854809
60 (if (fboundp 'replace-regexp-in-string) 60 (if (fboundp 'replace-regexp-in-string)
61 (replace-regexp-in-string regexp rep str) 61 (replace-regexp-in-string regexp rep str)
62 (replace-in-string str regexp rep))) 62 (replace-in-string str regexp rep)))
63 63
64 (defun flymake-split-string (str pattern) 64 (defun flymake-split-string (str pattern)
65 "Split, then remove first and/or last in case it's empty." 65 "Split STR into a list of substrings bounded by PATTERN.
66 Zero-length substrings at the beginning and end of the list are omitted."
66 (let* ((splitted (split-string str pattern))) 67 (let* ((splitted (split-string str pattern)))
67 (if (and (> (length splitted) 0) (= 0 (length (elt splitted 0)))) 68 (if (and (> (length splitted) 0) (= 0 (length (elt splitted 0))))
68 (setq splitted (cdr splitted))) 69 (setq splitted (cdr splitted)))
69 (if (and (> (length splitted) 0) (= 0 (length (elt splitted (1- (length splitted)))))) 70 (if (and (> (length splitted) 0) (= 0 (length (elt splitted (1- (length splitted))))))
70 (setq splitted (reverse (cdr (reverse splitted))))) 71 (setq splitted (reverse (cdr (reverse splitted)))))
84 (if (fboundp 'line-end-position) 85 (if (fboundp 'line-end-position)
85 'line-end-position 86 'line-end-position
86 (lambda (&optional arg) (save-excursion (end-of-line arg) (point))))) 87 (lambda (&optional arg) (save-excursion (end-of-line arg) (point)))))
87 88
88 (defun flymake-popup-menu (pos menu-data) 89 (defun flymake-popup-menu (pos menu-data)
89 (if (and (fboundp 'popup-menu) (fboundp 'make-event)) 90 "Pop up the flymake menu at position POS, using the data MENU-DATA.
91 POS is a list of the form ((X Y) WINDOW), where X and Y are
92 pixels positions from the top left corner of WINDOW's frame.
93 MENU-DATA is a list of error and warning messages returned by
94 `flymake-make-err-menu-data'."
95 (if (featurep 'xemacs)
90 (let* ((x-pos (nth 0 (nth 0 pos))) 96 (let* ((x-pos (nth 0 (nth 0 pos)))
91 (y-pos (nth 1 (nth 0 pos))) 97 (y-pos (nth 1 (nth 0 pos)))
92 (fake-event-props '(button 1 x 1 y 1))) 98 (fake-event-props '(button 1 x 1 y 1)))
93 (setq fake-event-props (plist-put fake-event-props 'x x-pos)) 99 (setq fake-event-props (plist-put fake-event-props 'x x-pos))
94 (setq fake-event-props (plist-put fake-event-props 'y y-pos)) 100 (setq fake-event-props (plist-put fake-event-props 'y y-pos))
95 (popup-menu (flymake-make-xemacs-menu menu-data) (make-event 'button-press fake-event-props))) 101 (popup-menu (flymake-make-xemacs-menu menu-data) (make-event 'button-press fake-event-props)))
96 (x-popup-menu pos (flymake-make-emacs-menu menu-data)))) 102 (x-popup-menu pos (flymake-make-emacs-menu menu-data))))
97 103
98 (defun flymake-make-emacs-menu (menu-data) 104 (defun flymake-make-emacs-menu (menu-data)
105 "Return a menu specifier using MENU-DATA.
106 MENU-DATA is a list of error and warning messages returned by
107 `flymake-make-err-menu-data'.
108 See `x-popup-menu' for the menu specifier format."
99 (let* ((menu-title (nth 0 menu-data)) 109 (let* ((menu-title (nth 0 menu-data))
100 (menu-items (nth 1 menu-data)) 110 (menu-items (nth 1 menu-data))
101 (menu-commands nil)) 111 (menu-commands nil))
102 (setq menu-commands (mapcar (lambda (foo) 112 (setq menu-commands (mapcar (lambda (foo)
103 (cons (nth 0 foo) (nth 1 foo))) 113 (cons (nth 0 foo) (nth 1 foo)))
107 (if (featurep 'xemacs) (progn 117 (if (featurep 'xemacs) (progn
108 118
109 (defun flymake-nop ()) 119 (defun flymake-nop ())
110 120
111 (defun flymake-make-xemacs-menu (menu-data) 121 (defun flymake-make-xemacs-menu (menu-data)
122 "Return a menu specifier using MENU-DATA."
112 (let* ((menu-title (nth 0 menu-data)) 123 (let* ((menu-title (nth 0 menu-data))
113 (menu-items (nth 1 menu-data)) 124 (menu-items (nth 1 menu-data))
114 (menu-commands nil)) 125 (menu-commands nil))
115 (setq menu-commands (mapcar (lambda (foo) 126 (setq menu-commands (mapcar (lambda (foo)
116 (vector (nth 0 foo) (or (nth 1 foo) '(flymake-nop)) t)) 127 (vector (nth 0 foo) (or (nth 1 foo) '(flymake-nop)) t))
150 -1 = NONE, 0 = ERROR, 1 = WARNING, 2 = INFO, 3 = DEBUG" 161 -1 = NONE, 0 = ERROR, 1 = WARNING, 2 = INFO, 3 = DEBUG"
151 :group 'flymake 162 :group 'flymake
152 :type 'integer) 163 :type 'integer)
153 164
154 (defun flymake-log (level text &rest args) 165 (defun flymake-log (level text &rest args)
155 "Log a message with optional arguments." 166 "Log a message at level LEVEL.
167 If LEVEL is higher than `flymake-log-level', the message is
168 ignored. Otherwise, it is printed using `message'.
169 TEXT is a format control string, and the remaining arguments ARGS
170 are the string substitutions (see `format')."
156 (if (<= level flymake-log-level) 171 (if (<= level flymake-log-level)
157 (let* ((msg (apply 'format text args))) 172 (let* ((msg (apply 'format text args)))
158 (message msg) 173 (message msg)
159 ;;(with-temp-buffer 174 ;;(with-temp-buffer
160 ;; (insert msg) 175 ;; (insert msg)
174 (let ((tmp (copy-sequence list))) ; (???) 189 (let ((tmp (copy-sequence list))) ; (???)
175 (setcar (nthcdr pos tmp) val) 190 (setcar (nthcdr pos tmp) val)
176 tmp)) 191 tmp))
177 192
178 (defvar flymake-pid-to-names (flymake-makehash) 193 (defvar flymake-pid-to-names (flymake-makehash)
179 "pid -> source buffer name, output file name mapping.") 194 "Hash table mapping PIDs to source buffer names and output files.")
180 195
181 (defun flymake-reg-names (pid source-buffer-name) 196 (defun flymake-reg-names (pid source-buffer-name)
182 "Save into in PID map." 197 "Associate PID with SOURCE-BUFFER-NAME in `flymake-pid-to-names'."
183 (unless (stringp source-buffer-name) 198 (unless (stringp source-buffer-name)
184 (error "Invalid buffer name")) 199 (error "Invalid buffer name"))
185 (puthash pid (list source-buffer-name) flymake-pid-to-names)) 200 (puthash pid (list source-buffer-name) flymake-pid-to-names))
186 201
187 (defun flymake-get-source-buffer-name (pid) 202 (defun flymake-get-source-buffer-name (pid)
188 "Return buffer name stored in PID map." 203 "Return buffer name associated with PID in `flymake-pid-to-names'."
189 (nth 0 (gethash pid flymake-pid-to-names))) 204 (nth 0 (gethash pid flymake-pid-to-names)))
190 205
191 (defun flymake-unreg-names (pid) 206 (defun flymake-unreg-names (pid)
192 "Delete PID->buffer name mapping." 207 "Remove the entry associated with PID from `flymake-pid-to-names'."
193 (remhash pid flymake-pid-to-names)) 208 (remhash pid flymake-pid-to-names))
194
195 (defun flymake-get-buffer-var (buffer var-name)
196 "Switch to BUFFER if necessary and return local variable VAR-NAME."
197 (unless (bufferp buffer)
198 (error "Invalid buffer"))
199
200 (if (eq buffer (current-buffer))
201 (symbol-value var-name)
202 (with-current-buffer buffer
203 (symbol-value var-name))))
204
205 (defun flymake-set-buffer-var (buffer var-name var-value)
206 "Switch to BUFFER if necessary and set local variable VAR-NAME to VAR-VALUE."
207 (unless (bufferp buffer)
208 (error "Invalid buffer"))
209
210 (if (eq buffer (current-buffer))
211 (set var-name var-value)
212 (with-current-buffer buffer
213 (set var-name var-value))))
214 209
215 (defvar flymake-buffer-data (flymake-makehash) 210 (defvar flymake-buffer-data (flymake-makehash)
216 "Data specific to syntax check tool, in name-value pairs.") 211 "Data specific to syntax check tool, in name-value pairs.")
217 212
218 (make-variable-buffer-local 'flymake-buffer-data) 213 (make-variable-buffer-local 'flymake-buffer-data)
219 214
220 (defun flymake-get-buffer-data (buffer)
221 (flymake-get-buffer-var buffer 'flymake-buffer-data))
222
223 (defun flymake-set-buffer-data (buffer data)
224 (flymake-set-buffer-var buffer 'flymake-buffer-data data))
225
226 (defun flymake-get-buffer-value (buffer name) 215 (defun flymake-get-buffer-value (buffer name)
227 (gethash name (flymake-get-buffer-data buffer))) 216 (gethash name (with-current-buffer buffer flymake-buffer-data)))
228 217
229 (defun flymake-set-buffer-value (buffer name value) 218 (defun flymake-set-buffer-value (buffer name value)
230 (puthash name value (flymake-get-buffer-data buffer))) 219 (puthash name value (with-current-buffer buffer flymake-buffer-data)))
231 220
232 (defvar flymake-output-residual nil) 221 (defvar flymake-output-residual nil)
233 222
234 (make-variable-buffer-local 'flymake-output-residual) 223 (make-variable-buffer-local 'flymake-output-residual)
235
236 (defun flymake-get-buffer-output-residual (buffer)
237 (flymake-get-buffer-var buffer 'flymake-output-residual))
238
239 (defun flymake-set-buffer-output-residual (buffer residual)
240 (flymake-set-buffer-var buffer 'flymake-output-residual residual))
241 224
242 (defcustom flymake-allowed-file-name-masks 225 (defcustom flymake-allowed-file-name-masks
243 '((".+\\.c$" flymake-simple-make-init flymake-simple-cleanup flymake-get-real-file-name) 226 '((".+\\.c$" flymake-simple-make-init flymake-simple-cleanup flymake-get-real-file-name)
244 (".+\\.cpp$" flymake-simple-make-init flymake-simple-cleanup flymake-get-real-file-name) 227 (".+\\.cpp$" flymake-simple-make-init flymake-simple-cleanup flymake-get-real-file-name)
245 (".+\\.xml$" flymake-xml-init flymake-simple-cleanup flymake-get-real-file-name) 228 (".+\\.xml$" flymake-xml-init flymake-simple-cleanup flymake-get-real-file-name)
640 (when source-buffer 623 (when source-buffer
641 (with-current-buffer source-buffer 624 (with-current-buffer source-buffer
642 625
643 (flymake-parse-residual source-buffer) 626 (flymake-parse-residual source-buffer)
644 (flymake-post-syntax-check source-buffer exit-status command) 627 (flymake-post-syntax-check source-buffer exit-status command)
645 (flymake-set-buffer-is-running source-buffer nil)))) 628 (setq flymake-is-running nil))))
646 (error 629 (error
647 (let ((err-str (format "Error in process sentinel for buffer %s: %s" 630 (let ((err-str (format "Error in process sentinel for buffer %s: %s"
648 source-buffer (error-message-string err)))) 631 source-buffer (error-message-string err))))
649 (flymake-log 0 err-str) 632 (flymake-log 0 err-str)
650 (flymake-set-buffer-is-running source-buffer nil))))))) 633 (with-current-buffer source-buffer
634 (setq flymake-is-running nil))))))))
651 635
652 (defun flymake-post-syntax-check (source-buffer exit-status command) 636 (defun flymake-post-syntax-check (source-buffer exit-status command)
653 (flymake-set-buffer-err-info source-buffer (flymake-get-buffer-new-err-info source-buffer)) 637 (with-current-buffer source-buffer
654 (flymake-set-buffer-new-err-info source-buffer nil) 638 (setq flymake-err-info flymake-new-err-info)
655 639 (setq flymake-new-err-info nil)
656 (flymake-set-buffer-err-info source-buffer (flymake-fix-line-numbers 640 (setq flymake-err-info
657 (flymake-get-buffer-err-info source-buffer) 641 (flymake-fix-line-numbers
658 1 642 flymake-err-info 1 (flymake-count-lines source-buffer))))
659 (flymake-count-lines source-buffer)))
660 (flymake-delete-own-overlays source-buffer) 643 (flymake-delete-own-overlays source-buffer)
661 (flymake-highlight-err-lines source-buffer (flymake-get-buffer-err-info source-buffer)) 644 (flymake-highlight-err-lines
662 645 source-buffer (with-current-buffer source-buffer flymake-err-info))
663 (let ((err-count (flymake-get-err-count (flymake-get-buffer-err-info source-buffer) "e")) 646 (let (err-count warn-count)
664 (warn-count (flymake-get-err-count (flymake-get-buffer-err-info source-buffer) "w"))) 647 (with-current-buffer source-buffer
665 648 (setq err-count (flymake-get-err-count flymake-err-info "e"))
666 (flymake-log 2 "%s: %d error(s), %d warning(s) in %.2f second(s)" 649 (setq warn-count (flymake-get-err-count flymake-err-info "w"))
650 (flymake-log 2 "%s: %d error(s), %d warning(s) in %.2f second(s)"
667 (buffer-name source-buffer) err-count warn-count 651 (buffer-name source-buffer) err-count warn-count
668 (- (flymake-float-time) (flymake-get-buffer-check-start-time source-buffer))) 652 (- (flymake-float-time) flymake-check-start-time))
669 (flymake-set-buffer-check-start-time source-buffer nil) 653 (setq flymake-check-start-time nil))
654
670 (if (and (equal 0 err-count) (equal 0 warn-count)) 655 (if (and (equal 0 err-count) (equal 0 warn-count))
671 (if (equal 0 exit-status) 656 (if (equal 0 exit-status)
672 (flymake-report-status source-buffer "" "") ; PASSED 657 (flymake-report-status source-buffer "" "") ; PASSED
673 (if (not (flymake-get-buffer-check-was-interrupted source-buffer)) 658 (if (not (with-current-buffer source-buffer
659 flymake-check-was-interrupted))
674 (flymake-report-fatal-status (current-buffer) "CFGERR" 660 (flymake-report-fatal-status (current-buffer) "CFGERR"
675 (format "Configuration error has occured while running %s" command)) 661 (format "Configuration error has occured while running %s" command))
676 (flymake-report-status source-buffer nil ""))) ; "STOPPED" 662 (flymake-report-status source-buffer nil ""))) ; "STOPPED"
677 (flymake-report-status source-buffer (format "%d/%d" err-count warn-count) "")))) 663 (flymake-report-status source-buffer (format "%d/%d" err-count warn-count) ""))))
678 664
679 (defun flymake-parse-output-and-residual (source-buffer output) 665 (defun flymake-parse-output-and-residual (source-buffer output)
680 "Split OUTPUT into lines, merge in residual if necessary." 666 "Split OUTPUT into lines, merge in residual if necessary."
681 (with-current-buffer source-buffer 667 (with-current-buffer source-buffer
682 (let* ((buffer-residual (flymake-get-buffer-output-residual source-buffer)) 668 (let* ((buffer-residual flymake-output-residual)
683 (total-output (if buffer-residual (concat buffer-residual output) output)) 669 (total-output (if buffer-residual (concat buffer-residual output) output))
684 (lines-and-residual (flymake-split-output total-output)) 670 (lines-and-residual (flymake-split-output total-output))
685 (lines (nth 0 lines-and-residual)) 671 (lines (nth 0 lines-and-residual))
686 (new-residual (nth 1 lines-and-residual))) 672 (new-residual (nth 1 lines-and-residual)))
687 673 (with-current-buffer source-buffer
688 (flymake-set-buffer-output-residual source-buffer new-residual) 674 (setq flymake-output-residual new-residual)
689 (flymake-set-buffer-new-err-info source-buffer (flymake-parse-err-lines 675 (setq flymake-new-err-info
690 (flymake-get-buffer-new-err-info source-buffer) 676 (flymake-parse-err-lines
691 source-buffer lines))))) 677 flymake-new-err-info
678 source-buffer lines))))))
692 679
693 (defun flymake-parse-residual (source-buffer) 680 (defun flymake-parse-residual (source-buffer)
694 "Parse residual if it's non empty." 681 "Parse residual if it's non empty."
695 (with-current-buffer source-buffer 682 (with-current-buffer source-buffer
696 (when (flymake-get-buffer-output-residual source-buffer) 683 (when flymake-output-residual
697 (flymake-set-buffer-new-err-info source-buffer (flymake-parse-err-lines 684 (setq flymake-new-err-info
698 (flymake-get-buffer-new-err-info source-buffer) 685 (flymake-parse-err-lines
699 source-buffer 686 flymake-new-err-info
700 (list (flymake-get-buffer-output-residual source-buffer)))) 687 source-buffer
701 (flymake-set-buffer-output-residual source-buffer nil)))) 688 (list flymake-output-residual)))
689 (setq flymake-output-residual nil))))
702 690
703 (defvar flymake-err-info nil 691 (defvar flymake-err-info nil
704 "Sorted list of line numbers and lists of err info in the form (file, err-text).") 692 "Sorted list of line numbers and lists of err info in the form (file, err-text).")
705 693
706 (make-variable-buffer-local 'flymake-err-info) 694 (make-variable-buffer-local 'flymake-err-info)
707 695
708 (defun flymake-get-buffer-err-info (buffer)
709 (flymake-get-buffer-var buffer 'flymake-err-info))
710
711 (defun flymake-set-buffer-err-info (buffer err-info)
712 (flymake-set-buffer-var buffer 'flymake-err-info err-info))
713
714 (defun flymake-er-make-er (line-no line-err-info-list) 696 (defun flymake-er-make-er (line-no line-err-info-list)
715 (list line-no line-err-info-list)) 697 (list line-no line-err-info-list))
716 698
717 (defun flymake-er-get-line (err-info) 699 (defun flymake-er-get-line (err-info)
718 (nth 0 err-info)) 700 (nth 0 err-info))
722 704
723 (defvar flymake-new-err-info nil 705 (defvar flymake-new-err-info nil
724 "Same as 'flymake-err-info', effective when a syntax check is in progress.") 706 "Same as 'flymake-err-info', effective when a syntax check is in progress.")
725 707
726 (make-variable-buffer-local 'flymake-new-err-info) 708 (make-variable-buffer-local 'flymake-new-err-info)
727
728 (defun flymake-get-buffer-new-err-info (buffer)
729 (flymake-get-buffer-var buffer 'flymake-new-err-info))
730
731 (defun flymake-set-buffer-new-err-info (buffer new-err-info)
732 (flymake-set-buffer-var buffer 'flymake-new-err-info new-err-info))
733 709
734 ;; getters/setters for line-err-info: (file, line, type, text). 710 ;; getters/setters for line-err-info: (file, line, type, text).
735 (defun flymake-ler-make-ler (file line type text &optional full-file) 711 (defun flymake-ler-make-ler (file line type text &optional full-file)
736 (list file line type text full-file)) 712 (list file line type text full-file))
737 713
1065 (and (string= (flymake-ler-get-type line-one) (flymake-ler-get-type line-two)) 1041 (and (string= (flymake-ler-get-type line-one) (flymake-ler-get-type line-two))
1066 (or (and (flymake-ler-get-file line-one) (flymake-ler-get-file line-two)) 1042 (or (and (flymake-ler-get-file line-one) (flymake-ler-get-file line-two))
1067 (and (not (flymake-ler-get-file line-one)) (not (flymake-ler-get-file line-two))))))) 1043 (and (not (flymake-ler-get-file line-one)) (not (flymake-ler-get-file line-two)))))))
1068 1044
1069 (defun flymake-add-line-err-info (line-err-info-list line-err-info) 1045 (defun flymake-add-line-err-info (line-err-info-list line-err-info)
1070 "Insert new err info favoring sorting: err-type e/w, filename nil/non-nil." 1046 "Update LINE-ERR-INFO-LIST with the error LINE-ERR-INFO.
1047 For the format of LINE-ERR-INFO, see `flymake-ler-make-ler'.
1048 The new element is inserted in the proper position, according to
1049 the predicate `flymake-line-err-info-is-less-or-equal'.
1050 The updated value of LINE-ERR-INFO-LIST is returned."
1071 (if (not line-err-info-list) 1051 (if (not line-err-info-list)
1072 (list line-err-info) 1052 (list line-err-info)
1073 (let* ((count (length line-err-info-list)) 1053 (let* ((count (length line-err-info-list))
1074 (idx 0)) 1054 (idx 0))
1075 (while (and (< idx count) (flymake-line-err-info-is-less-or-equal (nth idx line-err-info-list) line-err-info)) 1055 (while (and (< idx count) (flymake-line-err-info-is-less-or-equal (nth idx line-err-info-list) line-err-info))
1077 (cond ((equal 0 idx) (setq line-err-info-list (cons line-err-info line-err-info-list))) 1057 (cond ((equal 0 idx) (setq line-err-info-list (cons line-err-info line-err-info-list)))
1078 (t (setq line-err-info-list (flymake-ins-after line-err-info-list (1- idx) line-err-info)))) 1058 (t (setq line-err-info-list (flymake-ins-after line-err-info-list (1- idx) line-err-info))))
1079 line-err-info-list))) 1059 line-err-info-list)))
1080 1060
1081 (defun flymake-add-err-info (err-info-list line-err-info) 1061 (defun flymake-add-err-info (err-info-list line-err-info)
1082 "Add error info (file line type text) to err info list preserving sort order." 1062 "Update ERR-INFO-LIST with the error LINE-ERR-INFO, preserving sort order.
1063 Returns the updated value of ERR-INFO-LIST.
1064 For the format of ERR-INFO-LIST, see `flymake-err-info'.
1065 For the format of LINE-ERR-INFO, see `flymake-ler-make-ler'."
1083 (let* ((line-no (if (flymake-ler-get-file line-err-info) 1 (flymake-ler-get-line line-err-info))) 1066 (let* ((line-no (if (flymake-ler-get-file line-err-info) 1 (flymake-ler-get-line line-err-info)))
1084 (info-and-pos (flymake-find-err-info err-info-list line-no)) 1067 (info-and-pos (flymake-find-err-info err-info-list line-no))
1085 (exists (car info-and-pos)) 1068 (exists (car info-and-pos))
1086 (pos (nth 1 info-and-pos)) 1069 (pos (nth 1 info-and-pos))
1087 (line-err-info-list nil) 1070 (line-err-info-list nil)
1200 (defun flymake-start-syntax-check (buffer) 1183 (defun flymake-start-syntax-check (buffer)
1201 "Start syntax checking for buffer BUFFER." 1184 "Start syntax checking for buffer BUFFER."
1202 (unless (bufferp buffer) 1185 (unless (bufferp buffer)
1203 (error "Expected a buffer")) 1186 (error "Expected a buffer"))
1204 (with-current-buffer buffer 1187 (with-current-buffer buffer
1205 (flymake-log 3 "flymake is running: %s" (flymake-get-buffer-is-running buffer)) 1188 (flymake-log 3 "flymake is running: %s" flymake-is-running)
1206 (when (and (not (flymake-get-buffer-is-running buffer)) 1189 (when (and (not flymake-is-running)
1207 (flymake-can-syntax-check-file (buffer-file-name buffer))) 1190 (flymake-can-syntax-check-file (buffer-file-name buffer)))
1208 (when (or (not flymake-compilation-prevents-syntax-check) 1191 (when (or (not flymake-compilation-prevents-syntax-check)
1209 (not (flymake-compilation-is-running))) ;+ (flymake-rep-ort-status buffer "COMP") 1192 (not (flymake-compilation-is-running))) ;+ (flymake-rep-ort-status buffer "COMP")
1210 (flymake-clear-buildfile-cache) 1193 (flymake-clear-buildfile-cache)
1211 (flymake-clear-project-include-dirs-cache) 1194 (flymake-clear-project-include-dirs-cache)
1212 1195
1213 (flymake-set-buffer-check-was-interrupted buffer nil) 1196 (setq flymake-check-was-interrupted nil)
1214 (flymake-set-buffer-data buffer (flymake-makehash 'equal)) 1197 (setq flymake-buffer-data (flymake-makehash 'equal))
1215 1198
1216 (let* ((source-file-name (buffer-file-name buffer)) 1199 (let* ((source-file-name (buffer-file-name buffer))
1217 (init-f (flymake-get-init-function source-file-name)) 1200 (init-f (flymake-get-init-function source-file-name))
1218 (cleanup-f (flymake-get-cleanup-function source-file-name)) 1201 (cleanup-f (flymake-get-cleanup-function source-file-name))
1219 (cmd-and-args (funcall init-f buffer)) 1202 (cmd-and-args (funcall init-f buffer))
1223 (if (not cmd-and-args) 1206 (if (not cmd-and-args)
1224 (progn 1207 (progn
1225 (flymake-log 0 "init function %s for %s failed, cleaning up" init-f source-file-name) 1208 (flymake-log 0 "init function %s for %s failed, cleaning up" init-f source-file-name)
1226 (funcall cleanup-f buffer)) 1209 (funcall cleanup-f buffer))
1227 (progn 1210 (progn
1228 (flymake-set-buffer-last-change-time buffer nil) 1211 (setq flymake-last-change-time nil)
1229 (flymake-start-syntax-check-process buffer cmd args dir)))))))) 1212 (flymake-start-syntax-check-process buffer cmd args dir))))))))
1230 1213
1231 (defun flymake-start-syntax-check-process (buffer cmd args dir) 1214 (defun flymake-start-syntax-check-process (buffer cmd args dir)
1232 "Start syntax check process." 1215 "Start syntax check process."
1233 (let* ((process nil)) 1216 (let* ((process nil))
1240 (set-process-sentinel process 'flymake-process-sentinel) 1223 (set-process-sentinel process 'flymake-process-sentinel)
1241 (set-process-filter process 'flymake-process-filter) 1224 (set-process-filter process 'flymake-process-filter)
1242 1225
1243 (flymake-reg-names (process-id process) (buffer-name buffer)) 1226 (flymake-reg-names (process-id process) (buffer-name buffer))
1244 1227
1245 (flymake-set-buffer-is-running buffer t) 1228 (with-current-buffer buffer
1246 (flymake-set-buffer-last-change-time buffer nil) 1229 (setq flymake-is-running t)
1247 (flymake-set-buffer-check-start-time buffer (flymake-float-time)) 1230 (setq flymake-last-change-time nil)
1231 (setq flymake-check-start-time (flymake-float-time)))
1248 1232
1249 (flymake-report-status buffer nil "*") 1233 (flymake-report-status buffer nil "*")
1250 (flymake-log 2 "started process %d, command=%s, dir=%s" 1234 (flymake-log 2 "started process %d, command=%s, dir=%s"
1251 (process-id process) (process-command process) default-directory) 1235 (process-id process) (process-command process) default-directory)
1252 process) 1236 process)
1262 (defun flymake-kill-process (pid &optional rest) 1246 (defun flymake-kill-process (pid &optional rest)
1263 "Kill process PID." 1247 "Kill process PID."
1264 (signal-process pid 9) 1248 (signal-process pid 9)
1265 (let* ((buffer-name (flymake-get-source-buffer-name pid))) 1249 (let* ((buffer-name (flymake-get-source-buffer-name pid)))
1266 (when (and buffer-name (get-buffer buffer-name)) 1250 (when (and buffer-name (get-buffer buffer-name))
1267 (flymake-set-buffer-check-was-interrupted (get-buffer buffer-name) t))) 1251 (with-current-buffer (get-buffer buffer-name)
1252 (setq flymake-check-was-interrupted t))))
1268 (flymake-log 1 "killed process %d" pid)) 1253 (flymake-log 1 "killed process %d" pid))
1269 1254
1270 (defun flymake-stop-all-syntax-checks () 1255 (defun flymake-stop-all-syntax-checks ()
1271 "Kill all syntax check processes." 1256 "Kill all syntax check processes."
1272 (interactive) 1257 (interactive)
1286 (defvar flymake-is-running nil 1271 (defvar flymake-is-running nil
1287 "If t, flymake syntax check process is running for the current buffer.") 1272 "If t, flymake syntax check process is running for the current buffer.")
1288 1273
1289 (make-variable-buffer-local 'flymake-is-running) 1274 (make-variable-buffer-local 'flymake-is-running)
1290 1275
1291 (defun flymake-get-buffer-is-running (buffer)
1292 (flymake-get-buffer-var buffer 'flymake-is-running))
1293
1294 (defun flymake-set-buffer-is-running (buffer is-running)
1295 (flymake-set-buffer-var buffer 'flymake-is-running is-running))
1296
1297 (defvar flymake-timer nil 1276 (defvar flymake-timer nil
1298 "Timer for starting syntax check.") 1277 "Timer for starting syntax check.")
1299 1278
1300 (make-variable-buffer-local 'flymake-timer) 1279 (make-variable-buffer-local 'flymake-timer)
1301 1280
1302 (defun flymake-get-buffer-timer (buffer)
1303 (flymake-get-buffer-var buffer 'flymake-timer))
1304
1305 (defun flymake-set-buffer-timer (buffer timer)
1306 (flymake-set-buffer-var buffer 'flymake-timer timer))
1307
1308 (defvar flymake-last-change-time nil 1281 (defvar flymake-last-change-time nil
1309 "Time of last buffer change.") 1282 "Time of last buffer change.")
1310 1283
1311 (make-variable-buffer-local 'flymake-last-change-time) 1284 (make-variable-buffer-local 'flymake-last-change-time)
1312 1285
1313 (defun flymake-get-buffer-last-change-time (buffer)
1314 (flymake-get-buffer-var buffer 'flymake-last-change-time))
1315
1316 (defun flymake-set-buffer-last-change-time (buffer change-time)
1317 (flymake-set-buffer-var buffer 'flymake-last-change-time change-time))
1318
1319 (defvar flymake-check-start-time nil 1286 (defvar flymake-check-start-time nil
1320 "Time at which syntax check was started.") 1287 "Time at which syntax check was started.")
1321 1288
1322 (make-variable-buffer-local 'flymake-check-start-time) 1289 (make-variable-buffer-local 'flymake-check-start-time)
1323 1290
1324 (defun flymake-get-buffer-check-start-time (buffer)
1325 (flymake-get-buffer-var buffer 'flymake-check-start-time))
1326
1327 (defun flymake-set-buffer-check-start-time (buffer check-start-time)
1328 (flymake-set-buffer-var buffer 'flymake-check-start-time check-start-time))
1329
1330 (defvar flymake-check-was-interrupted nil 1291 (defvar flymake-check-was-interrupted nil
1331 "Non-nil if syntax check was killed by `flymake-compile'.") 1292 "Non-nil if syntax check was killed by `flymake-compile'.")
1332 1293
1333 (make-variable-buffer-local 'flymake-check-was-interrupted) 1294 (make-variable-buffer-local 'flymake-check-was-interrupted)
1334
1335 (defun flymake-get-buffer-check-was-interrupted (buffer)
1336 (flymake-get-buffer-var buffer 'flymake-check-was-interrupted))
1337
1338 (defun flymake-set-buffer-check-was-interrupted (buffer interrupted)
1339 (flymake-set-buffer-var buffer 'flymake-check-was-interrupted interrupted))
1340 1295
1341 (defcustom flymake-no-changes-timeout 0.5 1296 (defcustom flymake-no-changes-timeout 0.5
1342 "Time to wait after last change before starting compilation." 1297 "Time to wait after last change before starting compilation."
1343 :group 'flymake 1298 :group 'flymake
1344 :type 'number) 1299 :type 'number)
1345 1300
1346 (defun flymake-on-timer-event (buffer) 1301 (defun flymake-on-timer-event (buffer)
1347 "Start a syntax check for buffer BUFFER if necessary." 1302 "Start a syntax check for buffer BUFFER if necessary."
1348 ;;+(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)) 1303 (when (bufferp buffer)
1349 (when (and (bufferp buffer) (not (flymake-get-buffer-is-running buffer)))
1350 (with-current-buffer buffer 1304 (with-current-buffer buffer
1351 (when (and (flymake-get-buffer-last-change-time buffer) 1305 (when (and (not flymake-is-running)
1352 (> (flymake-float-time) (+ flymake-no-changes-timeout (flymake-get-buffer-last-change-time buffer)))) 1306 flymake-last-change-time
1353 (flymake-set-buffer-last-change-time buffer nil) 1307 (> (flymake-float-time) (+ flymake-no-changes-timeout flymake-last-change-time)))
1308
1309 (setq flymake-last-change-time nil)
1354 (flymake-log 3 "starting syntax check as more than 1 second passed since last change") 1310 (flymake-log 3 "starting syntax check as more than 1 second passed since last change")
1355 (flymake-start-syntax-check buffer))))) 1311 (flymake-start-syntax-check buffer)))))
1356 1312
1357 (defun flymake-start-syntax-check-for-current-buffer () 1313 (defun flymake-start-syntax-check-for-current-buffer ()
1358 "Run 'flymake-start-syntax-check' for current buffer if it isn't already running." 1314 "Run 'flymake-start-syntax-check' for current buffer if it isn't already running."
1389 1345
1390 (defun flymake-display-err-menu-for-current-line () 1346 (defun flymake-display-err-menu-for-current-line ()
1391 "Display a menu with errors/warnings for current line if it has errors and/or warnings." 1347 "Display a menu with errors/warnings for current line if it has errors and/or warnings."
1392 (interactive) 1348 (interactive)
1393 (let* ((line-no (flymake-current-line-no)) 1349 (let* ((line-no (flymake-current-line-no))
1394 (line-err-info-list (nth 0 (flymake-find-err-info (flymake-get-buffer-err-info (current-buffer)) line-no))) 1350 (line-err-info-list (nth 0 (flymake-find-err-info flymake-err-info line-no)))
1395 (menu-data (flymake-make-err-menu-data line-no line-err-info-list)) 1351 (menu-data (flymake-make-err-menu-data line-no line-err-info-list))
1396 (choice nil) 1352 (choice nil)
1397 (mouse-pos (flymake-get-point-pixel-pos)) 1353 (mouse-pos (flymake-get-point-pixel-pos))
1398 (menu-pos (list (flymake-get-point-pixel-pos) (selected-window)))) 1354 (menu-pos (list (flymake-get-point-pixel-pos) (selected-window))))
1399 (if menu-data 1355 (if menu-data
1440 ;; flymake minor mode declarations 1396 ;; flymake minor mode declarations
1441 (defvar flymake-mode-line nil) 1397 (defvar flymake-mode-line nil)
1442 1398
1443 (make-variable-buffer-local 'flymake-mode-line) 1399 (make-variable-buffer-local 'flymake-mode-line)
1444 1400
1445 (defun flymake-get-buffer-mode-line (buffer)
1446 (flymake-get-buffer-var buffer 'flymake-mode-line))
1447
1448 (defun flymake-set-buffer-mode-line (buffer mode-line-string)
1449 (flymake-set-buffer-var buffer 'flymake-mode-line mode-line-string))
1450
1451 (defvar flymake-mode-line-e-w nil) 1401 (defvar flymake-mode-line-e-w nil)
1452 1402
1453 (make-variable-buffer-local 'flymake-mode-line-e-w) 1403 (make-variable-buffer-local 'flymake-mode-line-e-w)
1454 1404
1455 (defun flymake-get-buffer-mode-line-e-w (buffer)
1456 (flymake-get-buffer-var buffer 'flymake-mode-line-e-w))
1457
1458 (defun flymake-set-buffer-mode-line-e-w (buffer e-w)
1459 (flymake-set-buffer-var buffer 'flymake-mode-line-e-w e-w))
1460
1461 (defvar flymake-mode-line-status nil) 1405 (defvar flymake-mode-line-status nil)
1462 1406
1463 (make-variable-buffer-local 'flymake-mode-line-status) 1407 (make-variable-buffer-local 'flymake-mode-line-status)
1464
1465 (defun flymake-get-buffer-mode-line-status (buffer)
1466 (flymake-get-buffer-var buffer 'flymake-mode-line-status))
1467
1468 (defun flymake-set-buffer-mode-line-status (buffer status)
1469 (flymake-set-buffer-var buffer 'flymake-mode-line-status status))
1470 1408
1471 (defun flymake-report-status (buffer e-w &optional status) 1409 (defun flymake-report-status (buffer e-w &optional status)
1472 "Show status in mode line." 1410 "Show status in mode line."
1473 (when (bufferp buffer) 1411 (when (bufferp buffer)
1474 (with-current-buffer buffer 1412 (with-current-buffer buffer
1475 (when e-w 1413 (when e-w
1476 (flymake-set-buffer-mode-line-e-w buffer e-w) 1414 (setq flymake-mode-line-e-w e-w))
1477 )
1478 (when status 1415 (when status
1479 (flymake-set-buffer-mode-line-status buffer status)) 1416 (setq flymake-mode-line-status status))
1480 (let* ((mode-line " Flymake")) 1417 (let* ((mode-line " Flymake"))
1481 (when (> (length (flymake-get-buffer-mode-line-e-w buffer)) 0) 1418 (when (> (length flymake-mode-line-e-w) 0)
1482 (setq mode-line (concat mode-line ":" (flymake-get-buffer-mode-line-e-w buffer)))) 1419 (setq mode-line (concat mode-line ":" flymake-mode-line-e-w)))
1483 (setq mode-line (concat mode-line (flymake-get-buffer-mode-line-status buffer))) 1420 (setq mode-line (concat mode-line flymake-mode-line-status))
1484 (flymake-set-buffer-mode-line buffer mode-line) 1421 (setq flymake-mode-line mode-line)
1485 (force-mode-line-update))))) 1422 (force-mode-line-update)))))
1486 1423
1487 (defun flymake-display-warning (warning) 1424 (defun flymake-display-warning (warning)
1488 "Display a warning to user." 1425 "Display a warning to user."
1489 (message-box warning)) 1426 (message-box warning))
1530 (add-hook 'kill-buffer-hook 'flymake-kill-buffer-hook) 1467 (add-hook 'kill-buffer-hook 'flymake-kill-buffer-hook)
1531 ;;+(add-hook 'find-file-hook 'flymake-find-file-hook) 1468 ;;+(add-hook 'find-file-hook 'flymake-find-file-hook)
1532 1469
1533 (flymake-report-status (current-buffer) "" "") 1470 (flymake-report-status (current-buffer) "" "")
1534 1471
1535 (flymake-set-buffer-timer (current-buffer) (run-at-time nil 1 'flymake-on-timer-event (current-buffer))) 1472 (setq flymake-timer
1473 (run-at-time nil 1 'flymake-on-timer-event (current-buffer)))
1536 1474
1537 (setq flymake-mode t) 1475 (setq flymake-mode t)
1538 (flymake-log 1 "flymake mode turned ON for buffer %s" (buffer-name (current-buffer))) 1476 (flymake-log 1 "flymake mode turned ON for buffer %s" (buffer-name (current-buffer)))
1539 (when flymake-start-syntax-check-on-find-file 1477 (when flymake-start-syntax-check-on-find-file
1540 (flymake-start-syntax-check-for-current-buffer)))) ; will be started by on-load hook 1478 (flymake-start-syntax-check-for-current-buffer)))) ; will be started by on-load hook
1548 (remove-hook 'kill-buffer-hook (function flymake-kill-buffer-hook) t) 1486 (remove-hook 'kill-buffer-hook (function flymake-kill-buffer-hook) t)
1549 ;;+(remove-hook 'find-file-hook (function flymake-find-file-hook) t) 1487 ;;+(remove-hook 'find-file-hook (function flymake-find-file-hook) t)
1550 1488
1551 (flymake-delete-own-overlays (current-buffer)) 1489 (flymake-delete-own-overlays (current-buffer))
1552 1490
1553 (when (flymake-get-buffer-timer (current-buffer)) 1491 (when flymake-timer
1554 (cancel-timer (flymake-get-buffer-timer (current-buffer))) 1492 (cancel-timer flymake-timer)
1555 (flymake-set-buffer-timer (current-buffer) nil)) 1493 (setq flymake-timer nil))
1556 1494
1557 (flymake-set-buffer-is-running (current-buffer) nil) 1495 (setq flymake-is-running nil)
1558
1559 (setq flymake-mode nil) 1496 (setq flymake-mode nil)
1560 (flymake-log 1 "flymake mode turned OFF for buffer %s" (buffer-name (current-buffer))))) 1497 (flymake-log 1 "flymake mode turned OFF for buffer %s" (buffer-name (current-buffer)))))
1561 1498
1562 (defcustom flymake-start-syntax-check-on-newline t 1499 (defcustom flymake-start-syntax-check-on-newline t
1563 "Start syntax check if newline char was added/removed from the buffer." 1500 "Start syntax check if newline char was added/removed from the buffer."
1569 ;;+(flymake-log 0 "setting change time to %s" (flymake-float-time)) 1506 ;;+(flymake-log 0 "setting change time to %s" (flymake-float-time))
1570 (let((new-text (buffer-substring start stop))) 1507 (let((new-text (buffer-substring start stop)))
1571 (when (and flymake-start-syntax-check-on-newline (equal new-text "\n")) 1508 (when (and flymake-start-syntax-check-on-newline (equal new-text "\n"))
1572 (flymake-log 3 "starting syntax check as new-line has been seen") 1509 (flymake-log 3 "starting syntax check as new-line has been seen")
1573 (flymake-start-syntax-check-for-current-buffer)) 1510 (flymake-start-syntax-check-for-current-buffer))
1574 (flymake-set-buffer-last-change-time (current-buffer) (flymake-float-time)))) 1511 (setq flymake-last-change-time (flymake-float-time))))
1575 1512
1576 (defun flymake-after-save-hook () 1513 (defun flymake-after-save-hook ()
1577 (if (local-variable-p 'flymake-mode (current-buffer)) ; (???) other way to determine whether flymake is active in buffer being saved? 1514 (if (local-variable-p 'flymake-mode (current-buffer)) ; (???) other way to determine whether flymake is active in buffer being saved?
1578 (progn 1515 (progn
1579 (flymake-log 3 "starting syntax check as buffer was saved") 1516 (flymake-log 3 "starting syntax check as buffer was saved")
1580 (flymake-start-syntax-check-for-current-buffer)))) ; no more mode 3. cannot start check if mode 3 (to temp copies) is active - (???) 1517 (flymake-start-syntax-check-for-current-buffer)))) ; no more mode 3. cannot start check if mode 3 (to temp copies) is active - (???)
1581 1518
1582 (defun flymake-kill-buffer-hook () 1519 (defun flymake-kill-buffer-hook ()
1583 (when (flymake-get-buffer-timer (current-buffer)) 1520 (when flymake-timer
1584 (cancel-timer (flymake-get-buffer-timer (current-buffer))) 1521 (cancel-timer flymake-timer)
1585 (flymake-set-buffer-timer (current-buffer) nil))) 1522 (setq flymake-timer nil)))
1586 1523
1587 (defun flymake-find-file-hook () 1524 (defun flymake-find-file-hook ()
1588 ;;+(when flymake-start-syntax-check-on-find-file 1525 ;;+(when flymake-start-syntax-check-on-find-file
1589 ;;+ (flymake-log 3 "starting syntax check on file open") 1526 ;;+ (flymake-log 3 "starting syntax check on file open")
1590 ;;+ (flymake-start-syntax-check-for-current-buffer) 1527 ;;+ (flymake-start-syntax-check-for-current-buffer)
1634 (flymake-skip-whitespace)) 1571 (flymake-skip-whitespace))
1635 1572
1636 (defun flymake-goto-next-error () 1573 (defun flymake-goto-next-error ()
1637 "Go to next error in err ring." 1574 "Go to next error in err ring."
1638 (interactive) 1575 (interactive)
1639 (let ((line-no (flymake-get-next-err-line-no (flymake-get-buffer-err-info (current-buffer)) (flymake-current-line-no)))) 1576 (let ((line-no (flymake-get-next-err-line-no flymake-err-info (flymake-current-line-no))))
1640 (when (not line-no) 1577 (when (not line-no)
1641 (setq line-no (flymake-get-first-err-line-no (flymake-get-buffer-err-info (current-buffer)))) 1578 (setq line-no (flymake-get-first-err-line-no flymake-err-info))
1642 (flymake-log 1 "passed end of file")) 1579 (flymake-log 1 "passed end of file"))
1643 (if line-no 1580 (if line-no
1644 (flymake-goto-line line-no) 1581 (flymake-goto-line line-no)
1645 (flymake-log 1 "no errors in current buffer")))) 1582 (flymake-log 1 "no errors in current buffer"))))
1646 1583
1647 (defun flymake-goto-prev-error () 1584 (defun flymake-goto-prev-error ()
1648 "Go to prev error in err ring." 1585 "Go to prev error in err ring."
1649 (interactive) 1586 (interactive)
1650 (let ((line-no (flymake-get-prev-err-line-no (flymake-get-buffer-err-info (current-buffer)) (flymake-current-line-no)))) 1587 (let ((line-no (flymake-get-prev-err-line-no flymake-err-info (flymake-current-line-no))))
1651 (when (not line-no) 1588 (when (not line-no)
1652 (setq line-no (flymake-get-last-err-line-no (flymake-get-buffer-err-info (current-buffer)))) 1589 (setq line-no (flymake-get-last-err-line-no flymake-err-info))
1653 (flymake-log 1 "passed beginning of file")) 1590 (flymake-log 1 "passed beginning of file"))
1654 (if line-no 1591 (if line-no
1655 (flymake-goto-line line-no) 1592 (flymake-goto-line line-no)
1656 (flymake-log 1 "no errors in current buffer")))) 1593 (flymake-log 1 "no errors in current buffer"))))
1657 1594
1719 (defun flymake-simple-cleanup (buffer) 1656 (defun flymake-simple-cleanup (buffer)
1720 "Do cleanup after 'flymake-init-create-temp-buffer-copy'. 1657 "Do cleanup after 'flymake-init-create-temp-buffer-copy'.
1721 Delete temp file." 1658 Delete temp file."
1722 (let* ((temp-source-file-name (flymake-get-buffer-value buffer "temp-source-file-name"))) 1659 (let* ((temp-source-file-name (flymake-get-buffer-value buffer "temp-source-file-name")))
1723 (flymake-safe-delete-file temp-source-file-name) 1660 (flymake-safe-delete-file temp-source-file-name)
1724 (flymake-set-buffer-last-change-time buffer nil))) 1661 (with-current-buffer buffer
1662 (setq flymake-last-change-time nil))))
1725 1663
1726 (defun flymake-get-real-file-name (buffer file-name-from-err-msg) 1664 (defun flymake-get-real-file-name (buffer file-name-from-err-msg)
1727 "Translate file name from error message to \"real\" file name. 1665 "Translate file name from error message to \"real\" file name.
1728 Return full-name. Names are real, not patched." 1666 Return full-name. Names are real, not patched."
1729 (let* ((real-name nil) 1667 (let* ((real-name nil)