@@ -4,6 +4,7 @@ module Main where
44
55import Control.Applicative
66import Control.Exception
7+ import Control.Monad
78import Data.Typeable
89import Data.Version
910import Language.Haskell.GhcMod
@@ -12,6 +13,7 @@ import Prelude
1213import System.Console.GetOpt
1314import System.Directory
1415import System.Environment (getArgs )
16+ import System.Exit (exitFailure )
1517import System.IO (hPutStr , hPutStrLn , stdout , stderr , hSetEncoding , utf8 )
1618
1719----------------------------------------------------------------
@@ -26,8 +28,8 @@ usage = "ghc-mod version " ++ showVersion version ++ "\n"
2628 ++ " \t ghc-mod lang [-l]\n "
2729 ++ " \t ghc-mod flag [-l]\n "
2830 ++ " \t ghc-mod browse" ++ ghcOptHelp ++ " [-l] [-o] [-d] <module> [<module> ...]\n "
29- ++ " \t ghc-mod check" ++ ghcOptHelp ++ " <HaskellFile >\n "
30- ++ " \t ghc-mod expand" ++ ghcOptHelp ++ " <HaskellFile >\n "
31+ ++ " \t ghc-mod check" ++ ghcOptHelp ++ " <HaskellFiles... >\n "
32+ ++ " \t ghc-mod expand" ++ ghcOptHelp ++ " <HaskellFiles... >\n "
3133 ++ " \t ghc-mod debug" ++ ghcOptHelp ++ " <HaskellFile>\n "
3234 ++ " \t ghc-mod info" ++ ghcOptHelp ++ " <HaskellFile> <module> <expression>\n "
3335 ++ " \t ghc-mod type" ++ ghcOptHelp ++ " <HaskellFile> <module> <line-no> <column-no>\n "
@@ -70,6 +72,7 @@ parseArgs spec argv
7072----------------------------------------------------------------
7173
7274data GHCModError = SafeList
75+ | TooManyArguments String
7376 | NoSuchCommand String
7477 | CmdArg [String ]
7578 | FileNotExist String deriving (Show , Typeable )
@@ -93,15 +96,19 @@ main = flip catches handlers $ do
9396 cmdArg2 = cmdArg !. 2
9497 cmdArg3 = cmdArg !. 3
9598 cmdArg4 = cmdArg !. 4
99+ remainingArgs = tail cmdArg
100+ nArgs n f = if length remainingArgs == n
101+ then f
102+ else throw (TooManyArguments cmdArg0)
96103 res <- case cmdArg0 of
97- " browse" -> concat <$> mapM (browseModule opt) ( tail cmdArg)
104+ " browse" -> concat <$> mapM (browseModule opt) remainingArgs
98105 " list" -> listModules opt
99- " check" -> checkSyntax opt cradle cmdArg1
100- " expand" -> checkSyntax opt { expandSplice = True } cradle cmdArg1
101- " debug" -> debugInfo opt cradle strVer cmdArg1
102- " type" -> typeExpr opt cradle cmdArg1 cmdArg2 (read cmdArg3) (read cmdArg4)
103- " info" -> infoExpr opt cradle cmdArg1 cmdArg2 cmdArg3
104- " lint" -> withFile (lintSyntax opt) cmdArg1
106+ " check" -> checkSyntax opt cradle remainingArgs
107+ " expand" -> checkSyntax opt { expandSplice = True } cradle remainingArgs
108+ " debug" -> nArgs 1 $ debugInfo opt cradle strVer cmdArg1
109+ " type" -> nArgs 4 $ typeExpr opt cradle cmdArg1 cmdArg2 (read cmdArg3) (read cmdArg4)
110+ " info" -> nArgs 3 infoExpr opt cradle cmdArg1 cmdArg2 cmdArg3
111+ " lint" -> nArgs 1 withFile (lintSyntax opt) cmdArg1
105112 " lang" -> listLanguages opt
106113 " flag" -> listFlags opt
107114 " boot" -> do
@@ -110,14 +117,19 @@ main = flip catches handlers $ do
110117 flags <- listFlags opt
111118 pre <- concat <$> mapM (browseModule opt) preBrowsedModules
112119 return $ mods ++ langs ++ flags ++ pre
120+ " help" -> return $ usageInfo usage argspec
113121 cmd -> throw (NoSuchCommand cmd)
114122 putStr res
115123 where
116- handlers = [Handler handler1, Handler handler2]
124+ handlers = [Handler (handleThenExit handler1), Handler (handleThenExit handler2)]
125+ handleThenExit handler = \ e -> handler e >> exitFailure
117126 handler1 :: ErrorCall -> IO ()
118127 handler1 = print -- for debug
119128 handler2 :: GHCModError -> IO ()
120129 handler2 SafeList = printUsage
130+ handler2 (TooManyArguments cmd) = do
131+ hPutStrLn stderr $ " \" " ++ cmd ++ " \" : Too many arguments"
132+ printUsage
121133 handler2 (NoSuchCommand cmd) = do
122134 hPutStrLn stderr $ " \" " ++ cmd ++ " \" not supported"
123135 printUsage
0 commit comments