(flymake-split-string): Remove >1 empty strings at beg/end of the result.

(flymake-find-buildfile, flymake-find-possible-master-files):
Use expand-file-name.
(flymake-fix-file-name): Don't replace \ with / and don't remove ./
since expand-file-name does it for us.  Use directory-file-name.
(flymake-ler-get-full-file, flymake-ler-get-file, flymake-ler-get-line)
(flymake-ler-get-type, flymake-ler-get-text)
(flymake-ler-make-ler): Remove.  Replace by defstruct.  Update callers.
(flymake-current-line-no): Remove spurious interactive spec.
(flymake-delete-temp-directory): Remove unused var `slash-pos'.
(flymake-check-include): Remove arg inc-path merged into inc-name.
(flymake-check-patch-master-file-buffer): Fit in 80 columns.
Arg regexp-list replaced by a simple regexp.
(flymake-master-make-header-init, flymake-master-tex-init):
Correspondingly replace regexp-list with a regexp.  Fix regexp.
This commit is contained in:
Stefan Monnier 2006-01-10 18:46:07 +00:00
parent b8f7f3be80
commit 587d108e55
2 changed files with 128 additions and 131 deletions

View file

@ -1,3 +1,22 @@
2006-01-10 Stefan Monnier <monnier@iro.umontreal.ca>
* progmodes/flymake.el (flymake-split-string): Remove more than one
empty string at beg/end of the result.
(flymake-find-buildfile, flymake-find-possible-master-files):
Use expand-file-name.
(flymake-fix-file-name): Don't replace \ with / and don't remove ./
since expand-file-name does it for us. Use directory-file-name.
(flymake-ler-get-full-file, flymake-ler-get-file, flymake-ler-get-line)
(flymake-ler-get-type, flymake-ler-get-text)
(flymake-ler-make-ler): Remove. Replace by defstruct. Update callers.
(flymake-current-line-no): Remove spurious interactive spec.
(flymake-delete-temp-directory): Remove unused var `slash-pos'.
(flymake-check-include): Remove arg inc-path merged into inc-name.
(flymake-check-patch-master-file-buffer): Fit in 80 columns.
Arg regexp-list replaced by a simple regexp.
(flymake-master-make-header-init, flymake-master-tex-init):
Correspondingly replace regexp-list with a regexp. Fix regexp.
2006-01-10 Simon Josefsson <jas@extundo.com>
* mail/smtpmail.el (smtpmail-try-auth-methods): Add comment

View file

