summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoão Távora <joaotavora@gmail.com>2021-08-30 16:24:25 +0100
committerJoão Távora <joaotavora@gmail.com>2021-09-13 18:40:58 +0100
commitdcdbb7486b08cc594c9e2e45961942a3f3ef80c8 (patch)
tree64495f5fd8dbd9b21366aa83d7af6d6b9d212740
parentac24adc376893434e08bdb84f4b3ceb2cf5dfd6f (diff)
downloademacs-dcdbb7486b08cc594c9e2e45961942a3f3ef80c8.tar.gz
Keep and report "foreign" diangnostics in flymake-cc Flymake backend
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..
-rw-r--r--lisp/progmodes/flymake-cc.el39
-rw-r--r--test/lisp/progmodes/flymake-resources/another-problematic-file.c5
-rw-r--r--test/lisp/progmodes/flymake-resources/some-problems.h2
3 files changed, 32 insertions, 14 deletions
diff --git a/lisp/progmodes/flymake-cc.el b/lisp/progmodes/flymake-cc.el
index bd403faf7c4..907300eb274 100644
--- a/lisp/progmodes/flymake-cc.el
+++ b/lisp/progmodes/flymake-cc.el
@@ -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
index 00000000000..03eacdd8011
--- /dev/null
+++ b/test/lisp/progmodes/flymake-resources/another-problematic-file.c
@@ -0,0 +1,5 @@
+#include "some-problems.h"
+
+int frob(char* freb) {
+ return 42;
+}
diff --git a/test/lisp/progmodes/flymake-resources/some-problems.h b/test/lisp/progmodes/flymake-resources/some-problems.h
index 165d8dd525e..86ea2de3b0d 100644
--- a/test/lisp/progmodes/flymake-resources/some-problems.h
+++ b/test/lisp/progmodes/flymake-resources/some-problems.h
@@ -2,4 +2,6 @@
strange;
+int frob(char);
+
sint main();