branch: elpa/rust-mode
commit 40c33fd71d87e10776d86f15f35c4fb2a2202879
Author: Niko Matsakis <[email protected]>
Commit: Niko Matsakis <[email protected]>
add code to handle new-style rustc errors
These errors are available on nightly builds (or will be soon), but
only (at the moment) when enabled via environment variable. They will
become the default at some point in the future.
In this commit we match on the `-->`, but after that we have to scroll
the compilation window to make the error visible. One shortcoming is
that if you enter the window and click on the filename/line-number, then
the "next-error-hook" doesn't seem to run. (If you click at the start of
the line, it does.) It may be possible to tweak the "hyperlink" here to
make that work more smoothly, or perhaps add a hook somewhere else.
---
rust-mode.el | 34 ++++++++++++++++++++++++++++++++++
1 file changed, 34 insertions(+)
diff --git a/rust-mode.el b/rust-mode.el
index df7e93c..b0f8379 100644
--- a/rust-mode.el
+++ b/rust-mode.el
@@ -1381,6 +1381,16 @@ This is written mainly to be used as
`end-of-defun-function' for Rust."
"Specifications for matching errors in rustc invocations.
See `compilation-error-regexp-alist' for help on their format.")
+(defvar rustc-new-compilation-regexps
+ (let ((file "\\([^\n]+\\)")
+ (start-line "\\([0-9]+\\)")
+ (start-col "\\([0-9]+\\)"))
+ (let ((re (concat "^ *--> " file ":" start-line ":" start-col ; --> 1:2:3
+ )))
+ (cons re '(1 2 3))))
+ "Specifications for matching errors in rustc invocations (new style).
+See `compilation-error-regexp-alist' for help on their format.")
+
;; Match test run failures and panics during compilation as
;; compilation warnings
(defvar cargo-compilation-regexps
@@ -1388,9 +1398,33 @@ See `compilation-error-regexp-alist' for help on their
format.")
"Specifications for matching panics in cargo test invocations.
See `compilation-error-regexp-alist' for help on their format.")
+(defun rustc-scroll-down-after-next-error ()
+ "In the new style error messages, the regular expression
+ matches on the file name (which appears after `-->`), but the
+ start of the error appears a few lines earlier. This hook runs
+ after `M-x next-error`; it simply scrolls down a few lines in
+ the compilation window until the top of the error is visible."
+ (save-selected-window
+ (when (eq major-mode 'rust-mode)
+ (select-window (get-buffer-window next-error-last-buffer))
+ (when (save-excursion
+ (beginning-of-line)
+ (looking-at " *-->"))
+ (let ((start-of-error
+ (save-excursion
+ (beginning-of-line)
+ (while (not (looking-at "^[a-z]+:"))
+ (forward-line -1))
+ (point))))
+ (set-window-start (selected-window) start-of-error))))))
+
(eval-after-load 'compile
'(progn
(add-to-list 'compilation-error-regexp-alist-alist
+ (cons 'rustc-new rustc-new-compilation-regexps))
+ (add-to-list 'compilation-error-regexp-alist 'rustc-new)
+ (add-hook 'next-error-hook 'rustc-scroll-down-after-next-error)
+ (add-to-list 'compilation-error-regexp-alist-alist
(cons 'rustc rustc-compilation-regexps))
(add-to-list 'compilation-error-regexp-alist 'rustc)
(add-to-list 'compilation-error-regexp-alist-alist