ghc-mod 1.10.9 → 1.10.10
raw patch · 8 files changed
+106/−36 lines, 8 files
Files
- Check.hs +3/−1
- GHCApi.hs +6/−3
- GHCMod.hs +3/−8
- Types.hs +14/−4
- elisp/ghc-flymake.el +37/−0
- elisp/ghc-info.el +39/−18
- elisp/ghc.el +3/−1
- ghc-mod.cabal +1/−1
Check.hs view
@@ -25,4 +25,6 @@ setTargetFile file load LoadAllTargets liftIO readLog- options = ["-Wall","-fno-warn-unused-do-bind"] ++ ghcOpts opt+ options+ | expandSplice opt = ["-w:"] ++ ghcOpts opt+ | otherwise = ["-Wall","-fno-warn-unused-do-bind"] ++ ghcOpts opt
GHCApi.hs view
@@ -31,20 +31,23 @@ dflags <- getSessionDynFlags let opts = map noLoc cmdOpts (dflags',_,_) <- parseDynamicFlags dflags opts- (dflags'',readLog) <- liftIO . (>>= setLogger logging) . setGhcFlags opt . setFlags dflags' $ idirs+ (dflags'',readLog) <- liftIO . (>>= setLogger logging) . setGhcFlags opt . setFlags opt dflags' $ idirs setSessionDynFlags dflags'' return readLog ---------------------------------------------------------------- -setFlags :: DynFlags -> [FilePath] -> DynFlags-setFlags d idirs = d'+setFlags :: Options -> DynFlags -> [FilePath] -> DynFlags+setFlags opt d idirs+ | expandSplice opt = dopt_set d' Opt_D_dump_splices+ | otherwise = d' where d' = d { packageFlags = ghcPackage : packageFlags d , importPaths = idirs , ghcLink = NoLink , hscTarget = HscInterpreted+ , flags = flags d } ghcPackage :: PackageFlag
GHCMod.hs view
@@ -35,6 +35,7 @@ ++ "\t ghc-mod flag [-l]\n" ++ "\t ghc-mod browse" ++ ghcOptHelp ++ "[-l] [-o] <module> [<module> ...]\n" ++ "\t ghc-mod check" ++ ghcOptHelp ++ "<HaskellFile>\n"+ ++ "\t ghc-mod expand" ++ ghcOptHelp ++ "<HaskellFile>\n" ++ "\t ghc-mod info" ++ ghcOptHelp ++ "<HaskellFile> <module> <expression>\n" ++ "\t ghc-mod type" ++ ghcOptHelp ++ "<HaskellFile> <module> <line-no> <column-no>\n" ++ "\t ghc-mod lint [-h opt] <HaskellFile>\n"@@ -43,14 +44,6 @@ ---------------------------------------------------------------- -defaultOptions :: Options-defaultOptions = Options {- outputStyle = PlainStyle- , hlintOpts = []- , ghcOpts = []- , operators = False- }- argspec :: [OptDescr (Options -> Options)] argspec = [ Option "l" ["tolisp"] (NoArg (\opts -> opts { outputStyle = LispStyle }))@@ -91,6 +84,8 @@ "browse" -> concat <$> mapM (browseModule opt) (tail cmdArg) "list" -> listModules opt "check" -> withFile (checkSyntax opt) (safelist cmdArg 1)+ "expand" -> withFile (checkSyntax opt { expandSplice = True })+ (safelist cmdArg 1) "type" -> withFile (typeExpr opt (safelist cmdArg 2) (read $ safelist cmdArg 3) (read $ safelist cmdArg 4)) (safelist cmdArg 1) "info" -> withFile (infoExpr opt (safelist cmdArg 2) (safelist cmdArg 3)) (safelist cmdArg 1) "lint" -> withFile (lintSyntax opt) (safelist cmdArg 1)
Types.hs view
@@ -5,10 +5,20 @@ data OutputStyle = LispStyle | PlainStyle data Options = Options {- outputStyle :: OutputStyle- , hlintOpts :: [String]- , ghcOpts :: [String]- , operators :: Bool+ outputStyle :: OutputStyle+ , hlintOpts :: [String]+ , ghcOpts :: [String]+ , operators :: Bool+ , expandSplice :: Bool+ }++defaultOptions :: Options+defaultOptions = Options {+ outputStyle = PlainStyle+ , hlintOpts = []+ , ghcOpts = []+ , operators = False+ , expandSplice = False } ----------------------------------------------------------------
elisp/ghc-flymake.el view
@@ -114,6 +114,10 @@ (goto-char (point-max)) (insert "\n"))) (insert "\n" (match-string 1 data) " = undefined\n"))+ ((string-match "Pattern match(es) are non-exhaustive" data)+ (let* ((fn (ghc-get-function-name))+ (arity (ghc-get-function-arity fn)))+ (ghc-insert-underscore fn arity))) ((string-match "Found:\0[ ]*\\([^\0]+\\)\0Why not:\0[ ]*\\([^\0]+\\)" data) (let ((old (match-string 1 data)) (new (match-string 2 data)))@@ -123,6 +127,39 @@ (search-backward old nil t) (delete-region (point) end)) (insert new))))))))++(defun ghc-get-function-name ()+ (save-excursion+ (beginning-of-line)+ (when (looking-at "\\([^ ]+\\) ")+ (match-string 1))))++(defun ghc-get-function-arity (fn)+ (when fn+ (save-excursion+ (let ((regex (format "^%s *::" (regexp-quote fn))))+ (when (re-search-backward regex nil t)+ (ghc-get-function-arity0))))))++(defun ghc-get-function-arity0 ()+ (let ((end (save-excursion (end-of-line) (point)))+ (arity 0))+ (while (search-forward "->" end t)+ (setq arity (1+ arity)))+ arity))++(defun ghc-insert-underscore (fn ar)+ (when fn+ (let ((arity (or ar 1)))+ (save-excursion+ (goto-char (point-max))+ (re-search-backward (format "^%s *::" (regexp-quote fn)))+ (forward-line)+ (re-search-forward "^$" nil t)+ (insert fn)+ (dotimes (i arity)+ (insert " _"))+ (insert " = error \"" fn "\""))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
elisp/ghc-info.el view
@@ -12,26 +12,12 @@ (defun ghc-show-info (&optional ask) (interactive "P")- (if (not (ghc-which ghc-module-command))- (message "%s not found" ghc-module-command)- (let ((modname (or (ghc-find-module-name) "Main")))- (ghc-show-info0 ask modname))))--(defun ghc-show-info0 (ask modname)- (let* ((expr0 (ghc-things-at-point))+ (let* ((modname (or (ghc-find-module-name) "Main"))+ (expr0 (ghc-things-at-point)) (expr (if ask (ghc-read-expression expr0) expr0))- (cdir default-directory) (file (buffer-file-name))- (buf (get-buffer-create ghc-error-buffer-name)))- (with-current-buffer buf- (erase-buffer)- (insert- (with-temp-buffer- (cd cdir)- (apply 'call-process ghc-module-command nil t nil- `(,@(ghc-make-ghc-options) "info" ,file ,modname ,expr))- (buffer-substring (point-min) (1- (point-max))))))- (display-buffer buf)))+ (cmds (list "info" file modname expr)))+ (ghc-display-information cmds))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;@@ -128,6 +114,41 @@ (goto-char (point-min)) (while (search-forward "[Char]" nil t) (replace-match "String"))))))++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+;;;+;;; Expanding Template Haskell+;;;++(defun ghc-expand-th ()+ (interactive)+ (let* ((file (buffer-file-name))+ (cmds (list "expand" file)))+ (ghc-display-information cmds)))++;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+;;;+;;; Display+;;;++(defun ghc-display-information (cmds)+ (interactive)+ (if (not (ghc-which ghc-module-command))+ (message "%s not found" ghc-module-command)+ (let ((cdir default-directory)+ (buf (get-buffer-create ghc-error-buffer-name)))+ (with-current-buffer buf+ (erase-buffer)+ (insert+ (with-temp-buffer+ (cd cdir)+ (apply 'call-process ghc-module-command nil t nil+ (append (ghc-make-ghc-options) cmds))+ (buffer-substring (point-min) (1- (point-max)))))+ (goto-char (point-min))+ (haskell-font-lock-defaults-create)+ (turn-on-haskell-font-lock))+ (display-buffer buf)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;
elisp/ghc.el view
@@ -16,7 +16,7 @@ ;;; Code: -(defconst ghc-version "1.10.9")+(defconst ghc-version "1.10.10") ;; (eval-when-compile ;; (require 'haskell-mode))@@ -52,6 +52,7 @@ (defvar ghc-check-key "\C-x\C-s") (defvar ghc-toggle-key "\C-c\C-c") (defvar ghc-module-key "\C-c\C-m")+(defvar ghc-expand-key "\C-c\C-e") (defvar ghc-hoogle-key (format "\C-c%c" (ghc-find-C-h))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;@@ -70,6 +71,7 @@ (define-key haskell-mode-map ghc-document-key 'ghc-browse-document) (define-key haskell-mode-map ghc-type-key 'ghc-show-type) (define-key haskell-mode-map ghc-info-key 'ghc-show-info)+ (define-key haskell-mode-map ghc-expand-key 'ghc-expand-th) (define-key haskell-mode-map ghc-import-key 'ghc-import-module) (define-key haskell-mode-map ghc-previous-key 'flymake-goto-prev-error) (define-key haskell-mode-map ghc-next-key 'flymake-goto-next-error)
ghc-mod.cabal view
@@ -1,5 +1,5 @@ Name: ghc-mod-Version: 1.10.9+Version: 1.10.10 Author: Kazu Yamamoto <kazu@iij.ad.jp> Maintainer: Kazu Yamamoto <kazu@iij.ad.jp> License: BSD3