@ -92,11 +92,10 @@
"Split STR into a list of substrings bounded by PATTERN.
Zero-length substrings at the beginning and end of the list are omitted."
(let ((split (split-string str pattern)))
(if (and (> (length split) 0) (= 0 (length (elt split 0))))
(setq split (cdr split)))
(if (and (> (length split) 0) (= 0 (length (elt split (1- (length split))))))
(setq split (nreverse (cdr (nreverse split)))))
split))))
(while (equal (car split) "") (setq split (cdr split)))
(setq split (nreverse split))
(while (equal (car split) "") (setq split (cdr split)))
(nreverse split)))))
(defalias 'flymake-get-temp-dir
(if (fboundp 'temp-directory)
@ -319,12 +318,10 @@ Return its file name if found, or nil if not found."
(or (flymake-get-buildfile-from-cache source-dir-name)
(let* ((dirs flymake-buildfile-dirs)
(buildfile-dir nil)
(buildfile nil)
(found nil))
(while (and (not found) dirs)
(setq buildfile-dir (concat source-dir-name (car dirs)))
(setq buildfile (concat buildfile-dir "/" buildfile-name))
(when (file-exists-p buildfile)
(when (file-exists-p (expand-file-name buildfile-name buildfile-dir))
(setq found t))
(setq dirs (cdr dirs)))
(if found
@ -339,12 +336,10 @@ Return its file name if found, or nil if not found."
(defun flymake-fix-file-name (name)
"Replace all occurences of '\' with '/'."
(when name
(let* ((new-name (flymake-replace-regexp-in-string "[\\]" "/" (expand-file-name name)))
(last-char (elt new-name (1- (length new-name)))))
(setq new-name (flymake-replace-regexp-in-string "\\./" "" new-name))
(if (equal "/" (char-to-string last-char))
(setq new-name (substring new-name 0 (1- (length new-name)))))
new-name)))
(setq name (expand-file-name name))
(setq name (abbreviate-file-name name))
(setq name (directory-file-name name))
name))
(defun flymake-same-files (file-name-one file-name-two)
"Check if FILE-NAME-ONE and FILE-NAME-TWO point to same file.
@ -375,8 +370,7 @@ File contents are not checked."
(done nil))
(while (and (not done) dirs)
(let* ((dir (concat (flymake-fix-file-name (file-name-directory file-name))
"/" (car dirs)))
(let* ((dir (expand-file-name (car dirs) (file-name-directory file-name)))
(masks masks))
(while (and (file-exists-p dir) (not done) masks)
(let* ((mask (car masks))
@ -412,53 +406,58 @@ to the beginning of the list (File.h -> File.cpp moved to top)."
:group 'flymake
:type 'integer)
(defun flymake-check-patch-master-file-buffer (master-file-temp-buffer
master-file-name patched-master-file-name
source-file-name patched-source-file-name
include-dirs regexp-list)
(defun flymake-check-patch-master-file-buffer
(master-file-temp-buffer
master-file-name patched-master-file-name
source-file-name patched-source-file-name
include-dirs regexp)
"Check if MASTER-FILE-NAME is a master file for SOURCE-FILE-NAME.
For .cpp master file this means it includes SOURCE-FILE-NAME (.h).
If yes, patch a copy of MASTER-FILE-NAME to include PATCHED-SOURCE-FILE-NAME
instead of SOURCE-FILE-NAME.
Whether a buffer for MATER-FILE-NAME exists, use it as a source
instead of reading master file from disk."
(let* ((found nil)
(regexp (format (nth 0 regexp-list) ; "[ \t]*#[ \t]*include[ \t]*\"\\([\w0-9/\\_\.]*[/\\]*\\)\\(%s\\)\""
(file-name-nondirectory source-file-name)))
(path-idx (nth 1 regexp-list))
(name-idx (nth 2 regexp-list))
(inc-path nil)
(let* ((source-file-nondir (file-name-nondirectory source-file-name))
(found nil)
(inc-name nil)
(search-limit flymake-check-file-limit))
(save-excursion
(unwind-protect
(progn
(set-buffer master-file-temp-buffer)
(when (> search-limit (point-max))
(setq search-limit (point-max)))
(flymake-log 3 "checking %s against regexp %s" master-file-name regexp)
(goto-char (point-min))
(while (and (< (point) search-limit) (re-search-forward regexp search-limit t))
(let* ((match-beg (match-beginning name-idx))
(match-end (match-end name-idx)))
(setq regexp
(format regexp ; "[ \t]*#[ \t]*include[ \t]*\"\\(.*%s\\)\""
(regexp-quote source-file-nondir)))
(unwind-protect
(with-current-buffer master-file-temp-buffer
(when (> search-limit (point-max))
(setq search-limit (point-max)))
(flymake-log 3 "checking %s against regexp %s"
master-file-name regexp)
(goto-char (point-min))
(while (and (< (point) search-limit)
(re-search-forward regexp search-limit t))
(let ((match-beg (match-beginning 1))
(match-end (match-end 1)))
(flymake-log 3 "found possible match for %s" (file-name-nondirectory source-file-name))
(setq inc-path (match-string path-idx))
(setq inc-name (match-string name-idx))
(when (string= inc-name (file-name-nondirectory source-file-name))
(flymake-log 3 "inc-path=%s inc-name=%s" inc-path inc-name)
(when (flymake-check-include source-file-name inc-path inc-name include-dirs)
(setq found t)
;; replace-match is not used here as it fails in
;; XEmacs with 'last match not a buffer' error as
;; check-includes calls replace-in-string
(flymake-replace-region match-beg match-end
(file-name-nondirectory patched-source-file-name))))
(forward-line 1)))
(when found
(flymake-save-buffer-in-file patched-master-file-name)))
;;+(flymake-log 3 "killing buffer %s" (buffer-name master-file-temp-buffer))
(kill-buffer master-file-temp-buffer)))
(flymake-log 3 "found possible match for %s" source-file-nondir)
(setq inc-name (match-string 1))
(when (eq t (compare-strings
source-file-nondir nil nil
inc-name (- (length inc-name)
(length source-file-nondir)) nil))
(flymake-log 3 "inc-name=%s" inc-name)
(when (flymake-check-include source-file-name inc-name
include-dirs)
(setq found t)
;; replace-match is not used here as it fails in
;; XEmacs with 'last match not a buffer' error as
;; check-includes calls replace-in-string
(flymake-replace-region
match-beg match-end
(file-name-nondirectory patched-source-file-name))))
(forward-line 1)))
(when found
(flymake-save-buffer-in-file patched-master-file-name)))
;;+(flymake-log 3 "killing buffer %s"
;; (buffer-name master-file-temp-buffer))
(kill-buffer master-file-temp-buffer))
;;+(flymake-log 3 "check-patch master file %s: %s" master-file-name found)
(when found
(flymake-log 2 "found master file %s" master-file-name))
@ -487,23 +486,19 @@ instead of reading master file from disk."
(insert-buffer-substring buffer)
(current-buffer)))
(defun flymake-check-include (source-file-name inc-path inc-name include-dirs)
(defun flymake-check-include (source-file-name inc-name include-dirs)
"Check if SOURCE-FILE-NAME can be found in include path.
Return t if it can be found via include path using INC-PATH and INC-NAME."
(if (file-name-absolute-p inc-path)
(flymake-same-files source-file-name (concat inc-path "/" inc-name))
(let* ((file-name nil)
(found nil))
(while (and (not found) include-dirs)
(setq file-name (concat (file-name-directory source-file-name)
"/" (car include-dirs)))
(if (> (length inc-path) 0)
(setq file-name (concat file-name "/" inc-path)))
(setq file-name (concat file-name "/" inc-name))
(when (flymake-same-files source-file-name file-name)
(setq found t))
(setq include-dirs (cdr include-dirs)))
found)))
Return t if it can be found via include path using INC-NAME."
(if (file-name-absolute-p inc-name)
(flymake-same-files source-file-name inc-name)
(while (and include-dirs
(not (flymake-same-files
source-file-name
(concat (file-name-directory source-file-name)
"/" (car include-dirs)
"/" inc-name))))
(setq include-dirs (cdr include-dirs)))
include-dirs))
(defun flymake-find-buffer-for-file (file-name)
"Check if there exists a buffer visiting FILE-NAME.
@ -512,7 +507,7 @@ Return t if so, nil if not."
(if buffer-name
(get-buffer buffer-name))))
(defun flymake-create-master-file (source-file-name patched-source-file-name get-incl-dirs-f create-temp-f masks include-regexp-list)
(defun flymake-create-master-file (source-file-name patched-source-file-name get-incl-dirs-f create-temp-f masks include-regexp)
"Save SOURCE-FILE-NAME with a different name.
Find master file, patch and save it."
(let* ((possible-master-files (flymake-find-possible-master-files source-file-name flymake-master-file-dirs masks))
@ -537,7 +532,7 @@ Find master file, patch and save it."
source-file-name
patched-source-file-name
(funcall get-incl-dirs-f (file-name-directory master-file-name))
include-regexp-list))
include-regexp))
(setq idx (1+ idx)))
(if found
(list master-file-name patched-master-file-name)
@ -662,45 +657,31 @@ It's flymake process filter."
(defun flymake-er-get-line-err-info-list (err-info)
(nth 1 err-info))
;; getters/setters for line-err-info: (file, line, type, text).
(defun flymake-ler-make-ler (file line type text &optional full-file)
(list file line type text full-file))
(defun flymake-ler-get-file (line-err-info)
(nth 0 line-err-info))
(defun flymake-ler-get-line (line-err-info)
(nth 1 line-err-info))
(defun flymake-ler-get-type (line-err-info)
(nth 2 line-err-info))
(defun flymake-ler-get-text (line-err-info)
(nth 3 line-err-info))
(defun flymake-ler-get-full-file (line-err-info)
(nth 4 line-err-info))
(defstruct (flymake-ler
(:constructor nil)
(:constructor flymake-ler-make-ler (file line type text &optional full-file)))
file line type text full-file)
(defun flymake-ler-set-file (line-err-info file)
(flymake-ler-make-ler file
(flymake-ler-get-line line-err-info)
(flymake-ler-get-type line-err-info)
(flymake-ler-get-text line-err-info)
(flymake-ler-get-full-file line-err-info)))
(flymake-ler-line line-err-info)
(flymake-ler-type line-err-info)
(flymake-ler-text line-err-info)
(flymake-ler-full-file line-err-info)))
(defun flymake-ler-set-full-file (line-err-info full-file)
(flymake-ler-make-ler (flymake-ler-get-file line-err-info)
(flymake-ler-get-line line-err-info)
(flymake-ler-get-type line-err-info)
(flymake-ler-get-text line-err-info)
(flymake-ler-make-ler (flymake-ler-file line-err-info)
(flymake-ler-line line-err-info)
(flymake-ler-type line-err-info)
(flymake-ler-text line-err-info)
full-file))
(defun flymake-ler-set-line (line-err-info line)
(flymake-ler-make-ler (flymake-ler-get-file line-err-info)
(flymake-ler-make-ler (flymake-ler-file line-err-info)
line
(flymake-ler-get-type line-err-info)
(flymake-ler-get-text line-err-info)
(flymake-ler-get-full-file line-err-info)))
(flymake-ler-type line-err-info)
(flymake-ler-text line-err-info)
(flymake-ler-full-file line-err-info)))
(defun flymake-get-line-err-count (line-err-info-list type)
"Return number of errors of specified TYPE.
@ -710,7 +691,7 @@ Value of TYPE is either \"e\" or \"w\"."
(err-count 0))
(while (< idx count)
(when (equal type (flymake-ler-get-type (nth idx line-err-info-list)))
(when (equal type (flymake-ler-type (nth idx line-err-info-list)))
(setq err-count (1+ err-count)))
(setq idx (1+ idx)))
err-count))
@ -809,7 +790,7 @@ Perhaps use text from LINE-ERR-INFO-LIST to enhance highlighting."
(line-end (flymake-line-end-position))
(beg line-beg)
(end line-end)
(tooltip-text (flymake-ler-get-text (nth 0 line-err-info-list)))
(tooltip-text (flymake-ler-text (nth 0 line-err-info-list)))
(face nil))
(goto-char line-beg)
@ -852,7 +833,7 @@ Perhaps use text from LINE-ERR-INFO-LIST to enhance highlighting."
(setq line-err-info (flymake-parse-line (nth idx lines)))
(when line-err-info
(setq real-file-name (funcall get-real-file-name-f
(flymake-ler-get-file line-err-info)))
(flymake-ler-file line-err-info)))
(setq line-err-info (flymake-ler-set-full-file line-err-info real-file-name))
(if (flymake-same-files real-file-name source-file-name)
@ -984,12 +965,12 @@ Return its components if so, nil otherwise."
'(nil 0)))
(defun flymake-line-err-info-is-less-or-equal (line-one line-two)
(or (string< (flymake-ler-get-type line-one) (flymake-ler-get-type line-two))
(and (string= (flymake-ler-get-type line-one) (flymake-ler-get-type line-two))
(not (flymake-ler-get-file line-one)) (flymake-ler-get-file line-two))
(and (string= (flymake-ler-get-type line-one) (flymake-ler-get-type line-two))
(or (and (flymake-ler-get-file line-one) (flymake-ler-get-file line-two))
(and (not (flymake-ler-get-file line-one)) (not (flymake-ler-get-file line-two)))))))
(or (string< (flymake-ler-type line-one) (flymake-ler-type line-two))
(and (string= (flymake-ler-type line-one) (flymake-ler-type line-two))
(not (flymake-ler-file line-one)) (flymake-ler-file line-two))
(and (string= (flymake-ler-type line-one) (flymake-ler-type line-two))
(or (and (flymake-ler-file line-one) (flymake-ler-file line-two))
(and (not (flymake-ler-file line-one)) (not (flymake-ler-file line-two)))))))
(defun flymake-add-line-err-info (line-err-info-list line-err-info)
"Update LINE-ERR-INFO-LIST with the error LINE-ERR-INFO.
@ -1012,7 +993,7 @@ The updated value of LINE-ERR-INFO-LIST is returned."
Returns the updated value of ERR-INFO-LIST.
For the format of ERR-INFO-LIST, see `flymake-err-info'.
For the format of LINE-ERR-INFO, see `flymake-ler-make-ler'."
(let* ((line-no (if (flymake-ler-get-file line-err-info) 1 (flymake-ler-get-line line-err-info)))
(let* ((line-no (if (flymake-ler-file line-err-info) 1 (flymake-ler-line line-err-info)))
(info-and-pos (flymake-find-err-info err-info-list line-no))
(exists (car info-and-pos))
(pos (nth 1 info-and-pos))
@ -1048,7 +1029,7 @@ For the format of LINE-ERR-INFO, see `flymake-ler-make-ler'."
(inc-count (length inc-lines)))
(while (> inc-count 0)
(when (not (string-match "^INCLUDE_DIRS=.*" (nth (1- inc-count) inc-lines)))
(setq inc-dirs (cons (flymake-replace-regexp-in-string "\"" "" (nth (1- inc-count) inc-lines)) inc-dirs)))
(push (flymake-replace-regexp-in-string "\"" "" (nth (1- inc-count) inc-lines)) inc-dirs))
(setq inc-count (1- inc-count)))))
(flymake-add-project-include-dirs-to-cache basedir inc-dirs)
inc-dirs)))
@ -1202,11 +1183,12 @@ For the format of LINE-ERR-INFO, see `flymake-ler-make-ler'."
(defun flymake-on-timer-event (buffer)
"Start a syntax check for buffer BUFFER if necessary."
(when (bufferp buffer)
(when (buffer-live-p buffer)
(with-current-buffer buffer
(when (and (not flymake-is-running)
flymake-last-change-time
(> (flymake-float-time) (+ flymake-no-changes-timeout flymake-last-change-time)))
(> (- (flymake-float-time) flymake-last-change-time)
flymake-no-changes-timeout))
(setq flymake-last-change-time nil)
(flymake-log 3 "starting syntax check as more than 1 second passed since last change")
@ -1214,10 +1196,7 @@ For the format of LINE-ERR-INFO, see `flymake-ler-make-ler'."
(defun flymake-current-line-no ()
"Return number of current line in current buffer."
(interactive)
(let ((beg (point-min))
(end (if (= (point) (point-max)) (point) (1+ (point)))))
(count-lines beg end)))
(count-lines (point-min) (if (eobp) (point) (1+ (point)))))
(defun flymake-count-lines ()
"Return number of lines in buffer BUFFER."
@ -1245,10 +1224,10 @@ For the format of LINE-ERR-INFO, see `flymake-ler-make-ler'."
(let* ((count (length line-err-info-list))
(menu-item-text nil))
(while (> count 0)
(setq menu-item-text (flymake-ler-get-text (nth (1- count) line-err-info-list)))
(let* ((file (flymake-ler-get-file (nth (1- count) line-err-info-list)))
(full-file (flymake-ler-get-full-file (nth (1- count) line-err-info-list)))
(line (flymake-ler-get-line (nth (1- count) line-err-info-list))))
(setq menu-item-text (flymake-ler-text (nth (1- count) line-err-info-list)))
(let* ((file (flymake-ler-file (nth (1- count) line-err-info-list)))
(full-file (flymake-ler-full-file (nth (1- count) line-err-info-list)))
(line (flymake-ler-line (nth (1- count) line-err-info-list))))
(if file
(setq menu-item-text (concat menu-item-text " - " file "(" (format "%d" line) ")")))
(setq menu-items (cons (list menu-item-text
@ -1503,8 +1482,7 @@ With arg, turn Flymake mode on if and only if arg is positive."
(defun flymake-delete-temp-directory (dir-name)
"Attempt to delete temp dir created by `flymake-create-temp-with-folder-structure', do not fail on error."
(let* ((temp-dir (flymake-get-temp-dir))
(suffix (substring dir-name (1+ (length temp-dir))))
(slash-pos nil))
(suffix (substring dir-name (1+ (length temp-dir)))))
(while (> (length suffix) 0)
(setq suffix (directory-file-name suffix))
@ -1615,14 +1593,14 @@ Return full-name. Names are real, not patched."
"NOMK" (format "No buildfile (%s) found for %s"
buildfile-name source-file-name)))))
(defun flymake-init-create-temp-source-and-master-buffer-copy (get-incl-dirs-f create-temp-f master-file-masks include-regexp-list)
(defun flymake-init-create-temp-source-and-master-buffer-copy (get-incl-dirs-f create-temp-f master-file-masks include-regexp)
"Find master file (or buffer), create it's copy along with a copy of the source file."
(let* ((source-file-name buffer-file-name)
(temp-source-file-name (flymake-init-create-temp-buffer-copy create-temp-f))
(master-and-temp-master (flymake-create-master-file
source-file-name temp-source-file-name
get-incl-dirs-f create-temp-f
master-file-masks include-regexp-list)))
master-file-masks include-regexp)))
(if (not master-and-temp-master)
(progn
@ -1680,12 +1658,12 @@ Use CREATE-TEMP-F for creating temp copy."
(defun flymake-simple-make-init ()
(flymake-simple-make-init-impl 'flymake-create-temp-inplace t t "Makefile" 'flymake-get-make-cmdline))
(defun flymake-master-make-init (get-incl-dirs-f master-file-masks include-regexp-list)
(defun flymake-master-make-init (get-incl-dirs-f master-file-masks include-regexp)
"Create make command line for a source file checked via master file compilation."
(let* ((make-args nil)
(temp-master-file-name (flymake-init-create-temp-source-and-master-buffer-copy
get-incl-dirs-f 'flymake-create-temp-inplace
master-file-masks include-regexp-list)))
master-file-masks include-regexp)))
(when temp-master-file-name
(let* ((buildfile-dir (flymake-init-find-buildfile-dir temp-master-file-name "Makefile")))
(if buildfile-dir
@ -1700,7 +1678,7 @@ Use CREATE-TEMP-F for creating temp copy."
(defun flymake-master-make-header-init ()
(flymake-master-make-init 'flymake-get-include-dirs
'("\\.cpp\\'" "\\.c\\'")
'("[ \t]*#[ \t]*include[ \t]*\"\\([\w0-9/\\_\.]*[/\\]*\\)\\(%s\\)\"" 1 2)))
"[ \t]*#[ \t]*include[ \t]*\"\\([[:word:]0-9/\\_.]*%s\\)\""))
;;;; .java/make specific
(defun flymake-simple-make-java-init ()
@ -1737,7 +1715,7 @@ Use CREATE-TEMP-F for creating temp copy."
(let* ((temp-master-file-name (flymake-init-create-temp-source-and-master-buffer-copy
'flymake-get-include-dirs-dot 'flymake-create-temp-inplace
'("\\.tex\\'")
'("[ \t]*\\input[ \t]*{\\(.*\\)\\(%s\\)}" 1 2))))
"[ \t]*\\input[ \t]*{\\(.*%s\\)}")))
(when temp-master-file-name
(flymake-get-tex-args temp-master-file-name))))