about summary refs log tree commit diff
path: root/configs/shared/emacs/.emacs.d/elpa/haskell-mode-20180913.348/haskell-compile.el
diff options
context:
space:
mode:
Diffstat (limited to 'configs/shared/emacs/.emacs.d/elpa/haskell-mode-20180913.348/haskell-compile.el')
-rw-r--r--configs/shared/emacs/.emacs.d/elpa/haskell-mode-20180913.348/haskell-compile.el162
1 files changed, 162 insertions, 0 deletions
diff --git a/configs/shared/emacs/.emacs.d/elpa/haskell-mode-20180913.348/haskell-compile.el b/configs/shared/emacs/.emacs.d/elpa/haskell-mode-20180913.348/haskell-compile.el
new file mode 100644
index 000000000000..27a4a5f6efee
--- /dev/null
+++ b/configs/shared/emacs/.emacs.d/elpa/haskell-mode-20180913.348/haskell-compile.el
@@ -0,0 +1,162 @@
+;;; haskell-compile.el --- Haskell/GHC compilation sub-mode -*- lexical-binding: t -*-
+
+;; Copyright (C) 2013  Herbert Valerio Riedel
+
+;; Author: Herbert Valerio Riedel <hvr@gnu.org>
+
+;; This file is not part of GNU Emacs.
+
+;; This file is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This file is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; Simple GHC-centric compilation sub-mode; see info node
+;; `(haskell-mode)compilation' for more information
+
+;;; Code:
+
+(require 'compile)
+(require 'haskell-cabal)
+(require 'ansi-color)
+
+;;;###autoload
+(defgroup haskell-compile nil
+  "Settings for Haskell compilation mode"
+  :link '(custom-manual "(haskell-mode)compilation")
+  :group 'haskell)
+
+(defcustom haskell-compile-cabal-build-command
+  "cd %s && cabal build --ghc-option=-ferror-spans"
+  "Default build command to use for `haskell-cabal-build' when a cabal file is detected.
+The `%s' placeholder is replaced by the cabal package top folder."
+  :group 'haskell-compile
+  :type 'string)
+
+(defcustom haskell-compile-cabal-build-alt-command
+  "cd %s && cabal clean -s && cabal build --ghc-option=-ferror-spans"
+  "Alternative build command to use when `haskell-cabal-build' is called with a negative prefix argument.
+The `%s' placeholder is replaced by the cabal package top folder."
+  :group 'haskell-compile
+  :type 'string)
+
+(defcustom haskell-compile-command
+  "ghc -Wall -ferror-spans -fforce-recomp -c %s"
+  "Default build command to use for `haskell-cabal-build' when no cabal file is detected.
+The `%s' placeholder is replaced by the current buffer's filename."
+  :group 'haskell-compile
+  :type 'string)
+
+(defcustom haskell-compile-ghc-filter-linker-messages
+  t
+  "Filter out unremarkable \"Loading package...\" linker messages during compilation."
+  :group 'haskell-compile
+  :type 'boolean)
+
+(defconst haskell-compilation-error-regexp-alist
+  `((,(concat
+       "^ *\\(?1:[^\t\r\n]+?\\):"
+       "\\(?:"
+       "\\(?2:[0-9]+\\):\\(?4:[0-9]+\\)\\(?:-\\(?5:[0-9]+\\)\\)?" ;; "121:1" & "12:3-5"
+       "\\|"
+       "(\\(?2:[0-9]+\\),\\(?4:[0-9]+\\))-(\\(?3:[0-9]+\\),\\(?5:[0-9]+\\))" ;; "(289,5)-(291,36)"
+       "\\)"
+       ":\\(?6:\n?[ \t]+[Ww]arning:\\)?")
+     1 (2 . 3) (4 . 5) (6 . nil)) ;; error/warning locus
+
+    ;; multiple declarations
+    ("^    \\(?:Declared at:\\|            \\) \\(?1:[^ \t\r\n]+\\):\\(?2:[0-9]+\\):\\(?4:[0-9]+\\)$"
+     1 2 4 0) ;; info locus
+
+    ;; failed tasty tests
+    (".*error, called at \\(.*\\.hs\\):\\([0-9]+\\):\\([0-9]+\\) in .*" 1 2 3 2 1)
+    (" +\\(.*\\.hs\\):\\([0-9]+\\):$" 1 2 nil 2 1)
+
+    ;; this is the weakest pattern as it's subject to line wrapping et al.
+    (" at \\(?1:[^ \t\r\n]+\\):\\(?2:[0-9]+\\):\\(?4:[0-9]+\\)\\(?:-\\(?5:[0-9]+\\)\\)?[)]?$"
+     1 2 (4 . 5) 0)) ;; info locus
+  "Regexps used for matching GHC compile messages.
+See `compilation-error-regexp-alist' for semantics.")
+
+(defvar haskell-compilation-mode-map
+  (let ((map (make-sparse-keymap)))
+    (set-keymap-parent map compilation-mode-map))
+  "Keymap for `haskell-compilation-mode' buffers.
+This is a child of `compilation-mode-map'.")
+
+(defun haskell-compilation-filter-hook ()
+  "Local `compilation-filter-hook' for `haskell-compilation-mode'."
+
+  (when haskell-compile-ghc-filter-linker-messages
+    (delete-matching-lines "^ *Loading package [^ \t\r\n]+ [.]+ linking [.]+ done\\.$"
+                           (save-excursion (goto-char compilation-filter-start)
+                                           (line-beginning-position))
+                           (point)))
+
+  (let ((inhibit-read-only t))
+    (ansi-color-apply-on-region compilation-filter-start (point-max))))
+
+(define-compilation-mode haskell-compilation-mode "HsCompilation"
+  "Haskell/GHC specific `compilation-mode' derivative.
+This mode provides support for GHC 7.[46]'s compile
+messages. Specifically, also the `-ferror-spans` source location
+format is supported, as well as info-locations within compile
+messages pointing to additional source locations."
+  (setq-local compilation-error-regexp-alist
+              haskell-compilation-error-regexp-alist)
+
+  (add-hook 'compilation-filter-hook
+            'haskell-compilation-filter-hook nil t)
+  )
+
+;;;###autoload
+(defun haskell-compile (&optional edit-command)
+  "Compile the Haskell program including the current buffer.
+Tries to locate the next cabal description in current or parent
+folders via `haskell-cabal-find-dir' and if found, invoke
+`haskell-compile-cabal-build-command' from the cabal package root
+folder. If no cabal package could be detected,
+`haskell-compile-command' is used instead.
+
+If prefix argument EDIT-COMMAND is non-nil (and not a negative
+prefix `-'), `haskell-compile' prompts for custom compile
+command.
+
+If EDIT-COMMAND contains the negative prefix argument `-',
+`haskell-compile' calls the alternative command defined in
+`haskell-compile-cabal-build-alt-command' if a cabal package was
+detected.
+
+`haskell-compile' uses `haskell-compilation-mode' which is
+derived from `compilation-mode'. See Info
+node `(haskell-mode)compilation' for more details."
+  (interactive "P")
+  (save-some-buffers (not compilation-ask-about-save)
+                         compilation-save-buffers-predicate)
+  (let* ((cabdir (haskell-cabal-find-dir))
+         (command1 (if (eq edit-command '-)
+                       haskell-compile-cabal-build-alt-command
+                     haskell-compile-cabal-build-command))
+         (srcname (buffer-file-name))
+         (command (if cabdir
+                      (format command1 cabdir)
+                    (if (and srcname (derived-mode-p 'haskell-mode))
+                        (format haskell-compile-command srcname)
+                      command1))))
+    (when (and edit-command (not (eq edit-command '-)))
+      (setq command (compilation-read-command command)))
+
+    (compilation-start command 'haskell-compilation-mode)))
+
+(provide 'haskell-compile)
+;;; haskell-compile.el ends here