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
|