ghc-mod/GHCMod.hs

87 lines
2.5 KiB
Haskell
Raw Normal View History

2010-01-06 05:38:06 +00:00
module Main where
2010-03-11 10:03:17 +00:00
import Browse
import Check
import Control.Applicative
2010-01-06 05:38:06 +00:00
import Control.Exception hiding (try)
import Data.List
2010-03-11 10:03:17 +00:00
import List
2010-01-06 05:38:06 +00:00
import Prelude hiding (catch)
import System.Console.GetOpt
2010-03-11 10:03:17 +00:00
import System.Directory
import System.Environment (getArgs)
import System.FilePath
2010-01-06 05:38:06 +00:00
import System.IO
2010-03-11 10:03:17 +00:00
import System.Posix.Env
2010-01-06 05:38:06 +00:00
----------------------------------------------------------------
usage :: String
2010-03-11 10:03:17 +00:00
usage = "ghc-mod version 0.2.0\n"
2010-01-06 05:38:06 +00:00
++ "Usage:\n"
++ "\t ghc-mod list\n"
++ "\t ghc-mod browse <module>\n"
2010-03-11 10:03:17 +00:00
++ "\t ghc-mod check <HaskellFile>\n"
2010-01-06 05:38:06 +00:00
++ "\t ghc-mod help\n"
----------------------------------------------------------------
data Options = Options { optToLisp :: Bool
} deriving Show
defaultOptions :: Options
defaultOptions = Options { optToLisp = False
}
argspec :: [OptDescr (Options -> Options)]
argspec = [ Option ['l'] ["tolisp"]
(NoArg (\opts -> opts { optToLisp = True }))
"print as a list of Lisp"
]
parseArgs :: [OptDescr (Options -> Options)] -> [String] -> (Options, [String])
parseArgs spec argv
= case getOpt Permute spec argv of
(o,n,[] ) -> (foldl (flip id) defaultOptions o, n)
2010-03-11 10:03:17 +00:00
(_,_,errs) -> error $ concat errs ++ usageInfo usage argspec
2010-01-06 05:38:06 +00:00
----------------------------------------------------------------
main :: IO ()
main = flip catch handler $ do
args <- getArgs
2010-03-11 10:03:17 +00:00
setPath
2010-01-06 05:38:06 +00:00
let (opt,cmdArg) = parseArgs argspec args
transform = if optToLisp opt then toLisp else toPlain
2010-03-11 10:03:17 +00:00
refine = transform . nub . sort
case cmdArg !! 0 of
cmd | cmd == "browse" -> refine <$> browseModule (cmdArg !! 1) >>= putStr
| cmd == "list" -> refine <$> listModules >>= putStr
| cmd == "check" -> checkSyntax (cmdArg !! 1) >>= putStr
_ -> error usage
hFlush stdout
2010-01-06 05:38:06 +00:00
where
handler :: ErrorCall -> IO ()
2010-03-10 09:31:07 +00:00
handler _ = putStr usage
2010-01-06 05:38:06 +00:00
2010-03-11 10:03:17 +00:00
setPath :: IO ()
setPath = do
home <- getHomeDirectory
mpath <- getEnv "PATH"
let path = maybe "/usr/bin:/bin" id mpath
newpath = "/usr/local/bin:/opt/local/bin:"
++ (home </> ".cabal/bin") ++ ":"
++ (home </> "bin") ++ ":"
++ path
setEnv "PATH" newpath True
2010-01-06 05:38:06 +00:00
----------------------------------------------------------------
toLisp :: [String] -> String
toLisp ms = "(" ++ unwords quoted ++ ")\n"
where
quote x = "\"" ++ x ++ "\""
quoted = map quote ms
toPlain :: [String] -> String
toPlain = unlines