From 40c33fd71d87e10776d86f15f35c4fb2a2202879 Mon Sep 17 00:00:00 2001 From: Niko Matsakis Date: Tue, 3 May 2016 17:08:38 -0400 Subject: [PATCH] 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 df7e93ca..b0f83799 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,8 +1398,32 @@ 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)