elisp/stack-mode/stack-mode.el
author Luke Hoersten <luke@hoersten.org>
Fri, 18 Sep 2015 17:39:07 -0500
changeset 82 12cf67bc486c
parent 81 4da7819d1a1c
permissions -rw-r--r--
Added paredit, flx-ido and projectile.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
80
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
     1
;;; stack-mode.el --- A minor mode enabling various features based on
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
     2
;;; stack-ide.
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
     3
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
     4
;; Copyright (c) 2015 Chris Done.
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
     5
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
     6
;; This file is free software; you can redistribute it and/or modify
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
     7
;; it under the terms of the GNU General Public License as published by
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
     8
;; the Free Software Foundation; either version 3, or (at your option)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
     9
;; any later version.
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    10
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    11
;; This file is distributed in the hope that it will be useful,
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    12
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    13
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    14
;; GNU General Public License for more details.
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    15
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    16
;; You should have received a copy of the GNU General Public License
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    17
;; along with this program.  If not, see <http://www.gnu.org/licenses/>.
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    18
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    19
;;; Code:
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    20
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    21
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    22
;; Imports
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    23
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    24
(require 'haskell-mode)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    25
(require 'haskell-cabal)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    26
(require 'cl-lib)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    27
(require 'fifo)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    28
(require 'flycheck)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    29
(require 'json)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    30
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    31
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    32
;; Modes
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    33
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    34
(define-minor-mode stack-mode
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    35
  "A minor mode enabling various features based on stack-ide.
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    36
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    37
Automatically starts and stops flycheck-mode when you
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    38
enable/disable it. It makes this assumption in the interest of
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    39
easier user experience. Disable with `stack-mode-manage-flycheck'."
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    40
  :lighter " Stack"
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    41
  :keymap (let ((map (make-sparse-keymap)))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    42
            (define-key map (kbd "M-.") 'stack-mode-goto)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    43
            (define-key map (kbd "C-c C-k") 'stack-mode-clear)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    44
            (define-key map (kbd "C-c C-t") 'stack-mode-type)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    45
            (define-key map (kbd "C-c C-i") 'stack-mode-info)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    46
            (define-key map (kbd "C-c C-l") 'stack-mode-load)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    47
            map)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    48
  (when (buffer-file-name)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    49
    (if stack-mode
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    50
        (progn (when (bound-and-true-p interactive-haskell-mode)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    51
                 (when (y-or-n-p "interactive-haskell-mode is enabled. Disable it?")
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    52
                   (interactive-haskell-mode -1)))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    53
               (when stack-mode-manage-flycheck
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    54
                 (flycheck-mode 1)
81
4da7819d1a1c Simplified haskell-init.el.
Luke Hoersten <luke@hoersten.org>
parents: 80
diff changeset
    55
                 (flycheck-disable-checker 'haskell-ghc)
80
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    56
                 (flycheck-select-checker 'stack-ide)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    57
                 (flycheck-buffer)))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    58
      (when stack-mode-manage-flycheck
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    59
        (flycheck-mode -1)))))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    60
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    61
(define-derived-mode inferior-stack-mode fundamental-mode "Inferior-Stack-IDE"
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    62
  "Major mode for interacting with an inferior stack-ide process.")
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    63
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    64
(define-key inferior-stack-mode-map (kbd "C-c C-c") 'stack-mode-stop)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    65
(define-key inferior-stack-mode-map (kbd "C-c C-k") 'stack-mode-clear)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    66
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    67
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    68
;; Customization
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    69
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    70
(defgroup stack-mode nil
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    71
  "IDE backend support for Haskell."
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    72
  :group 'haskell)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    73
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    74
(defcustom stack-mode-proc-path
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    75
  "stack"
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    76
  "Path to the stack executable."
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    77
  :type 'string
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    78
  :group 'stack-mode)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    79
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    80
(defcustom stack-mode-manage-flycheck
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    81
  t
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    82
  "Automatically start and stop flycheck when the minor mode is
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    83
enabled/disabled."
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    84
  :type 'boolean
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    85
  :group 'stack-mode)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    86
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    87
(defcustom stack-mode-print-error-messages
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    88
  nil
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    89
  "Print error messages after loading the project?"
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    90
  :type 'boolean
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    91
  :group 'stack-mode)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    92
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    93
(defcustom stack-mode-show-popup
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    94
  nil
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    95
  "Show type and info messages in a popup?"
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    96
  :type 'boolean
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    97
  :group 'stack-mode)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    98
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
    99
(defvar stack-mode-queue nil)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   100
(make-variable-buffer-local 'stack-mode-queue)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   101
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   102
(defvar stack-mode-back-queue nil)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   103
(make-variable-buffer-local 'stack-mode-back-queue)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   104
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   105
(defvar stack-mode-buffer nil)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   106
(make-variable-buffer-local 'stack-mode-buffer)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   107
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   108
(defvar stack-mode-name nil)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   109
(make-variable-buffer-local 'stack-mode-name)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   110
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   111
(defvar stack-mode-tried-to-start nil)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   112
(make-variable-buffer-local 'stack-mode-tried-to-start)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   113
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   114
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   115
;; Interactive functions
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   116
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   117
(defun stack-mode-status ()
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   118
  "Print the status of the current stack process."
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   119
  (interactive)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   120
  (if (stack-mode-buffer)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   121
      (if (stack-mode-process)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   122
          (if (process-live-p (stack-mode-process))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   123
              (message "The process is live.")
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   124
            (message "There is a Stack process, but it's dead."))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   125
        (message "There is a stack buffer, but no Stack process."))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   126
    (message "There is no Stack buffer.")))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   127
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   128
(defun stack-mode-start ()
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   129
  "Start an inferior process and buffer."
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   130
  (interactive)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   131
  (if (stack-mode-live-p)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   132
      (switch-to-buffer (stack-mode-buffer))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   133
    (with-current-buffer (stack-mode-buffer)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   134
      (setq buffer-read-only t)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   135
      (inferior-stack-mode)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   136
      (stack-mode-set-initial-command)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   137
      (setq stack-mode-buffer "")
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   138
      (let* ((project-name (stack-mode-name))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   139
             (name (stack-mode-process-name project-name))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   140
             (args (append (list name
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   141
                                 nil
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   142
                                 stack-mode-proc-path
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   143
                                 "ide"
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   144
                                 "start")
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   145
                           (list project-name)))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   146
             (process (or (get-process name)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   147
                          (progn (stack-mode-log "Starting: %S" args)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   148
                                 (apply #'start-process
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   149
                                        args)))))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   150
        (set-process-sentinel process 'stack-mode-sentinel)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   151
        (set-process-filter process 'stack-mode-filter)))))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   152
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   153
(defun stack-mode-set-initial-command ()
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   154
  "Set the initial command callback. The `stack ide` command will
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   155
reload targets on start-up, so that's the default command we'll
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   156
start with."
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   157
  (setq stack-mode-current-command
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   158
        (list :json nil
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   159
              :data nil
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   160
              :cont 'stack-mode-loading-callback
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   161
              :label nil))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   162
  (setq stack-mode-queue (fifo-make))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   163
  (stack-mode-log "Set initial command."))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   164
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   165
(defun stack-mode-stop ()
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   166
  "Stop the process."
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   167
  (interactive)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   168
  (with-current-buffer (stack-mode-buffer)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   169
    (when (stack-mode-process)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   170
      (setq stack-mode-current-command nil)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   171
      (setq stack-mode-buffer "")
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   172
      (kill-process (stack-mode-process))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   173
      (delete-process (stack-mode-process)))))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   174
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   175
(defun stack-mode-reset ()
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   176
  "Reset the process."
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   177
  (interactive)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   178
  (with-current-buffer (stack-mode-buffer)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   179
    (when (stack-mode-process)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   180
      (setq stack-mode-current-command nil)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   181
      (setq stack-mode-buffer "")
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   182
      (setq stack-mode-queue (fifo-make)))))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   183
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   184
(defun stack-mode-restart ()
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   185
  "Restart the process with a fresh command queue."
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   186
  (interactive)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   187
  (stack-mode-stop)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   188
  (stack-mode-start))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   189
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   190
(defun stack-mode-live-p ()
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   191
  "Is the process alive?"
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   192
  (and (stack-mode-process)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   193
       (process-live-p (stack-mode-process))))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   194
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   195
(defun stack-mode-clear ()
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   196
  "Clear the interaction buffer."
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   197
  (interactive)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   198
  (with-current-buffer (stack-mode-buffer)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   199
    (let ((inhibit-read-only t))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   200
      (erase-buffer))))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   201
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   202
(defun stack-mode-load ()
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   203
  "Load the current buffer's file."
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   204
  (interactive)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   205
  (save-buffer)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   206
  (with-current-buffer (stack-mode-buffer)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   207
    (stack-mode-reload)))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   208
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   209
(defun stack-mode-goto ()
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   210
  "Go to definition of thing at point."
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   211
  (interactive)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   212
  (let ((filename (buffer-file-name))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   213
        (module-name (haskell-guess-module-name))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   214
        (span (stack-mode-span)))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   215
    (let* ((span-info
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   216
            (stack-mode-get-span-info
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   217
             module-name
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   218
             (with-current-buffer (stack-mode-buffer)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   219
               (file-relative-name filename default-directory))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   220
             span))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   221
           (infos
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   222
            (stack-contents
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   223
             span-info))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   224
           (_ (when (and (vectorp infos) (= 0 (length infos)))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   225
                (error "Couldn't find location for this. Is the module loaded in the backend?
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   226
Run `M-x stack-mode-list-loaded-modules' to see what's loaded.")))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   227
           (parts (mapcar #'identity (elt infos 0)))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   228
           (info (stack-contents (elt parts 0)))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   229
           (span (elt parts 1))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   230
           (scope (stack-lookup 'tag (stack-lookup 'idScope info)))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   231
           (def-span (stack-lookup-contents
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   232
                      'idDefSpan
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   233
                      (stack-lookup 'idProp info))))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   234
      (cond
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   235
       ((listp def-span)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   236
        (stack-mode-goto-span def-span))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   237
       (t
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   238
        (let* ((imported-from
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   239
                (stack-lookup
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   240
                 'idImportedFrom
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   241
                 (stack-lookup 'idScope info)))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   242
               (imported-module (stack-lookup 'moduleName imported-from))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   243
               (defined-in (stack-lookup
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   244
                            'idDefinedIn
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   245
                            (stack-lookup 'idProp info)))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   246
               (package (stack-lookup 'modulePackage defined-in))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   247
               (package-name (stack-lookup 'packageName package))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   248
               (package-ver (stack-lookup 'packageVersion package))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   249
               (module (stack-lookup 'moduleName defined-in)))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   250
          (message "Imported via %s, defined in %s (%s-%s)"
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   251
                   (haskell-fontify-as-mode imported-module 'haskell-mode)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   252
                   (haskell-fontify-as-mode module 'haskell-mode)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   253
                   package-name
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   254
                   package-ver)))))))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   255
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   256
(defun stack-mode-list-loaded-modules ()
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   257
  "List the loaded modules in the backend."
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   258
  (interactive)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   259
  (let ((modules
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   260
         (stack-contents
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   261
          (with-current-buffer (stack-mode-buffer)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   262
            (stack-mode-call
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   263
             `((tag . "RequestGetLoadedModules")
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   264
               (contents
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   265
                . [])))))))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   266
    (pop-to-buffer (stack-mode-buffer))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   267
    (stack-mode-log "Loaded modules: %s"
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   268
                    (mapconcat #'identity
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   269
                               (sort (mapcar #'identity modules) #'string<)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   270
                               "\n"))))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   271
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   272
(defun stack-mode-info ()
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   273
  "Display the info of the thing at point."
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   274
  (interactive)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   275
  (let* ((filename (buffer-file-name))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   276
         (module-name (haskell-guess-module-name))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   277
         (points (stack-mode-points))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   278
         (orig (point))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   279
         (span (stack-mode-span-from-points (car points)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   280
                                            (cdr points)))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   281
         (info (stack-mode-get-span-info
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   282
                module-name
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   283
                (with-current-buffer (stack-mode-buffer)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   284
                  (file-relative-name filename default-directory))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   285
                span))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   286
         (info-contents (stack-contents (elt (elt (stack-contents info) 0) 0)))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   287
         (scope (stack-lookup 'idScope info-contents))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   288
         (prop (stack-lookup 'idProp info-contents))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   289
         (qual (stack-lookup 'idImportQual scope))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   290
         (from (stack-lookup 'idImportedFrom scope))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   291
         (span (stack-lookup 'idImportSpan scope))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   292
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   293
         (space (stack-lookup 'idSpace prop))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   294
         (idDefSpan (stack-lookup 'idDefSpan prop))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   295
         (idDefinedIn (stack-lookup 'idDefinedIn prop))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   296
         (modulePackage (stack-lookup 'modulePackage idDefinedIn))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   297
         (moduleName (stack-lookup 'moduleName idDefinedIn))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   298
         (packageVersion (stack-lookup 'packageVersion modulePackage))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   299
         (packageKey (stack-lookup 'packageKey modulePackage))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   300
         (packageName (stack-lookup 'packageKey modulePackage))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   301
         (idType (stack-lookup 'idType prop))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   302
         (idName (stack-lookup 'idName prop)))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   303
    (let ((info-string (concat
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   304
                        "Identifier: " (haskell-fontify-as-mode idName 'haskell-mode) "\n"
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   305
                        "Type: " (haskell-fontify-as-mode idType 'haskell-mode) "\n"
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   306
                        "Module: " (haskell-fontify-as-mode moduleName 'haskell-mode) "\n"
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   307
                        "Package: "  (if (string= "main" packageName)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   308
                                         "(this one)"
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   309
                                       packageName))))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   310
      (cond (stack-mode-show-popup
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   311
             (when (boundp popup-tip)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   312
               (popup-tip info-string)))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   313
            (t (message info-string))))))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   314
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   315
(defun stack-mode-type (&optional insert-value)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   316
  "Display type info of thing at point."
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   317
  (interactive "P")
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   318
  (let* ((filename (buffer-file-name))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   319
         (module-name (haskell-guess-module-name))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   320
         (points (stack-mode-points))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   321
         (orig (point))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   322
         (span (stack-mode-span-from-points (car points)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   323
                                            (cdr points))))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   324
    (let* ((types (stack-contents
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   325
                   (stack-mode-get-exp-types
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   326
                    module-name
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   327
                    (with-current-buffer (stack-mode-buffer)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   328
                      (file-relative-name filename default-directory))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   329
                    span)))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   330
           (types (mapcar #'identity types))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   331
           (code (buffer-substring-no-properties
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   332
                  (car points)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   333
                  (cdr points)))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   334
           (type (stack-contents (car types)))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   335
           (ty (stack-lookup 'text type)))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   336
      (if insert-value
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   337
          (let ((ident-pos (haskell-ident-pos-at-point)))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   338
            (cond
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   339
             ((region-active-p)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   340
              (delete-region (region-beginning)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   341
                             (region-end))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   342
              (insert "(" code " :: " ty ")")
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   343
              (goto-char (1+ orig)))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   344
             ((= (line-beginning-position) (car ident-pos))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   345
              (goto-char (line-beginning-position))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   346
              (insert code " :: " (haskell-fontify-as-mode ty 'haskell-mode)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   347
                      "\n"))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   348
             (t
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   349
              (save-excursion
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   350
                (goto-char (car ident-pos))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   351
                (let ((col (current-column)))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   352
                  (save-excursion (insert "\n")
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   353
                                  (indent-to col))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   354
                  (insert code " :: " (haskell-fontify-as-mode ty 'haskell-mode)))))))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   355
        (unless (null types)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   356
          (let ((type-string (format "%s"
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   357
                                     (mapconcat (lambda (type)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   358
                                                  (haskell-fontify-as-mode
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   359
                                                   (concat
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   360
                                                    code
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   361
                                                    " :: "
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   362
                                                    (elt type 0))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   363
                                                   'haskell-mode))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   364
                                                (cl-subseq types 0 1)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   365
                                                "\n"))))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   366
            (cond (stack-mode-show-popup (popup-tip type-string))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   367
                  (t (message type-string)))))))))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   368
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   369
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   370
;; Process filters and sentinel
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   371
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   372
(defun stack-mode-filter (process response)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   373
  (with-current-buffer (stack-mode-buffer (stack-mode-name-from-process process))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   374
    (if stack-mode-current-command
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   375
        (let* ((lines (split-string (concat stack-mode-buffer response) "\n")))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   376
          (setq stack-mode-buffer (car (last lines)))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   377
          (setq lines (butlast lines))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   378
          (let ((data (plist-get stack-mode-current-command :data))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   379
                (cont (plist-get stack-mode-current-command :cont)))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   380
            (while lines
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   381
              (let ((line (pop lines)))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   382
                (stack-mode-log
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   383
                 "%s <- %s"
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   384
                 (if (plist-get stack-mode-current-command :label)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   385
                     (format "[%s]" (plist-get stack-mode-current-command :label))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   386
                   "")
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   387
                 (haskell-fontify-as-mode line 'javascript-mode))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   388
                (when (let* ((error-msg nil)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   389
                             (json (condition-case e
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   390
                                       (json-read-from-string line)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   391
                                     (error "Problem reading JSON from server, probably an error message:\n%s" line)))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   392
                             (ret (condition-case e
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   393
                                      (funcall cont data json)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   394
                                    (error (setq error-msg e)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   395
                                           :error))))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   396
                        (cl-ecase ret
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   397
                          (:done t)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   398
                          (:continue nil)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   399
                          (:error
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   400
                           (setq stack-mode-buffer "")
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   401
                           (setq stack-mode-current-command nil)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   402
                           (setq stack-mode-queue nil)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   403
                           (error "Command handler error: %S\n\nThe command queue has been cleared."
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   404
                                  error-msg))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   405
                          (t
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   406
                           (error "A command handler must return either :done or :continue,
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   407
but it returned: %S
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   408
command was: %S" ret stack-mode-current-command))))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   409
                  (cl-loop for line in lines
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   410
                           do (stack-mode-log
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   411
                               "Extraneous lines after command completed: %s"
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   412
                               (haskell-fontify-as-mode line 'javascript-mode)))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   413
                  (setq stack-mode-current-command nil)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   414
                  (setq lines nil)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   415
                  (stack-mode-queue-trigger))))))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   416
      (stack-mode-log "Ignoring: %s"
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   417
                      (haskell-fontify-as-mode response 'javascript-mode)))))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   418
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   419
(defun stack-mode-sentinel (process event)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   420
  (with-current-buffer (stack-mode-buffer (stack-mode-name-from-process process))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   421
    (stack-mode-log "Process event: %s" event)))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   422
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   423
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   424
;; Command queue
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   425
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   426
(defvar stack-mode-current-command nil
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   427
  "Current command handler.")
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   428
(make-variable-buffer-local 'stack-mode-current-command)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   429
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   430
(defvar stack-mode-buffer ""
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   431
  "A buffer for the process.")
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   432
(make-variable-buffer-local 'stack-mode-buffer)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   433
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   434
(defvar stack-mode-queue nil
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   435
  "Command queue.")
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   436
(make-variable-buffer-local 'stack-mode-queue)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   437
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   438
(defun stack-mode-queue ()
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   439
  "Get the FIFO queue of this process."
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   440
  (or stack-mode-queue
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   441
      (setq stack-mode-queue (fifo-make))))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   442
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   443
(defun stack-mode-back-queue ()
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   444
  "Get the FIFO back queue of this process."
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   445
  (or stack-mode-back-queue
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   446
      (setq stack-mode-back-queue (fifo-make))))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   447
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   448
(defun stack-mode-enqueue-front (json data cont &optional label)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   449
  "Enqueue a JSON command to the command queue, calling (CONT
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   450
DATA line) for each response line until CONT returns nil. This is
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   451
the first priority queue, anything pushed to this queue will be
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   452
run before anything in the back queue."
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   453
  (cond
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   454
   ((stack-mode-live-p)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   455
    (stack-mode-log "[%s] => %s" label (haskell-fontify-as-mode (json-encode json) 'javascript-mode))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   456
    (fifo-push (stack-mode-queue)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   457
               (list :json json :data data :cont cont :label label))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   458
    (stack-mode-queue-trigger))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   459
   (t (stack-mode-try-start))))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   460
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   461
(defun stack-mode-enqueue (json data cont &optional label)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   462
  "Same as `stack-mode-front', but puts it on the back
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   463
queue. Items are only moved onto the front queue when the front
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   464
queue is empty. This lets a command which consists of a few back
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   465
and forth steps to continue its processing uninterrupted."
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   466
  (cond
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   467
   ((stack-mode-live-p)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   468
    (stack-mode-log "[%s] ~> %s" label (haskell-fontify-as-mode (json-encode json) 'javascript-mode))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   469
    (fifo-push (stack-mode-back-queue)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   470
               (list :json json :data data :cont cont :label label))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   471
    (stack-mode-queue-trigger))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   472
   (t (stack-mode-try-start))))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   473
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   474
(defun stack-mode-try-start ()
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   475
  "Try to start, but only try once."
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   476
  (cond
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   477
   ((not stack-mode-tried-to-start)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   478
    (setq stack-mode-tried-to-start t)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   479
    (message "Starting a Stack IDE backend process for this project: %s, stack directory: %s"
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   480
             (stack-mode-cabal-name)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   481
             (stack-mode-dir))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   482
    (stack-mode-start))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   483
   (t (message "Attempted to run a Stack IDE command, but the server isn't started. We already tried once this session. Run `M-x stack-mode-restart` to confirm that you want to start it."))))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   484
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   485
(defun stack-mode-call (json)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   486
  "Call a JSON command. Wait for any existing queued commands to
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   487
complete, then sends the request, blocking on the
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   488
response. Returns the response."
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   489
  (let ((data (list nil)))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   490
    (stack-mode-enqueue
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   491
     json data
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   492
     (lambda (data reply)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   493
       (setcar data reply)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   494
       :done))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   495
    (stack-mode-queue-flush)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   496
    (car-safe data)))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   497
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   498
(defun stack-mode-queue-processed-p ()
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   499
  "Return t if command queue has been completely processed."
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   500
  (and (fifo-null-p stack-mode-queue)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   501
       (null stack-mode-current-command)))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   502
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   503
(defun stack-mode-queue-flush ()
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   504
  "Block till PROCESS's command queue has been completely processed.
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   505
This uses `accept-process-output' internally."
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   506
  (let ((proc (stack-mode-process)))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   507
    (while (not (stack-mode-queue-processed-p))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   508
      (stack-mode-queue-trigger)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   509
      (accept-process-output proc 1))))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   510
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   511
(defun stack-mode-queue-trigger ()
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   512
  "Trigger the next command in the queue if there is no current
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   513
command."
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   514
  (if stack-mode-current-command
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   515
      (unless (fifo-null-p (stack-mode-queue))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   516
        (stack-mode-log "Stack command queue is currently active, waiting ..."))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   517
    (when (fifo-null-p (stack-mode-queue))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   518
      (stack-mode-log "Command queue is now empty.")
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   519
      (unless (fifo-null-p (stack-mode-back-queue))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   520
        (stack-mode-log "Pushing next item from back queue to front queue ...")
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   521
        (fifo-push (stack-mode-queue)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   522
                   (fifo-pop (stack-mode-back-queue)))))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   523
    (unless (fifo-null-p (stack-mode-queue))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   524
      (setq stack-mode-current-command
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   525
            (fifo-pop (stack-mode-queue)))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   526
      (stack-mode-log
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   527
       "[%S] -> %s"
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   528
       (plist-get stack-mode-current-command :label)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   529
       (haskell-fontify-as-mode
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   530
        (json-encode (plist-get stack-mode-current-command :json))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   531
        'javascript-mode))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   532
      (process-send-string
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   533
       (stack-mode-process)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   534
       (concat (json-encode (plist-get stack-mode-current-command :json))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   535
               "\n")))))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   536
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   537
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   538
;; Project functions
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   539
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   540
(defun stack-mode-packages ()
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   541
  "Get packages for the Stack configuration."
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   542
  (split-string (shell-command-to-string "stack ide packages") "\n" t))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   543
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   544
(defun stack-mode-process ()
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   545
  "Get the current process."
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   546
  (get-process (stack-mode-process-name (stack-mode-name))))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   547
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   548
(defun stack-mode-buffer (&optional name)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   549
  "The inferior buffer."
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   550
  (let ((default-directory (stack-mode-dir)))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   551
    (get-buffer-create
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   552
     (stack-mode-buffer-name
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   553
      (or name
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   554
          (stack-mode-name))))))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   555
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   556
(defun stack-mode-name-from-process (proc)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   557
  "Get the name of the project from the process."
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   558
  (substring (process-name proc) (length "stack:")))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   559
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   560
(defun stack-mode-process-name (name)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   561
  "Name for the inferior process."
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   562
  (format "stack:%s"
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   563
          name))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   564
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   565
(defun stack-mode-buffer-name (name)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   566
  "Name for the inferior buffer."
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   567
  (format "*stack:%s*"
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   568
          name))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   569
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   570
(defun stack-mode-dir ()
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   571
  "The directory for the project."
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   572
  (file-name-directory (haskell-cabal-find-file)))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   573
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   574
(defun stack-mode-name ()
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   575
  "The name for the current project based on the current
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   576
directory."
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   577
  (or stack-mode-name
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   578
      (setq stack-mode-name
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   579
            (stack-mode-cabal-name))))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   580
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   581
(defun stack-mode-cabal-name ()
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   582
  "Get the name of the session to use, based on the cabal file."
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   583
  (let ((cabal-file (haskell-cabal-find-file)))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   584
    (if (string-match "\\([^\\/]+\\)\\.cabal$" cabal-file)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   585
        (let ((name (match-string 1 cabal-file)))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   586
          (when (not (member name (stack-mode-packages)))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   587
            (message "This cabal project “%s” isn't in your stack.yaml configuration." name))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   588
          name)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   589
      (progn (message "Couldn't figure out cabal file, assuming no project.")
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   590
             nil))))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   591
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   592
(defun stack-mode-log (&rest args)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   593
  "Log a string to the inferior buffer."
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   594
  (with-current-buffer (stack-mode-buffer)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   595
    (goto-char (point-max))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   596
    (let ((inhibit-read-only t))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   597
      (insert (apply #'format args)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   598
              "\n"))))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   599
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   600
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   601
;; Commands
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   602
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   603
(defun stack-mode-reload ()
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   604
  "Compile the code and fetch compile errors."
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   605
  (with-current-buffer (stack-mode-buffer)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   606
    (stack-mode-enqueue
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   607
     `((tag . "RequestUpdateSession")
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   608
       (contents . []))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   609
     nil
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   610
     'stack-mode-loading-callback)))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   611
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   612
;; (defun stack-mode-load-buffer ()
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   613
;;   "Compile the code and fetch compile errors."
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   614
;;   (interactive)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   615
;;   (with-current-buffer (stack-mode-buffer)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   616
;;     (stack-mode-enqueue
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   617
;;      `((tag . "RequestUpdateSession")
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   618
;;        (contents . [((tag . "RequestUpdateTargets")
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   619
;;                      (contents . ((tag . "TargetsInclude")
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   620
;;                                   (contents . ["src/Stack/Package.hs"]))))]))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   621
;;      nil
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   622
;;      'stack-mode-loading-callback)))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   623
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   624
(defun stack-mode-get-span-info (module file span)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   625
  "Get the span info of the given location."
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   626
  (with-current-buffer (stack-mode-buffer)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   627
    (stack-mode-call
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   628
     `((tag . "RequestGetSpanInfo")
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   629
       (contents
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   630
        . ((spanFilePath   . ,file)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   631
           (spanFromLine   . ,(plist-get span :sl))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   632
           (spanFromColumn . ,(plist-get span :sc))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   633
           (spanToLine     . ,(plist-get span :el))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   634
           (spanToColumn   . ,(plist-get span :ec))))))))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   635
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   636
(defun stack-mode-get-exp-types (module file span)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   637
  "Get the type info of the given location."
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   638
  (with-current-buffer (stack-mode-buffer)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   639
    (stack-mode-call
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   640
     `((tag . "RequestGetExpTypes")
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   641
       (contents
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   642
        . ((spanFilePath   . ,file)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   643
           (spanFromLine   . ,(plist-get span :sl))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   644
           (spanFromColumn . ,(plist-get span :sc))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   645
           (spanToLine     . ,(plist-get span :el))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   646
           (spanToColumn   . ,(plist-get span :ec))))))))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   647
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   648
(defun stack-mode-get-use-sites (module file span)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   649
  "Get all uses of an identifier."
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   650
  )
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   651
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   652
(defun stack-mode-get-completions (module string)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   653
  "Get all uses of an identifier."
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   654
  )
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   655
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   656
(defun stack-mode-loading-callback (_ reply)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   657
  "Callback for when loading modules."
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   658
  (let ((tag (stack-tag reply)))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   659
    (cond
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   660
     ((string= tag "ResponseUpdateSession")
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   661
      (let* ((contents (stack-contents reply))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   662
             (tag (stack-tag contents)))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   663
        (cond
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   664
         ((string= tag "UpdateStatusProgress")
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   665
          (stack-mode-progress-callback _ reply)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   666
          :continue)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   667
         ((string= tag "UpdateStatusDone")
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   668
          (stack-mode-enqueue-front
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   669
           `((tag . "RequestGetSourceErrors")
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   670
             (contents . []))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   671
           nil
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   672
           'stack-mode-get-source-errors-callback)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   673
          :done)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   674
         (t :continue))))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   675
     (t
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   676
      :continue))))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   677
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   678
(defun stack-mode-progress-callback (_ reply)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   679
  "Callback for status reports. Utilized in multiple places."
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   680
  (let* ((contents (stack-contents reply))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   681
         (update (stack-contents contents))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   682
         (step (stack-lookup 'progressStep update))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   683
         (total (stack-lookup 'progressNumSteps update))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   684
         (msg (stack-lookup 'progressParsedMsg update)))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   685
    (message "[%s/%s] %s"
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   686
             (propertize (number-to-string step) 'face 'compilation-line-number)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   687
             (propertize (number-to-string total) 'face 'compilation-line-number)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   688
             msg)))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   689
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   690
(defun stack-mode-get-source-errors-callback (_ reply)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   691
  "Handle the reply from getting source errors."
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   692
  (let ((tag (stack-tag reply)))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   693
    (cond
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   694
     ((string= tag "ResponseGetSourceErrors")
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   695
      (let ((any-errors nil)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   696
            (warnings 0))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   697
        (cl-loop
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   698
         for item in (mapcar #'identity (stack-contents reply))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   699
         do (let* ((kind (stack-lookup 'errorKind item))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   700
                   (span (stack-contents (stack-lookup 'errorSpan item)))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   701
                   (msg (stack-lookup 'errorMsg item))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   702
                   (fp (stack-lookup 'spanFilePath span))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   703
                   (sl (stack-lookup 'spanFromLine span))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   704
                   (sc (stack-lookup 'spanFromColumn span))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   705
                   (el (stack-lookup 'spanToLine span))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   706
                   (ec (stack-lookup 'spanToColumn span)))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   707
              (cond ((string= kind "KindError")
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   708
                     (setq any-errors t))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   709
                    ((string= kind "KindWarning")
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   710
                     (setq warnings (1+ warnings))))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   711
              (when
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   712
                  stack-mode-print-error-messages
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   713
                (message "%s"
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   714
                         (propertize
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   715
                          (format "%s:(%d,%d)-(%d,%d): \n%s"
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   716
                                  fp sl sc el ec msg)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   717
                          'face
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   718
                          (cond
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   719
                           ((string= kind "KindWarning")
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   720
                            'compilation-warning)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   721
                           ((string= kind "KindError")
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   722
                            'compilation-error)))))))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   723
        (unless any-errors
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   724
          (if (= 0 warnings)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   725
              (message "OK.")
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   726
            (message (propertize "OK (%d warning%s)." 'face 'compilation-warning)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   727
                     warnings
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   728
                     (if (= 1 warnings) "" "s")))))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   729
      :done)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   730
     (t :done))))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   731
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   732
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   733
;; Span functions
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   734
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   735
(defun stack-mode-points ()
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   736
  "Get the current points; either a selected region or an
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   737
identifier's points."
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   738
  (if (region-active-p)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   739
      (cons (region-beginning) (region-end))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   740
    (let ((ident (haskell-ident-pos-at-point)))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   741
      (cons (car ident)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   742
            (cdr ident)))))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   743
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   744
(defun stack-mode-span-from-points (beg end)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   745
  "Get the span representation for the span from BEG to END."
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   746
  (save-excursion
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   747
    (list :sl (progn (goto-char beg)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   748
                     (line-number-at-pos))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   749
          :sc (1+ (current-column))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   750
          :el (progn (goto-char end)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   751
                     (line-number-at-pos))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   752
          :ec (1+ (current-column)))))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   753
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   754
(defun stack-mode-span ()
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   755
  "Get the span from the haskell points."
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   756
  (let ((points (or (haskell-spanable-pos-at-point)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   757
                    (haskell-ident-pos-at-point)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   758
                    (stack-mode-loose-ident-at-point))))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   759
    (if points
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   760
        (stack-mode-span-from-points (car points) (cdr points))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   761
      (error "No identifier at point."))))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   762
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   763
(defun stack-mode-goto-span (span)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   764
  "Get buffer points from a span."
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   765
  (with-current-buffer (stack-mode-buffer)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   766
    (find-file (stack-lookup 'spanFilePath span))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   767
    (goto-char (point-min))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   768
    (let ((beg (point)))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   769
      (goto-char (point-min))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   770
      (forward-line (1- (stack-lookup 'spanFromLine span)))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   771
      (goto-char (line-beginning-position))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   772
      (forward-char (1- (stack-lookup 'spanFromColumn span))))))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   773
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   774
(defun stack-mode-loose-ident-at-point ()
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   775
  "Get the loose ident at point."
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   776
  nil)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   777
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   778
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   779
;; JSON helpers
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   780
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   781
(defun stack-mode-list->hashtable (xs)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   782
  "Convert a list to a hashtable."
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   783
  (let ((h (make-hash-table)))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   784
    (cl-loop for (key . val)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   785
             in xs
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   786
             do (puthash key val h))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   787
    h))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   788
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   789
(defun stack-lookup (key object)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   790
  "Get from a JSON object."
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   791
  (cdr (assoc key (mapcar #'identity object))))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   792
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   793
(defun stack-contents (object)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   794
  "Get from a JSON object."
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   795
  (stack-lookup 'contents object))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   796
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   797
(defun stack-tag (object)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   798
  "Get the tag of an object."
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   799
  (stack-lookup 'tag object))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   800
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   801
(defun stack-lookup-contents (key object)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   802
  "Get from a JSON object."
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   803
  (stack-contents (stack-lookup key object)))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   804
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   805
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   806
;; Flycheck integration
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   807
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   808
(defun stack-mode-flycheck-start (checker flycheck-callback &optional buffer attempt-count)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   809
  "Run a compile on demand, triggered by Flycheck."
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   810
  (when buffer (set-buffer buffer))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   811
  (let ((max-attempts 2))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   812
    (if (not (stack-mode-live-p))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   813
        (if (> (or attempt-count 0) max-attempts)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   814
            (stack-mode-log "Stack backend isn't ready for Flycheck use. Giving up (waited %d seconds)."
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   815
                            max-attempts)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   816
          (stack-mode-log "Stack backend isn't ready. Waiting (%d attempts) ..."
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   817
                          (or attempt-count 0))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   818
          (progn (stack-mode-log "Flycheck tried to use the Stack backend, but the Stack backend isn't started yet. Starting it ...")
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   819
                 (stack-mode-try-start)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   820
                 (run-with-idle-timer 1 nil 'stack-mode-flycheck-start checker flycheck-callback
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   821
                                      (current-buffer)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   822
                                      (1+ (or attempt-count 0)))))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   823
      (progn (stack-mode-log "Running Flycheck with Stack backend ...")
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   824
             (write-region (point-min) (point-max) (buffer-file-name))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   825
             (clear-visited-file-modtime)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   826
             (let ((source-buffer (current-buffer))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   827
                   (label (format "flycheck %s" (buffer-name (current-buffer)))))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   828
               (with-current-buffer (stack-mode-buffer)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   829
                 (stack-mode-enqueue
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   830
                  `((tag . "RequestUpdateSession")
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   831
                    (contents . []))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   832
                  (list :flycheck-callback flycheck-callback
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   833
                        :stack-buffer (current-buffer)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   834
                        :source-buffer source-buffer
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   835
                        :label label)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   836
                  'stack-mode-flycheck-callback
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   837
                  label)))))))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   838
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   839
(defun stack-mode-flycheck-callback (state reply)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   840
  "Callback for the flycheck loading. Once done, it will report
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   841
  errors/warnings to CALLBACK."
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   842
  (let ((tag (stack-tag reply)))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   843
    (cond
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   844
     ((string= tag "ResponseUpdateSession")
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   845
      (let* ((contents (stack-contents reply))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   846
             (tag (stack-tag contents)))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   847
        (cond
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   848
         ((string= tag "UpdateStatusProgress")
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   849
          (stack-mode-progress-callback nil reply)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   850
          :continue)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   851
         ((string= tag "UpdateStatusDone")
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   852
          (stack-mode-enqueue-front
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   853
           `((tag . "RequestGetSourceErrors")
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   854
             (contents . []))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   855
           state
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   856
           'stack-mode-flycheck-errors-callback
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   857
           (plist-get state :label))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   858
          :done)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   859
         (t :continue))))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   860
     (t
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   861
      :continue))))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   862
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   863
(defun stack-mode-flycheck-errors-callback (state reply)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   864
  "Collect error messages and pass them to FLYCHECK-CALLBACK."
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   865
  (let ((tag (stack-tag reply)))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   866
    (cond
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   867
     ((string= tag "ResponseGetSourceErrors")
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   868
      (let ((messages (list)))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   869
        (cl-loop
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   870
         for item in (mapcar #'identity (stack-contents reply))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   871
         do (let* ((kind (stack-lookup 'errorKind item))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   872
                   (span (stack-contents (stack-lookup 'errorSpan item)))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   873
                   (msg (stack-lookup 'errorMsg item))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   874
                   (filename (stack-lookup 'spanFilePath span))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   875
                   (sl (stack-lookup 'spanFromLine span))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   876
                   (sc (stack-lookup 'spanFromColumn span))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   877
                   (el (stack-lookup 'spanToLine span))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   878
                   (ec (stack-lookup 'spanToColumn span)))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   879
              (let ((orig (current-buffer))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   880
                    (buffer
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   881
                     (with-current-buffer (plist-get state :stack-buffer)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   882
                       (let ((value (get-file-buffer filename)))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   883
                             (if (listp value)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   884
                                 (car value)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   885
                               value)))))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   886
                (if (not (null buffer))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   887
                 (add-to-list
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   888
                  'messages
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   889
                  (flycheck-error-new-at
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   890
                   sl sc
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   891
                   (cond
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   892
                    ((string= kind "KindWarning") 'warning)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   893
                    ((string= kind "KindError") 'error)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   894
                    (t (message "kind: %s" kind)'error))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   895
                   msg
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   896
                   :checker 'stack-ide
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   897
                   :buffer buffer)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   898
                  t))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   899
                (set-buffer orig))))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   900
        ;; Calling it asynchronously is necessary for flycheck to
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   901
        ;; work properly. See
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   902
        ;; <https://github.com/flycheck/flycheck/pull/524#issuecomment-64947118>
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   903
        ;;
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   904
        ;; Also, the `stack-mode-call-in-buffer' utility is also
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   905
        ;; needed because the reply needs to be called in the same
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   906
        ;; buffer.
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   907
        (run-with-idle-timer 0
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   908
                             nil
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   909
                             'stack-mode-call-in-buffer
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   910
                             (plist-get state :source-buffer)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   911
                             (plist-get state :flycheck-callback)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   912
                             'finished
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   913
                             messages)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   914
        (message "Flycheck done."))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   915
      :done)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   916
     (t :done))))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   917
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   918
(defun stack-mode-call-in-buffer (buffer func &rest args)
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   919
  "Utility function which calls FUNC in BUFFER with ARGS."
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   920
  (with-current-buffer buffer
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   921
    (apply func args)))
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   922
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   923
(flycheck-define-generic-checker 'stack-ide
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   924
  "A syntax and type checker for Haskell using Stack's IDE support."
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   925
  :start 'stack-mode-flycheck-start
81
4da7819d1a1c Simplified haskell-init.el.
Luke Hoersten <luke@hoersten.org>
parents: 80
diff changeset
   926
  :modes '(haskell-mode)
4da7819d1a1c Simplified haskell-init.el.
Luke Hoersten <luke@hoersten.org>
parents: 80
diff changeset
   927
  :next-checkers '((warning . haskell-hlint)))
80
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   928
e848f1863d6b Trying stack-ide-mode.
Luke Hoersten <luke@hoersten.org>
parents:
diff changeset
   929
(provide 'stack-mode)