]> git.eshelyaron.com Git - emacs.git/commitdiff
Keep and report "foreign" diangnostics in flymake-cc Flymake backend
authorJoão Távora <joaotavora@gmail.com>
Mon, 30 Aug 2021 15:24:25 +0000 (16:24 +0100)
committerJoão Távora <joaotavora@gmail.com>
Mon, 13 Sep 2021 17:40:58 +0000 (18:40 +0100)
This includes diagnostics for .h files that sprang up when checking a
c file.  Those diagnostics are reported to the Flymake infrastructure
which does not (yet) do anything with them.

This includes a change to the test fixtures, too.

* lisp/progmodes/flymake-cc.el (flymake-cc--make-diagnostics): Rework

* test/lisp/progmodes/flymake-resources/another-problematic-file.c:
  New file.

* test/lisp/progmodes/flymake-resources/some-problems.h:
  Add a function declaration..

lisp/progmodes/flymake-cc.el
test/lisp/progmodes/flymake-resources/another-problematic-file.c [new file with mode: 0644]
test/lisp/progmodes/flymake-resources/some-problems.h

index bd403faf7c4186859009ff9936cae53c1b987693..907300eb274cbf1740b640ffc0ef491ec22309b7 100644 (file)
@@ -61,23 +61,34 @@ SOURCE."
   (cl-loop
    while
    (search-forward-regexp
-    "^\\(In file included from \\)?<stdin>:\\([0-9]+\\)\\(?::\\([0-9]+\\)\\)?:\n?\\(.*\\): \\(.*\\)$"
+    "^\\(In file included from \\)?\\([^ :]+\\):\\([0-9]+\\)\\(?::\\([0-9]+\\)\\)?:\n?\\(.*\\): \\(.*\\)$"
     nil t)
-   for msg = (match-string 5)
-   for (beg . end) = (flymake-diag-region
-                      source
-                      (string-to-number (match-string 2))
-                      (and (match-string 3) (string-to-number (match-string 3))))
+   for msg = (match-string 6)
+   for locus = (match-string 2)
+   for line = (string-to-number (match-string 3))
+   for col = (ignore-errors (string-to-number (match-string 4)))
+   for source-buffer = (and (string= locus "<stdin>") source)
    for type = (if (match-string 1)
                   :error
-                (assoc-default
-                 (match-string 4)
-                 '(("error" . :error)
-                   ("note" . :note)
-                   ("warning" . :warning))
-                 #'string-match
-                 :error))
-   collect (flymake-make-diagnostic source beg end type msg)))
+                (save-match-data
+                  (assoc-default
+                   (match-string 5)
+                   '(("error" . :error)
+                     ("note" . :note)
+                     ("warning" . :warning))
+                   #'string-match
+                   :error)))
+   for diag =
+   (cond (source-buffer
+          (pcase-let ((`(,beg . ,end)
+                       (flymake-diag-region source-buffer line col)))
+            (flymake-make-diagnostic source-buffer beg end type msg)))
+         (t (flymake-make-diagnostic locus (cons line col) nil type msg)))
+   collect diag
+   ;; If "In file included from..." matched, then move to end of that
+   ;; line.  This helps us collect the diagnostic at its .h locus,
+   ;; too.
+   when (match-end 1) do (goto-char (match-end 2))))
 
 (defun flymake-cc-use-special-make-target ()
   "Command for checking a file via a CHK_SOURCES Make target."
diff --git a/test/lisp/progmodes/flymake-resources/another-problematic-file.c b/test/lisp/progmodes/flymake-resources/another-problematic-file.c
new file mode 100644 (file)
index 0000000..03eacdd
--- /dev/null
@@ -0,0 +1,5 @@
+#include "some-problems.h"
+
+int frob(char* freb) {
+  return 42;
+}
index 165d8dd525edb48361e6dcfa5acbea3f534e8360..86ea2de3b0d68bca9a913fad1992e58f3a8ccaf9 100644 (file)
@@ -2,4 +2,6 @@
 
 strange;
 
+int frob(char);
+
 sint main();