ghc-mod/src/GHCModi.hs

56 lines
1.5 KiB
Haskell
Raw Normal View History

2014-03-19 01:23:47 +00:00
module Main where
import Control.Monad
import CoreMonad (liftIO)
2014-03-20 08:40:06 +00:00
import Data.List
2014-03-19 01:23:47 +00:00
import Data.Set as S
2014-03-20 08:40:06 +00:00
import Exception (ghandle, SomeException(..))
2014-03-19 01:23:47 +00:00
import GHC
import Language.Haskell.GhcMod
import Language.Haskell.GhcMod.Internal
2014-03-20 08:40:06 +00:00
import System.IO
2014-03-19 01:23:47 +00:00
main :: IO ()
main = do
cradle <- findCradle
2014-03-20 08:40:06 +00:00
run ls $ do
2014-03-19 01:23:47 +00:00
(readLog,_) <- initializeFlagsWithCradle opt cradle ["-Wall"] True
loop readLog ls S.empty
where
opt = defaultOptions
ls = lineSeparator opt
2014-03-20 08:40:06 +00:00
run :: LineSeparator -> Ghc () -> IO ()
run (LineSeparator ls) body = do
mlibdir <- getSystemLibDir
ghandle ignore $ runGhc mlibdir $ do
dflags <- getSessionDynFlags
defaultCleanupHandler dflags body
where
ignore (SomeException e) = do
putStr "ghc-modi:0:0:Error:"
let x = intercalate ls $ lines $ show e
putStrLn x
putStrLn "NG"
2014-03-19 01:23:47 +00:00
loop :: IO [String] -> LineSeparator -> Set FilePath -> Ghc ()
loop readLog ls set = do
file <- liftIO $ getLine
let add = not $ S.member file set
(errmsgs,ok) <- ghandle handler $ do
when add $ addTargetFiles [file]
void $ load LoadAllTargets
msgs <- liftIO $ readLog
return (msgs, True)
mapM_ (liftIO . putStrLn) errmsgs
liftIO $ putStrLn $ if ok then "OK" else "NG"
liftIO $ hFlush stdout
let set'
| add && ok = S.insert file set
| otherwise = set
when ok $ loop readLog ls set'
where
handler err = do
errmsgs <- handleErrMsg ls err
return (errmsgs, False)