elisp/haskell-flycheck.el
author Luke Hoersten <Luke@Hoersten.org>
Wed, 04 Feb 2015 11:05:42 -0600
changeset 71 b5976ed7311a
permissions -rw-r--r--
Big updates to haskell-mode stuff.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
71
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
     1
;;; haskell-flycheck.el --- Flychecker using the GHCi process
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
     2
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
     3
;; Copyright (c) 2014 Chris Done. All rights reserved.
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
     4
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
     5
;; This file is free software; you can redistribute it and/or modify
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
     6
;; it under the terms of the GNU General Public License as published by
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
     7
;; the Free Software Foundation; either version 3, or (at your option)
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
     8
;; any later version.
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
     9
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    10
;; This file is distributed in the hope that it will be useful,
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    11
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    12
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    13
;; GNU General Public License for more details.
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    14
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    15
;; You should have received a copy of the GNU General Public License
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    16
;; along with this program.  If not, see <http://www.gnu.org/licenses/>.
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    17
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    18
;;; Code:
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    19
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    20
(require 'haskell-process)
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    21
(require 'flycheck)
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    22
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    23
(defun flycheck-haskell-process-start (checker callback)
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    24
  "Start a GHCi load with CHECKER.
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    25
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    26
CALLBACK is the status callback passed by Flycheck."
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    27
  (let ((session (haskell-session)))
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    28
    (haskell-session-current-dir session)
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    29
    (let ((process (haskell-process)))
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    30
      (haskell-process-queue-command
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    31
       process
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    32
       (make-haskell-command
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    33
        :state
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    34
        (list :process process
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    35
              :session session
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    36
              :filename (buffer-file-name)
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    37
              :callback callback
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    38
              :buffer (current-buffer)
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    39
              :original (buffer-string))
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    40
        :go
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    41
        (lambda (state)
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    42
          (with-current-buffer (plist-get state :buffer)
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    43
            (let* ((filename (plist-get state :filename)))
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    44
              (write-region (point-min) (point-max) filename)
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    45
              (clear-visited-file-modtime)
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    46
              (haskell-process-send-string
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    47
               (plist-get state :process)
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    48
               (format ":load \"%s\""
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    49
                       (replace-regexp-in-string
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    50
                        "\""
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    51
                        "\\\\\""
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    52
                        filename))))))
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    53
        :live (lambda (state _)
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    54
                (when (plist-get state :original)
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    55
                  (with-temp-buffer
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    56
                    (insert (plist-get state :original))
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    57
                    (write-region (point-min) (point-max) (plist-get state :filename))
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    58
                    (plist-put state :original nil))))
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    59
        :complete
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    60
        (lambda (state response)
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    61
          (let ((session (plist-get state :session))
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    62
                (process (plist-get state :process)))
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    63
            (haskell-process-set-response-cursor process 0)
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    64
            (let ((errors (list))
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    65
                  (next-error t))
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    66
              (while next-error
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    67
                (setq next-error
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    68
                      (haskell-process-errors-warnings
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    69
                       session
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    70
                       process
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    71
                       response
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    72
                       t))
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    73
                (when (consp next-error)
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    74
                  (add-to-list 'errors
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    75
                               (flycheck-error-new-at
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    76
                                (plist-get next-error :line)
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    77
                                (plist-get next-error :col)
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    78
                                (plist-get next-error :type)
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    79
                                (plist-get next-error :msg)
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    80
                                :checker 'haskell-process
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    81
                                :buffer (plist-get state :buffer)))))
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    82
              (funcall (plist-get state :callback)
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    83
                       'finished
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    84
                       errors)))))))))
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    85
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    86
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    87
(flycheck-define-generic-checker 'haskell-process
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    88
  "A syntax and type checker for Haskell using GHCi (via the
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    89
haskell-process Emacs module)."
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    90
  :start 'flycheck-haskell-process-start
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    91
  :modes '(haskell-mode)
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    92
  :next-checkers '((warning . haskell-hlint)))
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    93
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    94
;; Register as an auto-selectable checker
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    95
(setq flycheck-checkers (cons `haskell-process flycheck-checkers))
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    96
b5976ed7311a Big updates to haskell-mode stuff.
Luke Hoersten <Luke@Hoersten.org>
parents:
diff changeset
    97
(provide 'haskell-flycheck)