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