diff options
| author | Jonas Bernoulli <jonas@bernoul.li> | 2021-03-29 19:04:00 +0200 |
|---|---|---|
| committer | brotzeit <brotzeitmacher@gmail.com> | 2021-04-23 13:57:07 +0200 |
| commit | 9e03890863fc1c1aca696e576d0a5b1daf1eed01 (patch) | |
| tree | 4b99dba5b4be30d64fcc82bafd8f1b0674c920ca | |
| parent | 5585cf95590a3950262c4b3ca9390980de713b3a (diff) | |
| download | rust-mode-9e03890863fc1c1aca696e576d0a5b1daf1eed01.tar.gz | |
Create rust-compile.el from existing code
For the time being `require' the new library from "rust-mode.el".
In the mid-term we should stop doing that, so that users can load
it if and only if they want to do so.
| -rw-r--r-- | Makefile | 1 | ||||
| -rw-r--r-- | rust-compile.el | 83 | ||||
| -rw-r--r-- | rust-mode.el | 76 |
3 files changed, 86 insertions, 74 deletions
@@ -10,6 +10,7 @@ EMACS ?= emacs EMACS_ARGS ?= ELS = rust-mode.el +ELS += rust-compile.el ELCS = $(ELS:.el=.elc) DEPS = diff --git a/rust-compile.el b/rust-compile.el new file mode 100644 index 0000000..6c73901 --- /dev/null +++ b/rust-compile.el @@ -0,0 +1,83 @@ +;;; rust-compile.el --- Compile facilities -*-lexical-binding: t-*- +;;; Commentary: + +;; This library teaches `compilation-mode' about "rustc" output. + +;;; Code: + +(require 'compile) + +;;; _ + +(defvar rustc-compilation-location + (let ((file "\\([^\n]+\\)") + (start-line "\\([0-9]+\\)") + (start-col "\\([0-9]+\\)")) + (concat "\\(" file ":" start-line ":" start-col "\\)"))) + +(defvar rustc-compilation-regexps + (let ((re (concat "^\\(?:error\\|\\(warning\\)\\|\\(note\\)\\)[^\0]+?--> " + rustc-compilation-location))) + (cons re '(4 5 6 (1 . 2) 3))) + "Specifications for matching errors in rustc invocations. +See `compilation-error-regexp-alist' for help on their format.") + +(defvar rustc-colon-compilation-regexps + (let ((re (concat "^ *::: " rustc-compilation-location))) + (cons re '(2 3 4 0 1))) + "Specifications for matching `:::` hints in rustc invocations. +See `compilation-error-regexp-alist' for help on their format.") + +(defvar rustc-refs-compilation-regexps + (let ((re "^\\([0-9]+\\)[[:space:]]*|")) + (cons re '(nil 1 nil 0 1))) + "Specifications for matching code references in rustc invocations. +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 + '("^\\s-+thread '[^']+' panicked at \\('[^']+', \\([^:]+\\):\\([0-9]+\\)\\)" + 2 3 nil nil 1) + "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 `next-error' (\\[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 'visible)) + (when (save-excursion + (beginning-of-line) + (looking-at " *-->")) + (let ((start-of-error + (save-excursion + (beginning-of-line) + (while (not (looking-at "^[a-z]+:\\|^[a-z]+\\[E[0-9]+\\]:")) + (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-refs rustc-refs-compilation-regexps)) + (add-to-list 'compilation-error-regexp-alist 'rustc-refs) + (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 + (cons 'rustc-colon rustc-colon-compilation-regexps)) + (add-to-list 'compilation-error-regexp-alist 'rustc-colon) + (add-to-list 'compilation-error-regexp-alist-alist + (cons 'cargo cargo-compilation-regexps)) + (add-to-list 'compilation-error-regexp-alist 'cargo) + (add-hook 'next-error-hook 'rustc-scroll-down-after-next-error))) + +;;; _ +(provide 'rust-compile) +;;; rust-compile.el ends here diff --git a/rust-mode.el b/rust-mode.el index 21fdd24..221259c 100644 --- a/rust-mode.el +++ b/rust-mode.el @@ -14,9 +14,8 @@ ;;; Code: -(eval-when-compile (require 'rx) - (require 'compile) - (require 'url-vars)) +(eval-when-compile (require 'rx)) +(eval-when-compile (require 'url-vars)) (require 'json) (require 'thingatpt) @@ -1973,77 +1972,6 @@ Return the created process." (or (rust--format-error-handler) (message "rustfmt detected problems, see *rustfmt* for more.")))))) -;;; Compilation - -(defvar rustc-compilation-location - (let ((file "\\([^\n]+\\)") - (start-line "\\([0-9]+\\)") - (start-col "\\([0-9]+\\)")) - (concat "\\(" file ":" start-line ":" start-col "\\)"))) - -(defvar rustc-compilation-regexps - (let ((re (concat "^\\(?:error\\|\\(warning\\)\\|\\(note\\)\\)[^\0]+?--> " - rustc-compilation-location))) - (cons re '(4 5 6 (1 . 2) 3))) - "Specifications for matching errors in rustc invocations. -See `compilation-error-regexp-alist' for help on their format.") - -(defvar rustc-colon-compilation-regexps - (let ((re (concat "^ *::: " rustc-compilation-location))) - (cons re '(2 3 4 0 1))) - "Specifications for matching `:::` hints in rustc invocations. -See `compilation-error-regexp-alist' for help on their format.") - -(defvar rustc-refs-compilation-regexps - (let ((re "^\\([0-9]+\\)[[:space:]]*|")) - (cons re '(nil 1 nil 0 1))) - "Specifications for matching code references in rustc invocations. -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 - '("^\\s-+thread '[^']+' panicked at \\('[^']+', \\([^:]+\\):\\([0-9]+\\)\\)" - 2 3 nil nil 1) - "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 `next-error' (\\[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 'visible)) - (when (save-excursion - (beginning-of-line) - (looking-at " *-->")) - (let ((start-of-error - (save-excursion - (beginning-of-line) - (while (not (looking-at "^[a-z]+:\\|^[a-z]+\\[E[0-9]+\\]:")) - (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-refs rustc-refs-compilation-regexps)) - (add-to-list 'compilation-error-regexp-alist 'rustc-refs) - (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 - (cons 'rustc-colon rustc-colon-compilation-regexps)) - (add-to-list 'compilation-error-regexp-alist 'rustc-colon) - (add-to-list 'compilation-error-regexp-alist-alist - (cons 'cargo cargo-compilation-regexps)) - (add-to-list 'compilation-error-regexp-alist 'cargo) - (add-hook 'next-error-hook 'rustc-scroll-down-after-next-error))) - ;;; Secondary Commands (defun rust-playpen-region (begin end) |
