(compilation-error-list): An elt's cdr's car is again a cons (DIRECTORY .
authorRoland McGrath <roland@gnu.org>
Sun, 18 Jul 1993 20:41:08 +0000 (20:41 +0000)
committerRoland McGrath <roland@gnu.org>
Sun, 18 Jul 1993 20:41:08 +0000 (20:41 +0000)
FILE) if it's not a marker.  The conversion to using a string containing an
expanded file name was never finished, and anyway it utterly broke
compilation-search-path and few other things.
(next-error): Expect them that way.
(compilation-parse-errors): Make them that way.
(compile-file-of-error): Function removed.
(compilation-error-filedata, compilation-error-filedata-file-name): New
defsubsts.
(compilation-next-file): Use them instead of compile-file-of-error.

lisp/progmodes/compile.el

index e13bec9..ebff28b 100644 (file)
 
 (defvar compilation-error-list nil
   "List of error message descriptors for visiting erring functions.
-Each error descriptor is a cons (or nil).  Its car is a marker
-pointing to an error message.  If its cdr is a marker, it points to
-the text of the line the message is about.  If its cdr is a cons, that
-cons's car is the name of the file the message is about, and its cdr
-is the number of the line the message is about.  Or its cdr may be nil
-if that error is not interesting.
+Each error descriptor is a cons (or nil).  Its car is a marker pointing to
+an error message.  If its cdr is a marker, it points to the text of the
+line the message is about.  If its cdr is a cons, that cons's car is a cons
+\(DIRECTORY . FILE\), specifying the file the message is about, and its cdr
+is the number of the line the message is about.  Or its cdr may be nil if
+that error is not interesting.
 
 The value may be t instead of a list; this means that the buffer of
 error messages should be reparsed the next time the list of errors is wanted.
@@ -507,12 +507,23 @@ Does NOT find the source line like \\[next-error]."
   (compilation-next-error (- n)))
 
 
-(defun compile-file-of-error (data)
+;; Given an elt of `compilation-error-list', return an object representing
+;; the referenced file which is equal to (but not necessarily eq to) what
+;; this function would return for another error in the same file.
+(defsubst compilation-error-filedata (data)
   (setq data (cdr data))
   (if (markerp data)
-      (buffer-file-name (marker-buffer data))
+      (marker-buffer data)
     (car data)))
 
+;; Return a string describing a value from compilation-error-filedata.
+;; This value is not necessarily useful as a file name, but should be
+;; indicative to the user of what file's errors are being referred to.
+(defsubst compilation-error-filedata-file-name (filedata)
+  (if (bufferp filedata)
+      (buffer-file-name filedata)
+    (car filedata)))
+
 (defun compilation-next-file (n)
   "Move point to the next error for a different file than the current one."
   (interactive "p")
@@ -521,7 +532,7 @@ Does NOT find the source line like \\[next-error]."
   (setq compilation-last-buffer (current-buffer))
 
   (let ((reversed (< n 0))
-       errors file)
+       errors filedata)
 
     (if (not reversed)
        (setq errors (or (compile-error-at-point)
@@ -539,19 +550,23 @@ Does NOT find the source line like \\[next-error]."
        (setq errors (cdr errors))))
 
     (while (> n 0)
-      (setq file (compile-file-of-error (car errors)))
-
-      ;; Skip past the other errors for this file.
-      (while (string= file
-                     (compile-file-of-error
-                      (car (or errors
-                               (if reversed
-                                   (error "%s the first erring file" file)
-                                 (let ((compilation-error-list nil))
-                                   ;; Parse some more.
-                                   (compile-reinitialize-errors nil nil 2)
-                                   (setq errors compilation-error-list)))
-                               (error "%s is the last erring file" file)))))
+      (setq filedata (compilation-error-filedata (car errors)))
+
+      ;; Skip past the following errors for this file.
+      (while (equal filedata
+                   (compilation-error-filedata
+                    (car (or errors
+                             (if reversed
+                                 (error "%s the first erring file"
+                                        (compilation-error-filedata-file-name
+                                         filedata))
+                               (let ((compilation-error-list nil))
+                                 ;; Parse some more.
+                                 (compile-reinitialize-errors nil nil 2)
+                                 (setq errors compilation-error-list)))
+                             (error "%s is the last erring file" 
+                                    (compilation-error-filedata-file-name
+                                     filedata))))))
        (setq errors (cdr errors)))
 
       (setq n (1- n)))
@@ -741,10 +756,7 @@ See variables `compilation-parse-errors-function' and
                (or (markerp (cdr next-error))
                    ;; This error has a filename/lineno pair.
                    ;; Find the file and turn it into a marker.
-                   (let* ((fileinfo
-                           (cons (file-name-directory (car (cdr next-error)))
-                                 (file-name-nondirectory
-                                  (car (cdr next-error)))))
+                   (let* ((fileinfo (car (cdr next-error)))
                           (buffer (compilation-find-file (cdr fileinfo)
                                                          (car fileinfo)
                                                          (car next-error))))
@@ -1030,12 +1042,9 @@ See variable `compilation-parse-errors-function' for the interface it uses."
             ;; Extract the file name and line number from the error message.
             (let ((beginning-of-match (match-beginning 0)) ;looking-at nukes
                   (filename
-                   (save-excursion
-                     (goto-char (match-end (nth 1 alist)))
-                     (skip-chars-backward " \t")
-                     (let ((name (buffer-substring (match-beginning (nth 1 alist))
-                                                   (point))))
-                       (expand-file-name name default-directory))))
+                   (cons default-directory
+                         (buffer-substring (match-beginning (nth 1 alist))
+                                           (match-end (nth 1 alist)))))
                   (linenum (save-restriction
                              (narrow-to-region
                               (match-beginning (nth 2 alist))