packages feed

intero 0.1.14 → 0.1.15

raw patch · 2 files changed

+157/−26 lines, 2 files

Files

elisp/intero.el view
@@ -54,7 +54,7 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Configuration -(defconst intero-package-version "0.1.13"+(defconst intero-package-version "0.1.15"   "Package version to auto-install.")  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;@@ -256,7 +256,8 @@     (intero-get-worker-create 'backend targets (current-buffer))))  (defun intero-destroy (&optional worker)-  "Stop the current worker process and kill its associated."+  "Stop the current worker process and kill its associated+process buffer."   (interactive)   (if worker       (intero-delete-worker worker)@@ -425,6 +426,13 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Company integration (auto-completion) +(defconst intero-pragmas+  '("CONLIKE" "SCC" "DEPRECATED" "INCLUDE" "INCOHERENT" "INLINABLE" "INLINE"+    "LANGUAGE" "LINE" "MINIMAL" "NOINLINE" "NOUNPACK" "OPTIONS" "OPTIONS_GHC"+    "OVERLAPPABLE" "OVERLAPPING" "OVERLAPS" "RULES" "SOURCE" "SPECIALIZE"+    "UNPACK" "WARNING")+  "Pragmas that GHC supports.")+ (defun company-intero (command &optional arg &rest ignored)   (interactive (list 'interactive))   (cl-case command@@ -440,14 +448,43 @@      (unless (intero-gave-up 'backend)        (let ((prefix-info (intero-completions-grab-prefix)))          (when prefix-info-           (cl-destructuring-bind-               (beg end prefix _type) prefix-info-             (intero-get-completions beg end))))))))+           (cons :async+                 (-partial 'intero-company-callback+                           (current-buffer)+                           prefix-info)))))))) +(defun intero-company-callback (source-buffer prefix-info cont)+  "Generate completions and call CONT on the results."+  (cl-destructuring-bind+      (beg end prefix type) prefix-info+    (or (cl-case type+          (haskell-completions-module-name-prefix+           (intero-get-repl-completions source-buffer (concat "import " prefix) cont))+          (haskell-completions-identifier-prefix+           (intero-get-completions source-buffer beg end cont))+          (haskell-completions-language-extension-prefix+           (intero-get-repl-completions+            source-buffer+            (concat ":set -X" prefix)+            (-partial (lambda (cont results)+                        (funcall cont+                                 (mapcar (lambda (x)+                                           (replace-regexp-in-string "^-X" "" x))+                                         results)))+                      cont)))+          (haskell-completions-pragma-name-prefix+           (funcall cont+                    (cl-remove-if-not+                     (lambda (candidate)+                       (string-match (concat "^" prefix) candidate))+                     intero-pragmas))))+        (intero-get-repl-completions source-buffer prefix cont))))+ (defun intero-completions-grab-prefix (&optional minlen)   "Grab prefix at point for possible completion."   (when (intero-completions-can-grab-prefix)     (let ((prefix (cond+                   ((intero-completions-grab-pragma-prefix))                    ((intero-completions-grab-identifier-prefix)))))       (cond ((and minlen prefix)              (when (>= (length (nth 2 prefix)) minlen)@@ -498,6 +535,76 @@             (setq type 'haskell-completions-general-prefix))           (when value (list start end value type))))))) +(defun intero-completions-grab-pragma-prefix ()+  "Grab completion prefix for pragma completions.+Returns a list of form '(prefix-start-position+prefix-end-position prefix-value prefix-type) for pramga names+such as WARNING, DEPRECATED, LANGUAGE etc.  Also returns+completion prefixes for options in case OPTIONS_GHC pragma, or+language extensions in case of LANGUAGE pragma.  Obsolete OPTIONS+pragma is supported also."+  (when (nth 4 (syntax-ppss))+    ;; We're inside comment+    (let ((p (point))+          (comment-start (nth 8 (syntax-ppss)))+          (case-fold-search nil)+          prefix-start+          prefix-end+          prefix-type+          prefix-value)+      (save-excursion+        (goto-char comment-start)+        (when (looking-at (rx "{-#" (1+ (| space "\n"))))+          (let ((pragma-start (match-end 0)))+            (when (> p pragma-start)+              ;; point stands after `{-#`+              (goto-char pragma-start)+              (when (looking-at (rx (1+ (| upper "_"))))+                ;; found suitable sequence for pragma name+                (let ((pragma-end (match-end 0))+                      (pragma-value (match-string-no-properties 0)))+                  (if (eq p pragma-end)+                      ;; point is at the end of (in)complete pragma name+                      ;; prepare resulting values+                      (progn+                        (setq prefix-start pragma-start)+                        (setq prefix-end pragma-end)+                        (setq prefix-value pragma-value)+                        (setq prefix-type+                              'haskell-completions-pragma-name-prefix))+                    (when (and (> p pragma-end)+                               (or (equal "OPTIONS_GHC" pragma-value)+                                   (equal "OPTIONS" pragma-value)+                                   (equal "LANGUAGE" pragma-value)))+                      ;; point is after pragma name, so we need to check+                      ;; special cases of `OPTIONS_GHC` and `LANGUAGE` pragmas+                      ;; and provide a completion prefix for possible ghc+                      ;; option or language extension.+                      (goto-char pragma-end)+                      (when (re-search-forward+                             (rx (* anything)+                                 (1+ (regexp "\\S-")))+                             p+                             t)+                        (let* ((str (match-string-no-properties 0))+                               (split (split-string str (rx (| space "\n")) t))+                               (val (car (last split)))+                               (end (point)))+                          (when (and (equal p end)+                                     (not (string-match-p "#" val)))+                            (setq prefix-value val)+                            (backward-char (length val))+                            (setq prefix-start (point))+                            (setq prefix-end end)+                            (setq+                             prefix-type+                             (if (not (equal "LANGUAGE" pragma-value))+                                 'haskell-completions-ghc-option-prefix+                               'haskell-completions-language-extension-prefix+                               )))))))))))))+      (when prefix-value+        (list prefix-start prefix-end prefix-value prefix-type)))))+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ELDoc integration @@ -768,25 +875,49 @@                             (1+ (current-column)))             (buffer-substring-no-properties beg end))))) -(defun intero-get-completions (beg end)+(defun intero-get-completions (source-buffer beg end cont)   "Get completions for a PREFIX."-  (split-string-   (intero-blocking-call-    'backend-    (format ":complete-at %S %d %d %d %d %S"-            (intero-buffer-file-name)-            (save-excursion (goto-char beg)-                            (line-number-at-pos))-            (save-excursion (goto-char beg)-                            (1+ (current-column)))-            (save-excursion (goto-char end)-                            (line-number-at-pos))-            (save-excursion (goto-char end)-                            (1+ (current-column)))-            (buffer-substring-no-properties beg end)))-   "\n"-   t))+  (intero-async-call+   'backend+   (format ":complete-at %S %d %d %d %d %S"+           (intero-buffer-file-name)+           (save-excursion (goto-char beg)+                           (line-number-at-pos))+           (save-excursion (goto-char beg)+                           (1+ (current-column)))+           (save-excursion (goto-char end)+                           (line-number-at-pos))+           (save-excursion (goto-char end)+                           (1+ (current-column)))+           (buffer-substring-no-properties beg end))+   (list :cont cont :source-buffer source-buffer)+   (lambda (state reply)+     (with-current-buffer+         (plist-get state :source-buffer)+       (funcall+        (plist-get state :cont)+        (mapcar+         (lambda (x)+           (replace-regexp-in-string "\\\"" "" x))+         (cdr (split-string reply "\n" t)))))))) +(defun intero-get-repl-completions (source-buffer prefix cont)+  "Get REPL completions for PREFIX, calling CONT with the results+in buffer SOURCE-BUFFER."+  (intero-async-call+   'backend+   (format ":complete repl %S" prefix)+   (list :cont cont :source-buffer source-buffer)+   (lambda (state reply)+     (with-current-buffer+         (plist-get state :source-buffer)+       (funcall+        (plist-get state :cont)+        (mapcar+         (lambda (x)+           (replace-regexp-in-string "\\\"" "" x))+         (cdr (split-string reply "\n" t))))))))+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Process communication @@ -909,8 +1040,8 @@             (intero-make-options-list              (or targets                  (let ((package-name (buffer-local-value 'intero-package-name buffer)))-                          (unless (equal "" package-name)-                            (list package-name))))+                   (unless (equal "" package-name)+                     (list package-name))))              (not (buffer-local-value 'intero-try-with-build buffer))))            (arguments options)            (process (with-current-buffer buffer
intero.cabal view
@@ -1,7 +1,7 @@ name:   intero version:-  0.1.14+  0.1.15 synopsis:   Complete interactive development program for Haskell license:@@ -47,7 +47,7 @@   main-is:     Main.hs   ghc-options:-    -Wall -O2 -threaded+    -Wall -O2 -threaded -rtsopts   include-dirs:     cbits/   hs-source-dirs: