Merge pull request #288 from DanielG/dev-pkgs
Make `GhcMod` be `GhcModT (ErrorT IO)`
This commit is contained in:
		
						commit
						89a4db2345
					
				| @ -8,7 +8,7 @@ import Language.Haskell.GhcMod.List | |||||||
| import Language.Haskell.GhcMod.Monad | import Language.Haskell.GhcMod.Monad | ||||||
| 
 | 
 | ||||||
| -- | Printing necessary information for front-end booting. | -- | Printing necessary information for front-end booting. | ||||||
| boot :: GhcMod String | boot :: IOish m => GhcModT m String | ||||||
| boot =  concat <$> sequence [modules, languages, flags, | boot =  concat <$> sequence [modules, languages, flags, | ||||||
|                              concat <$> mapM browse preBrowsedModules] |                              concat <$> mapM browse preBrowsedModules] | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -28,8 +28,9 @@ import Type (dropForAlls, splitFunTy_maybe, mkFunTy, isPredTy) | |||||||
| -- | Getting functions, classes, etc from a module. | -- | Getting functions, classes, etc from a module. | ||||||
| --   If 'detailed' is 'True', their types are also obtained. | --   If 'detailed' is 'True', their types are also obtained. | ||||||
| --   If 'operators' is 'True', operators are also returned. | --   If 'operators' is 'True', operators are also returned. | ||||||
| browse :: ModuleString -- ^ A module name. (e.g. \"Data.List\") | browse :: IOish m | ||||||
|        -> GhcMod String |        => ModuleString -- ^ A module name. (e.g. \"Data.List\") | ||||||
|  |        -> GhcModT m String | ||||||
| browse pkgmdl = convert' . sort =<< (listExports =<< getModule) | browse pkgmdl = convert' . sort =<< (listExports =<< getModule) | ||||||
|   where |   where | ||||||
|     (mpkg,mdl) = splitPkgMdl pkgmdl |     (mpkg,mdl) = splitPkgMdl pkgmdl | ||||||
| @ -61,7 +62,7 @@ splitPkgMdl pkgmdl = case break (==':') pkgmdl of | |||||||
|     (mdl,"")    -> (Nothing,mdl) |     (mdl,"")    -> (Nothing,mdl) | ||||||
|     (pkg,_:mdl) -> (Just pkg,mdl) |     (pkg,_:mdl) -> (Just pkg,mdl) | ||||||
| 
 | 
 | ||||||
| processExports :: ModuleInfo -> GhcMod [String] | processExports :: IOish m => ModuleInfo -> GhcModT m [String] | ||||||
| processExports minfo = do | processExports minfo = do | ||||||
|   opt <- options |   opt <- options | ||||||
|   let |   let | ||||||
| @ -70,13 +71,13 @@ processExports minfo = do | |||||||
|       | otherwise = filter (isAlpha . head . getOccString) |       | otherwise = filter (isAlpha . head . getOccString) | ||||||
|   mapM (showExport opt minfo) $ removeOps $ G.modInfoExports minfo |   mapM (showExport opt minfo) $ removeOps $ G.modInfoExports minfo | ||||||
| 
 | 
 | ||||||
| showExport :: Options -> ModuleInfo -> Name -> GhcMod String | showExport :: IOish m => Options -> ModuleInfo -> Name -> GhcModT m String | ||||||
| showExport opt minfo e = do | showExport opt minfo e = do | ||||||
|   mtype' <- mtype |   mtype' <- mtype | ||||||
|   return $ concat $ catMaybes [mqualified, Just $ formatOp $ getOccString e, mtype'] |   return $ concat $ catMaybes [mqualified, Just $ formatOp $ getOccString e, mtype'] | ||||||
|   where |   where | ||||||
|     mqualified = (G.moduleNameString (G.moduleName $ G.nameModule e) ++ ".") `justIf` qualified opt |     mqualified = (G.moduleNameString (G.moduleName $ G.nameModule e) ++ ".") `justIf` qualified opt | ||||||
|     mtype :: GhcMod (Maybe String) |     mtype :: IOish m => GhcModT m (Maybe String) | ||||||
|     mtype |     mtype | ||||||
|       | detailed opt = do |       | detailed opt = do | ||||||
|         tyInfo <- G.modInfoLookupName minfo e |         tyInfo <- G.modInfoLookupName minfo e | ||||||
| @ -91,7 +92,7 @@ showExport opt minfo e = do | |||||||
|       | isAlpha n = nm |       | isAlpha n = nm | ||||||
|       | otherwise = "(" ++ nm ++ ")" |       | otherwise = "(" ++ nm ++ ")" | ||||||
|     formatOp "" = error "formatOp" |     formatOp "" = error "formatOp" | ||||||
|     inOtherModule :: Name -> GhcMod (Maybe TyThing) |     inOtherModule :: IOish m => Name -> GhcModT m (Maybe TyThing) | ||||||
|     inOtherModule nm = G.getModuleInfo (G.nameModule nm) >> G.lookupGlobalName nm |     inOtherModule nm = G.getModuleInfo (G.nameModule nm) >> G.lookupGlobalName nm | ||||||
|     justIf :: a -> Bool -> Maybe a |     justIf :: a -> Bool -> Maybe a | ||||||
|     justIf x True = Just x |     justIf x True = Just x | ||||||
| @ -138,7 +139,7 @@ showOutputable dflag = unwords . lines . showPage dflag styleUnqualified . ppr | |||||||
| ---------------------------------------------------------------- | ---------------------------------------------------------------- | ||||||
| 
 | 
 | ||||||
| -- | Browsing all functions in all system/user modules. | -- | Browsing all functions in all system/user modules. | ||||||
| browseAll :: DynFlags -> GhcMod [(String,String)] | browseAll :: IOish m => DynFlags -> GhcModT m [(String,String)] | ||||||
| browseAll dflag = do | browseAll dflag = do | ||||||
|     ms <- G.packageDbModules True |     ms <- G.packageDbModules True | ||||||
|     is <- mapM G.getModuleInfo ms |     is <- mapM G.getModuleInfo ms | ||||||
|  | |||||||
| @ -33,10 +33,11 @@ data SplitToTextInfo = SplitToTextInfo { sVarName     :: String | |||||||
|                                        } |                                        } | ||||||
| 
 | 
 | ||||||
| -- | Splitting a variable in a equation. | -- | Splitting a variable in a equation. | ||||||
| splits :: FilePath     -- ^ A target file. | splits :: IOish m | ||||||
|  |        => FilePath     -- ^ A target file. | ||||||
|        -> Int          -- ^ Line number. |        -> Int          -- ^ Line number. | ||||||
|        -> Int          -- ^ Column number. |        -> Int          -- ^ Column number. | ||||||
|        -> GhcMod String |        -> GhcModT m String | ||||||
| splits file lineNo colNo = ghandle handler body | splits file lineNo colNo = ghandle handler body | ||||||
|   where |   where | ||||||
|     body = inModuleContext file $ \dflag style -> do |     body = inModuleContext file $ \dflag style -> do | ||||||
|  | |||||||
| @ -15,8 +15,9 @@ import Language.Haskell.GhcMod.Monad | |||||||
| 
 | 
 | ||||||
| -- | Checking syntax of a target file using GHC. | -- | Checking syntax of a target file using GHC. | ||||||
| --   Warnings and errors are returned. | --   Warnings and errors are returned. | ||||||
| checkSyntax :: [FilePath]  -- ^ The target files. | checkSyntax :: IOish m | ||||||
|             -> GhcMod String |             => [FilePath]  -- ^ The target files. | ||||||
|  |             -> GhcModT m String | ||||||
| checkSyntax [] = return "" | checkSyntax [] = return "" | ||||||
| checkSyntax files = withErrorHandler sessionName $ do | checkSyntax files = withErrorHandler sessionName $ do | ||||||
|     either id id <$> check files |     either id id <$> check files | ||||||
| @ -29,8 +30,9 @@ checkSyntax files = withErrorHandler sessionName $ do | |||||||
| 
 | 
 | ||||||
| -- | Checking syntax of a target file using GHC. | -- | Checking syntax of a target file using GHC. | ||||||
| --   Warnings and errors are returned. | --   Warnings and errors are returned. | ||||||
| check :: [FilePath]  -- ^ The target files. | check :: IOish m | ||||||
|       -> GhcMod (Either String String) |       => [FilePath]  -- ^ The target files. | ||||||
|  |       -> GhcModT m (Either String String) | ||||||
| check fileNames = do | check fileNames = do | ||||||
|   withLogger setAllWaringFlags $ do |   withLogger setAllWaringFlags $ do | ||||||
|     setTargetFiles fileNames |     setTargetFiles fileNames | ||||||
| @ -38,8 +40,9 @@ check fileNames = do | |||||||
| ---------------------------------------------------------------- | ---------------------------------------------------------------- | ||||||
| 
 | 
 | ||||||
| -- | Expanding Haskell Template. | -- | Expanding Haskell Template. | ||||||
| expandTemplate :: [FilePath]  -- ^ The target files. | expandTemplate :: IOish m | ||||||
|                -> GhcMod String |                => [FilePath]  -- ^ The target files. | ||||||
|  |                -> GhcModT m String | ||||||
| expandTemplate [] = return "" | expandTemplate [] = return "" | ||||||
| expandTemplate files = withErrorHandler sessionName $ do | expandTemplate files = withErrorHandler sessionName $ do | ||||||
|     either id id <$> expand files |     either id id <$> expand files | ||||||
| @ -51,7 +54,8 @@ expandTemplate files = withErrorHandler sessionName $ do | |||||||
| ---------------------------------------------------------------- | ---------------------------------------------------------------- | ||||||
| 
 | 
 | ||||||
| -- | Expanding Haskell Template. | -- | Expanding Haskell Template. | ||||||
| expand :: [FilePath]  -- ^ The target files. | expand :: IOish m | ||||||
|       -> GhcMod (Either String String) |        => [FilePath]  -- ^ The target files. | ||||||
|  |        -> GhcModT m (Either String String) | ||||||
| expand fileNames = withLogger (Gap.setDumpSplices . setNoWaringFlags) $ | expand fileNames = withLogger (Gap.setDumpSplices . setNoWaringFlags) $ | ||||||
|     setTargetFiles fileNames |     setTargetFiles fileNames | ||||||
|  | |||||||
| @ -23,7 +23,7 @@ inter :: Char -> [Builder] -> Builder | |||||||
| inter _ [] = id | inter _ [] = id | ||||||
| inter c bs = foldr1 (\x y -> x . (c:) . y) bs | inter c bs = foldr1 (\x y -> x . (c:) . y) bs | ||||||
| 
 | 
 | ||||||
| convert' :: ToString a => a -> GhcMod String | convert' :: (ToString a, IOish m) => a -> GhcModT m String | ||||||
| convert' x = flip convert x <$> options | convert' x = flip convert x <$> options | ||||||
| 
 | 
 | ||||||
| convert :: ToString a => Options -> a -> String | convert :: ToString a => Options -> a -> String | ||||||
|  | |||||||
| @ -12,7 +12,7 @@ import Language.Haskell.GhcMod.Internal | |||||||
| ---------------------------------------------------------------- | ---------------------------------------------------------------- | ||||||
| 
 | 
 | ||||||
| -- | Obtaining debug information. | -- | Obtaining debug information. | ||||||
| debugInfo :: GhcMod String | debugInfo :: IOish m => GhcModT m String | ||||||
| debugInfo = cradle >>= \c -> convert' =<< do | debugInfo = cradle >>= \c -> convert' =<< do | ||||||
|     CompilerOptions gopts incDir pkgs <- |     CompilerOptions gopts incDir pkgs <- | ||||||
|         if isJust $ cradleCabalFile c then |         if isJust $ cradleCabalFile c then | ||||||
| @ -38,5 +38,5 @@ debugInfo = cradle >>= \c -> convert' =<< do | |||||||
| ---------------------------------------------------------------- | ---------------------------------------------------------------- | ||||||
| 
 | 
 | ||||||
| -- | Obtaining root information. | -- | Obtaining root information. | ||||||
| rootInfo :: GhcMod String | rootInfo :: IOish m => GhcModT m String | ||||||
| rootInfo = convert' =<< cradleRootDir <$> cradle | rootInfo = convert' =<< cradleRootDir <$> cradle | ||||||
|  | |||||||
| @ -38,10 +38,11 @@ data SigInfo = Signature SrcSpan [G.RdrName] (G.HsType G.RdrName) | |||||||
| data HESigInfo = HESignature HE.SrcSpan [HE.Name HE.SrcSpanInfo] (HE.Type HE.SrcSpanInfo) | data HESigInfo = HESignature HE.SrcSpan [HE.Name HE.SrcSpanInfo] (HE.Type HE.SrcSpanInfo) | ||||||
| 
 | 
 | ||||||
| -- | Create a initial body from a signature. | -- | Create a initial body from a signature. | ||||||
| sig :: FilePath     -- ^ A target file. | sig :: IOish m | ||||||
|  |     => FilePath     -- ^ A target file. | ||||||
|     -> Int          -- ^ Line number. |     -> Int          -- ^ Line number. | ||||||
|     -> Int          -- ^ Column number. |     -> Int          -- ^ Column number. | ||||||
|     -> GhcMod String |     -> GhcModT m String | ||||||
| sig file lineNo colNo = ghandle handler body | sig file lineNo colNo = ghandle handler body | ||||||
|   where |   where | ||||||
|     body = inModuleContext file $ \dflag style -> do |     body = inModuleContext file $ \dflag style -> do | ||||||
|  | |||||||
| @ -31,11 +31,11 @@ type Symbol = String | |||||||
| newtype SymMdlDb = SymMdlDb (Map Symbol [ModuleString]) | newtype SymMdlDb = SymMdlDb (Map Symbol [ModuleString]) | ||||||
| 
 | 
 | ||||||
| -- | Finding modules to which the symbol belong. | -- | Finding modules to which the symbol belong. | ||||||
| findSymbol :: Symbol -> GhcMod String | findSymbol :: IOish m => Symbol -> GhcModT m String | ||||||
| findSymbol sym = convert' =<< lookupSym sym <$> getSymMdlDb | findSymbol sym = convert' =<< lookupSym sym <$> getSymMdlDb | ||||||
| 
 | 
 | ||||||
| -- | Creating 'SymMdlDb'. | -- | Creating 'SymMdlDb'. | ||||||
| getSymMdlDb :: GhcMod SymMdlDb | getSymMdlDb :: IOish m => GhcModT m SymMdlDb | ||||||
| getSymMdlDb = do | getSymMdlDb = do | ||||||
|     sm <- G.getSessionDynFlags >>= browseAll |     sm <- G.getSessionDynFlags >>= browseAll | ||||||
| #if MIN_VERSION_containers(0,5,0) | #if MIN_VERSION_containers(0,5,0) | ||||||
|  | |||||||
| @ -6,7 +6,7 @@ import Language.Haskell.GhcMod.Monad | |||||||
| 
 | 
 | ||||||
| -- | Listing GHC flags. (e.g -fno-warn-orphans) | -- | Listing GHC flags. (e.g -fno-warn-orphans) | ||||||
| 
 | 
 | ||||||
| flags :: GhcMod String | flags :: IOish m => GhcModT m String | ||||||
| flags = convert' [ "-f" ++ prefix ++ option | flags = convert' [ "-f" ++ prefix ++ option | ||||||
|                  | option <- Gap.fOptions |                  | option <- Gap.fOptions | ||||||
|                  , prefix <- ["","no-"] |                  , prefix <- ["","no-"] | ||||||
|  | |||||||
| @ -21,9 +21,10 @@ import Language.Haskell.GhcMod.Convert | |||||||
| ---------------------------------------------------------------- | ---------------------------------------------------------------- | ||||||
| 
 | 
 | ||||||
| -- | Obtaining information of a target expression. (GHCi's info:) | -- | Obtaining information of a target expression. (GHCi's info:) | ||||||
| info :: FilePath     -- ^ A target file. | info :: IOish m | ||||||
|  |      => FilePath     -- ^ A target file. | ||||||
|      -> Expression   -- ^ A Haskell expression. |      -> Expression   -- ^ A Haskell expression. | ||||||
|      -> GhcMod String |      -> GhcModT m String | ||||||
| info file expr = do | info file expr = do | ||||||
|     opt <- options |     opt <- options | ||||||
|     convert opt <$> ghandle handler body |     convert opt <$> ghandle handler body | ||||||
| @ -36,10 +37,11 @@ info file expr = do | |||||||
| ---------------------------------------------------------------- | ---------------------------------------------------------------- | ||||||
| 
 | 
 | ||||||
| -- | Obtaining type of a target expression. (GHCi's type:) | -- | Obtaining type of a target expression. (GHCi's type:) | ||||||
| types :: FilePath     -- ^ A target file. | types :: IOish m | ||||||
|  |       => FilePath     -- ^ A target file. | ||||||
|       -> Int          -- ^ Line number. |       -> Int          -- ^ Line number. | ||||||
|       -> Int          -- ^ Column number. |       -> Int          -- ^ Column number. | ||||||
|       -> GhcMod String |       -> GhcModT m String | ||||||
| types file lineNo colNo = do | types file lineNo colNo = do | ||||||
|     opt <- options |     opt <- options | ||||||
|     convert opt <$> ghandle handler body |     convert opt <$> ghandle handler body | ||||||
|  | |||||||
| @ -6,5 +6,5 @@ import Language.Haskell.GhcMod.Monad | |||||||
| 
 | 
 | ||||||
| -- | Listing language extensions. | -- | Listing language extensions. | ||||||
| 
 | 
 | ||||||
| languages :: GhcMod String | languages :: IOish m => GhcModT m String | ||||||
| languages = convert' supportedLanguagesAndExtensions | languages = convert' supportedLanguagesAndExtensions | ||||||
|  | |||||||
| @ -11,8 +11,9 @@ import Language.Haskell.HLint (hlint) | |||||||
| 
 | 
 | ||||||
| -- | Checking syntax of a target file using hlint. | -- | Checking syntax of a target file using hlint. | ||||||
| --   Warnings and errors are returned. | --   Warnings and errors are returned. | ||||||
| lint :: FilePath  -- ^ A target file. | lint :: IOish m | ||||||
|      -> GhcMod String |      => FilePath  -- ^ A target file. | ||||||
|  |      -> GhcModT m String | ||||||
| lint file = do | lint file = do | ||||||
|   opt <- options |   opt <- options | ||||||
|   ghandle handler . pack =<< (liftIO $ hlint $ file : "--quiet" : hlintOpts opt) |   ghandle handler . pack =<< (liftIO $ hlint $ file : "--quiet" : hlintOpts opt) | ||||||
|  | |||||||
| @ -13,7 +13,7 @@ import UniqFM (eltsUFM) | |||||||
| ---------------------------------------------------------------- | ---------------------------------------------------------------- | ||||||
| 
 | 
 | ||||||
| -- | Listing installed modules. | -- | Listing installed modules. | ||||||
| modules :: GhcMod String | modules :: IOish m => GhcModT m String | ||||||
| modules = do | modules = do | ||||||
|     opt <- options |     opt <- options | ||||||
|     convert opt . (arrange opt) <$> (getModules `G.gcatch` handler) |     convert opt . (arrange opt) <$> (getModules `G.gcatch` handler) | ||||||
|  | |||||||
| @ -34,7 +34,7 @@ newtype LogRef = LogRef (IORef Builder) | |||||||
| newLogRef :: IO LogRef | newLogRef :: IO LogRef | ||||||
| newLogRef = LogRef <$> newIORef id | newLogRef = LogRef <$> newIORef id | ||||||
| 
 | 
 | ||||||
| readAndClearLogRef :: LogRef -> GhcMod String | readAndClearLogRef :: IOish m => LogRef -> GhcModT m String | ||||||
| readAndClearLogRef (LogRef ref) = do | readAndClearLogRef (LogRef ref) = do | ||||||
|     b <- liftIO $ readIORef ref |     b <- liftIO $ readIORef ref | ||||||
|     liftIO $ writeIORef ref id |     liftIO $ writeIORef ref id | ||||||
| @ -50,9 +50,10 @@ appendLogRef df (LogRef ref) _ sev src style msg = do | |||||||
| -- | Set the session flag (e.g. "-Wall" or "-w:") then | -- | Set the session flag (e.g. "-Wall" or "-w:") then | ||||||
| --   executes a body. Logged messages are returned as 'String'. | --   executes a body. Logged messages are returned as 'String'. | ||||||
| --   Right is success and Left is failure. | --   Right is success and Left is failure. | ||||||
| withLogger :: (DynFlags -> DynFlags) | withLogger :: IOish m | ||||||
|            -> GhcMod () |            => (DynFlags -> DynFlags) | ||||||
|            -> GhcMod (Either String String) |            -> GhcModT m () | ||||||
|  |            -> GhcModT m (Either String String) | ||||||
| withLogger setDF body = ghandle sourceError $ do | withLogger setDF body = ghandle sourceError $ do | ||||||
|     logref <- liftIO $ newLogRef |     logref <- liftIO $ newLogRef | ||||||
|     wflags <- filter ("-fno-warn" `isPrefixOf`) . ghcOpts <$> options |     wflags <- filter ("-fno-warn" `isPrefixOf`) . ghcOpts <$> options | ||||||
| @ -65,7 +66,7 @@ withLogger setDF body = ghandle sourceError $ do | |||||||
| ---------------------------------------------------------------- | ---------------------------------------------------------------- | ||||||
| 
 | 
 | ||||||
| -- | Converting 'SourceError' to 'String'. | -- | Converting 'SourceError' to 'String'. | ||||||
| sourceError :: SourceError -> GhcMod (Either String String) | sourceError :: IOish m => SourceError -> GhcModT m (Either String String) | ||||||
| sourceError err = do | sourceError err = do | ||||||
|     dflags <- G.getSessionDynFlags |     dflags <- G.getSessionDynFlags | ||||||
|     style <- toGhcMod getStyle |     style <- toGhcMod getStyle | ||||||
|  | |||||||
| @ -1,16 +1,18 @@ | |||||||
| {-# LANGUAGE CPP, GeneralizedNewtypeDeriving, FlexibleInstances #-} | {-# LANGUAGE CPP, GeneralizedNewtypeDeriving, FlexibleInstances #-} | ||||||
| {-# LANGUAGE FlexibleContexts, MultiParamTypeClasses, RankNTypes #-} | {-# LANGUAGE FlexibleContexts, MultiParamTypeClasses, RankNTypes #-} | ||||||
| {-# LANGUAGE TypeFamilies, UndecidableInstances, RecordWildCards #-} | {-# LANGUAGE TypeFamilies, UndecidableInstances, RecordWildCards #-} | ||||||
|  | {-# LANGUAGE StandaloneDeriving #-} | ||||||
| {-# OPTIONS_GHC -fno-warn-orphans #-} | {-# OPTIONS_GHC -fno-warn-orphans #-} | ||||||
| 
 | 
 | ||||||
| module Language.Haskell.GhcMod.Monad ( | module Language.Haskell.GhcMod.Monad ( | ||||||
|    GhcMod |    GhcMod | ||||||
|  |  , runGhcMod | ||||||
|  |  , liftGhcMod | ||||||
|  , GhcModT |  , GhcModT | ||||||
|  |  , IOish | ||||||
|  , GhcModEnv(..) |  , GhcModEnv(..) | ||||||
|  , GhcModWriter |  , GhcModWriter | ||||||
|  , GhcModState(..) |  , GhcModState(..) | ||||||
|  , runGhcMod' |  | ||||||
|  , runGhcMod |  | ||||||
|  , runGhcModT' |  , runGhcModT' | ||||||
|  , runGhcModT |  , runGhcModT | ||||||
|  , newGhcModEnv |  , newGhcModEnv | ||||||
| @ -18,11 +20,23 @@ module Language.Haskell.GhcMod.Monad ( | |||||||
|  , toGhcMod |  , toGhcMod | ||||||
|  , options |  , options | ||||||
|  , cradle |  , cradle | ||||||
|  |  , Options(..) | ||||||
|  |  , defaultOptions | ||||||
|  , module Control.Monad.Reader.Class |  , module Control.Monad.Reader.Class | ||||||
|  , module Control.Monad.Writer.Class |  , module Control.Monad.Writer.Class | ||||||
|  , module Control.Monad.State.Class |  , module Control.Monad.State.Class | ||||||
|  ) where |  ) where | ||||||
| 
 | 
 | ||||||
|  | #if __GLASGOW_HASKELL__ < 708 | ||||||
|  | -- 'CoreMonad.MonadIO' and 'Control.Monad.IO.Class.MonadIO' are different | ||||||
|  | -- classes before ghc 7.8 | ||||||
|  | #define DIFFERENT_MONADIO 1 | ||||||
|  | 
 | ||||||
|  | -- RWST doen't have a MonadIO instance before ghc 7.8 | ||||||
|  | #define MONADIO_INSTANCES 1 | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| import Language.Haskell.GhcMod.Types | import Language.Haskell.GhcMod.Types | ||||||
| import Language.Haskell.GhcMod.Cradle | import Language.Haskell.GhcMod.Cradle | ||||||
| import Language.Haskell.GhcMod.DynFlags | import Language.Haskell.GhcMod.DynFlags | ||||||
| @ -47,22 +61,26 @@ import HscTypes | |||||||
| -- So, RWST automatically becomes an instance of MonadIO. | -- So, RWST automatically becomes an instance of MonadIO. | ||||||
| import MonadUtils | import MonadUtils | ||||||
| 
 | 
 | ||||||
| #if __GLASGOW_HASKELL__ < 708 | #if DIFFERENT_MONADIO | ||||||
| -- To make RWST an instance of MonadIO. |  | ||||||
| import Control.Monad.Trans.Class (lift) | import Control.Monad.Trans.Class (lift) | ||||||
|  | import qualified Control.Monad.IO.Class | ||||||
| import Data.Monoid (Monoid) | import Data.Monoid (Monoid) | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| import Control.Applicative (Alternative) | import Control.Applicative (Alternative) | ||||||
| import Control.Monad (MonadPlus, liftM, void) | import Control.Monad (MonadPlus, liftM, void) | ||||||
| import Control.Monad.Base (MonadBase, liftBase) | import Control.Monad.Base (MonadBase, liftBase) | ||||||
|  | import Control.Monad.Trans.RWS.Lazy (liftCatch) | ||||||
| 
 | 
 | ||||||
| import Control.Monad.Reader.Class | import Control.Monad.Reader.Class | ||||||
| import Control.Monad.State.Class | import Control.Monad.State.Class | ||||||
| import Control.Monad.Trans.Class | import Control.Monad.Trans.Class | ||||||
| import Control.Monad.Trans.Control (MonadBaseControl(..), StM, liftBaseWith, control, liftBaseOp, liftBaseOp_) | import Control.Monad.Trans.Maybe | ||||||
|  | import Control.Monad.Trans.Control (MonadBaseControl(..), StM, liftBaseWith, | ||||||
|  |   control, liftBaseOp, liftBaseOp_) | ||||||
| import Control.Monad.Trans.RWS.Lazy (RWST(..), runRWST) | import Control.Monad.Trans.RWS.Lazy (RWST(..), runRWST) | ||||||
| import Control.Monad.Writer.Class | import Control.Monad.Writer.Class | ||||||
|  | import Control.Monad.Error (Error(..), ErrorT(..), MonadError) | ||||||
| 
 | 
 | ||||||
| import Data.Maybe (fromJust, isJust) | import Data.Maybe (fromJust, isJust) | ||||||
| import Data.IORef (IORef, readIORef, writeIORef, newIORef) | import Data.IORef (IORef, readIORef, writeIORef, newIORef) | ||||||
| @ -78,16 +96,28 @@ data GhcModEnv = GhcModEnv { | |||||||
|     , gmCradle     :: Cradle |     , gmCradle     :: Cradle | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| data GhcModState = GhcModState | data GhcModState = GhcModState deriving (Eq,Show,Read) | ||||||
| 
 | 
 | ||||||
| defaultState :: GhcModState | defaultState :: GhcModState | ||||||
| defaultState = GhcModState | defaultState = GhcModState | ||||||
| 
 | 
 | ||||||
| type GhcModWriter = () | type GhcModWriter = () | ||||||
| 
 | 
 | ||||||
|  | data GhcModError = GMENoMsg | ||||||
|  |                  | GMEString String | ||||||
|  |                  | GMECabal | ||||||
|  |                  | GMEGhc | ||||||
|  |                    deriving (Eq,Show,Read) | ||||||
|  | 
 | ||||||
|  | instance Error GhcModError where | ||||||
|  |     noMsg = GMENoMsg | ||||||
|  |     strMsg = GMEString | ||||||
|  | 
 | ||||||
| ---------------------------------------------------------------- | ---------------------------------------------------------------- | ||||||
| 
 | 
 | ||||||
| type GhcMod a = GhcModT IO a | type IOish m = (Functor m, MonadIO m, MonadBaseControl IO m) | ||||||
|  | 
 | ||||||
|  | type GhcMod a = GhcModT (ErrorT GhcModError IO) a | ||||||
| 
 | 
 | ||||||
| newtype GhcModT m a = GhcModT { | newtype GhcModT m a = GhcModT { | ||||||
|       unGhcModT :: RWST GhcModEnv GhcModWriter GhcModState m a |       unGhcModT :: RWST GhcModEnv GhcModWriter GhcModState m a | ||||||
| @ -97,16 +127,27 @@ newtype GhcModT m a = GhcModT { | |||||||
|                , Monad |                , Monad | ||||||
|                , MonadPlus |                , MonadPlus | ||||||
|                , MonadIO |                , MonadIO | ||||||
|  | #if DIFFERENT_MONADIO | ||||||
|  |                , Control.Monad.IO.Class.MonadIO | ||||||
|  | #endif | ||||||
|                , MonadReader GhcModEnv |                , MonadReader GhcModEnv | ||||||
|                , MonadWriter GhcModWriter |                , MonadWriter GhcModWriter | ||||||
|                , MonadState GhcModState |                , MonadState GhcModState | ||||||
|                , MonadTrans |                , MonadTrans | ||||||
|                ) |                ) | ||||||
| 
 | 
 | ||||||
| #if __GLASGOW_HASKELL__ < 708 | deriving instance MonadError GhcModError m => MonadError GhcModError (GhcModT m) | ||||||
|  | 
 | ||||||
|  | #if MONADIO_INSTANCES | ||||||
| instance (Monoid w, MonadIO m) => MonadIO (RWST r w s m) where | instance (Monoid w, MonadIO m) => MonadIO (RWST r w s m) where | ||||||
| --  liftIO :: MonadIO m => IO a -> m a |  | ||||||
|     liftIO = lift . liftIO |     liftIO = lift . liftIO | ||||||
|  | 
 | ||||||
|  | instance (Error e, MonadIO m) => MonadIO (ErrorT e m) where | ||||||
|  |     liftIO = lift . liftIO | ||||||
|  | 
 | ||||||
|  | instance (MonadIO m) => MonadIO (MaybeT m) where | ||||||
|  |     liftIO = lift . liftIO | ||||||
|  | 
 | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| ---------------------------------------------------------------- | ---------------------------------------------------------------- | ||||||
| @ -155,15 +196,6 @@ initSession build Options {..} CompilerOptions {..} = do | |||||||
| 
 | 
 | ||||||
| ---------------------------------------------------------------- | ---------------------------------------------------------------- | ||||||
| 
 | 
 | ||||||
| runGhcModT' :: (MonadIO m, MonadBaseControl IO m) |  | ||||||
|            => GhcModEnv |  | ||||||
|            -> GhcModState |  | ||||||
|            -> GhcModT m a |  | ||||||
|            -> m (a,(GhcModState, GhcModWriter)) |  | ||||||
| runGhcModT' r s a = do |  | ||||||
|   (a',s',w) <- runRWST (unGhcModT $ initGhcMonad (Just libdir) >> a) r s |  | ||||||
|   return (a',(s',w)) |  | ||||||
| 
 |  | ||||||
| newGhcModEnv :: Options -> FilePath -> IO GhcModEnv | newGhcModEnv :: Options -> FilePath -> IO GhcModEnv | ||||||
| newGhcModEnv opt dir = do | newGhcModEnv opt dir = do | ||||||
|       session <- newIORef (error "empty session") |       session <- newIORef (error "empty session") | ||||||
| @ -174,7 +206,10 @@ newGhcModEnv opt dir = do | |||||||
|         , gmCradle = c |         , gmCradle = c | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
| runGhcModT :: (MonadIO m, MonadBaseControl IO m) => Options -> GhcModT m a -> m a | -- | Run a @GhcModT m@ computation, i.e. one with a custom underlying monad. | ||||||
|  | -- | ||||||
|  | -- You probably don't want this, look at 'runGhcMod' instead. | ||||||
|  | runGhcModT :: IOish m => Options -> GhcModT m a -> m a | ||||||
| runGhcModT opt action = do | runGhcModT opt action = do | ||||||
|     env <- liftBase $ newGhcModEnv opt =<< getCurrentDirectory |     env <- liftBase $ newGhcModEnv opt =<< getCurrentDirectory | ||||||
|     (a,(_,_)) <- runGhcModT' env defaultState $ do |     (a,(_,_)) <- runGhcModT' env defaultState $ do | ||||||
| @ -184,46 +219,68 @@ runGhcModT opt action = do | |||||||
|             action |             action | ||||||
|     return a |     return a | ||||||
| 
 | 
 | ||||||
| runGhcMod' :: GhcModEnv | -- | Run a computation inside @GhcModT@ providing the RWST environment and | ||||||
|  | -- initial state. This is a low level function, use it only if you know what to | ||||||
|  | -- do with 'GhcModEnv' and 'GhcModState'. | ||||||
|  | -- | ||||||
|  | -- You should probably look at 'runGhcModT' instead. | ||||||
|  | runGhcModT' :: IOish m | ||||||
|  |            => GhcModEnv | ||||||
|            -> GhcModState |            -> GhcModState | ||||||
|            -> GhcModT IO a |            -> GhcModT m a | ||||||
|            -> IO (a,(GhcModState, GhcModWriter)) |            -> m (a,(GhcModState, GhcModWriter)) | ||||||
| runGhcMod' = runGhcModT' | runGhcModT' r s a = do | ||||||
|  |   (a',s',w) <- runRWST (unGhcModT $ initGhcMonad (Just libdir) >> a) r s | ||||||
|  |   return (a',(s',w)) | ||||||
|  | 
 | ||||||
|  | -- | Run a 'GhcMod' computation. If you want an underlying monad other than | ||||||
|  | -- 'ErrorT e IO' you should look at 'runGhcModT' | ||||||
|  | runGhcMod :: Options | ||||||
|  |           -> GhcMod a | ||||||
|  |           -> IO (Either GhcModError a) | ||||||
|  | runGhcMod o a = | ||||||
|  |   runErrorT $ runGhcModT o a | ||||||
|  | 
 | ||||||
|  | liftErrorT :: IOish m => GhcModT m a -> GhcModT (ErrorT GhcModError m) a | ||||||
|  | liftErrorT action = | ||||||
|  |     GhcModT $ RWST $ \e s -> ErrorT $ Right <$> (runRWST $ unGhcModT action) e s | ||||||
|  | 
 | ||||||
|  | -- | Lift @(GhcModT IO)@ into @GhcMod@, which is an alias for @GhcModT (ErrorT | ||||||
|  | -- GhcModError IO)@. | ||||||
|  | liftGhcMod :: GhcModT IO a -> GhcMod a | ||||||
|  | liftGhcMod = liftErrorT | ||||||
| 
 | 
 | ||||||
| runGhcMod :: Options -> GhcMod a -> IO a |  | ||||||
| runGhcMod = runGhcModT |  | ||||||
| ---------------------------------------------------------------- | ---------------------------------------------------------------- | ||||||
| 
 | 
 | ||||||
| withErrorHandler :: String -> GhcMod a -> GhcMod a | withErrorHandler :: IOish m => String -> GhcModT m a -> GhcModT m a | ||||||
| withErrorHandler label = ghandle ignore | withErrorHandler label = ghandle ignore | ||||||
|   where |   where | ||||||
|     ignore :: SomeException -> GhcMod a |     ignore :: IOish m => SomeException -> GhcModT m a | ||||||
|     ignore e = liftIO $ do |     ignore e = liftIO $ do | ||||||
|         hPutStr stderr $ label ++ ":0:0:Error:" |         hPutStr stderr $ label ++ ":0:0:Error:" | ||||||
|         hPrint stderr e |         hPrint stderr e | ||||||
|         exitSuccess |         exitSuccess | ||||||
| 
 | 
 | ||||||
| -- | This is only a transitional mechanism don't use it for new code. | -- | This is only a transitional mechanism don't use it for new code. | ||||||
| toGhcMod :: (Functor m, MonadIO m) => Ghc a -> GhcModT m a | toGhcMod :: IOish m => Ghc a -> GhcModT m a | ||||||
| toGhcMod a = do | toGhcMod a = do | ||||||
|     s <- gmGhcSession <$> ask |     s <- gmGhcSession <$> ask | ||||||
|     liftIO $ unGhc a $ Session s |     liftIO $ unGhc a $ Session s | ||||||
| 
 | 
 | ||||||
| ---------------------------------------------------------------- | ---------------------------------------------------------------- | ||||||
| 
 | 
 | ||||||
| options :: GhcMod Options | options :: IOish m => GhcModT m Options | ||||||
| options = gmOptions <$> ask | options = gmOptions <$> ask | ||||||
| 
 | 
 | ||||||
| cradle :: GhcMod Cradle | cradle :: IOish m => GhcModT m Cradle | ||||||
| cradle = gmCradle <$> ask | cradle = gmCradle <$> ask | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| instance (MonadBaseControl IO m) => MonadBase IO (GhcModT m) where | instance (MonadBaseControl IO m) => MonadBase IO (GhcModT m) where | ||||||
|     liftBase = GhcModT . liftBase |     liftBase = GhcModT . liftBase | ||||||
| 
 | 
 | ||||||
| instance (MonadBaseControl IO m) => MonadBaseControl IO (GhcModT m) where | instance (MonadBaseControl IO m) => MonadBaseControl IO (GhcModT m) where | ||||||
|     newtype StM (GhcModT m) a = StGhcMod { |     newtype StM (GhcModT m) a = StGhcMod { | ||||||
|           unStGhcMod :: StM (RWST GhcModEnv () GhcModState m) a } |           unStGhcMod :: StM (RWST GhcModEnv GhcModWriter GhcModState m) a } | ||||||
| 
 | 
 | ||||||
|     liftBaseWith f = GhcModT . liftBaseWith $ \runInBase -> |     liftBaseWith f = GhcModT . liftBaseWith $ \runInBase -> | ||||||
|         f $ liftM StGhcMod . runInBase . unGhcModT |         f $ liftM StGhcMod . runInBase . unGhcModT | ||||||
|  | |||||||
| @ -9,7 +9,7 @@ import Control.Applicative ((<$>)) | |||||||
| import System.Process (readProcess) | import System.Process (readProcess) | ||||||
| 
 | 
 | ||||||
| -- | Obtaining the package name and the doc path of a module. | -- | Obtaining the package name and the doc path of a module. | ||||||
| pkgDoc :: String -> GhcMod String | pkgDoc :: IOish m => String -> GhcModT m String | ||||||
| pkgDoc mdl = cradle >>= \c -> liftIO $ do | pkgDoc mdl = cradle >>= \c -> liftIO $ do | ||||||
|     pkg <- trim <$> readProcess "ghc-pkg" (toModuleOpts c) [] |     pkg <- trim <$> readProcess "ghc-pkg" (toModuleOpts c) [] | ||||||
|     if pkg == "" then |     if pkg == "" then | ||||||
|  | |||||||
| @ -51,6 +51,7 @@ Extra-Source-Files:     ChangeLog | |||||||
| Library | Library | ||||||
|   Default-Language:     Haskell2010 |   Default-Language:     Haskell2010 | ||||||
|   GHC-Options:          -Wall |   GHC-Options:          -Wall | ||||||
|  |   Default-Extensions:   ConstraintKinds, FlexibleContexts | ||||||
|   Exposed-Modules:      Language.Haskell.GhcMod |   Exposed-Modules:      Language.Haskell.GhcMod | ||||||
|                         Language.Haskell.GhcMod.Ghc |                         Language.Haskell.GhcMod.Ghc | ||||||
|                         Language.Haskell.GhcMod.Monad |                         Language.Haskell.GhcMod.Monad | ||||||
| @ -117,6 +118,7 @@ Executable ghc-mod | |||||||
|   Main-Is:              GHCMod.hs |   Main-Is:              GHCMod.hs | ||||||
|   Other-Modules:        Paths_ghc_mod |   Other-Modules:        Paths_ghc_mod | ||||||
|   GHC-Options:          -Wall |   GHC-Options:          -Wall | ||||||
|  |   Default-Extensions:   ConstraintKinds, FlexibleContexts | ||||||
|   HS-Source-Dirs:       src |   HS-Source-Dirs:       src | ||||||
|   Build-Depends:        base >= 4.0 && < 5 |   Build-Depends:        base >= 4.0 && < 5 | ||||||
|                       , directory |                       , directory | ||||||
| @ -130,6 +132,7 @@ Executable ghc-modi | |||||||
|   Main-Is:              GHCModi.hs |   Main-Is:              GHCModi.hs | ||||||
|   Other-Modules:        Paths_ghc_mod |   Other-Modules:        Paths_ghc_mod | ||||||
|   GHC-Options:          -Wall |   GHC-Options:          -Wall | ||||||
|  |   Default-Extensions:   ConstraintKinds, FlexibleContexts | ||||||
|   HS-Source-Dirs:       src |   HS-Source-Dirs:       src | ||||||
|   Build-Depends:        base >= 4.0 && < 5 |   Build-Depends:        base >= 4.0 && < 5 | ||||||
|                       , containers |                       , containers | ||||||
| @ -143,12 +146,14 @@ Test-Suite doctest | |||||||
|   Default-Language:     Haskell2010 |   Default-Language:     Haskell2010 | ||||||
|   HS-Source-Dirs:       test |   HS-Source-Dirs:       test | ||||||
|   Ghc-Options:          -threaded -Wall |   Ghc-Options:          -threaded -Wall | ||||||
|  |   Default-Extensions:   ConstraintKinds, FlexibleContexts | ||||||
|   Main-Is:              doctests.hs |   Main-Is:              doctests.hs | ||||||
|   Build-Depends:        base |   Build-Depends:        base | ||||||
|                       , doctest >= 0.9.3 |                       , doctest >= 0.9.3 | ||||||
| 
 | 
 | ||||||
| Test-Suite spec | Test-Suite spec | ||||||
|   Default-Language:     Haskell2010 |   Default-Language:     Haskell2010 | ||||||
|  |   Default-Extensions:   ConstraintKinds, FlexibleContexts | ||||||
|   Main-Is:              Main.hs |   Main-Is:              Main.hs | ||||||
|   Hs-Source-Dirs:       test, . |   Hs-Source-Dirs:       test, . | ||||||
|   Type:                 exitcode-stdio-1.0 |   Type:                 exitcode-stdio-1.0 | ||||||
|  | |||||||
| @ -111,7 +111,7 @@ main = flip E.catches handlers $ do | |||||||
|         nArgs n f = if length remainingArgs == n |         nArgs n f = if length remainingArgs == n | ||||||
|                         then f |                         then f | ||||||
|                         else E.throw (ArgumentsMismatch cmdArg0) |                         else E.throw (ArgumentsMismatch cmdArg0) | ||||||
|     res <- runGhcMod opt $ case cmdArg0 of |     res <- runGhcModT opt $ case cmdArg0 of | ||||||
|       "list"    -> modules |       "list"    -> modules | ||||||
|       "lang"    -> languages |       "lang"    -> languages | ||||||
|       "flag"    -> flags |       "flag"    -> flags | ||||||
| @ -152,7 +152,7 @@ main = flip E.catches handlers $ do | |||||||
|         hPutStrLn stderr $ "\"" ++ file ++ "\" not found" |         hPutStrLn stderr $ "\"" ++ file ++ "\" not found" | ||||||
|         printUsage |         printUsage | ||||||
|     printUsage = hPutStrLn stderr $ '\n' : O.usageInfo usage argspec |     printUsage = hPutStrLn stderr $ '\n' : O.usageInfo usage argspec | ||||||
|     withFile :: (FilePath -> GhcMod a) -> FilePath -> GhcMod a |     withFile :: IOish m => (FilePath -> GhcModT m a) -> FilePath -> GhcModT m a | ||||||
|     withFile cmd file = do |     withFile cmd file = do | ||||||
|         exist <- liftIO $ doesFileExist file |         exist <- liftIO $ doesFileExist file | ||||||
|         if exist |         if exist | ||||||
|  | |||||||
| @ -101,8 +101,8 @@ main = E.handle cmdHandler $ | |||||||
| --            c = cradle0 { cradleCurrentDir = rootdir } TODO: ????? | --            c = cradle0 { cradleCurrentDir = rootdir } TODO: ????? | ||||||
|         setCurrentDirectory rootdir |         setCurrentDirectory rootdir | ||||||
|         mvar <- liftIO newEmptyMVar |         mvar <- liftIO newEmptyMVar | ||||||
|         void $ forkIO $ runGhcMod opt $ setupDB mvar |         void $ forkIO $ runGhcModT opt $ setupDB mvar | ||||||
|         runGhcMod opt $ loop S.empty mvar |         runGhcModT opt $ loop S.empty mvar | ||||||
|       where |       where | ||||||
|         -- this is just in case. |         -- this is just in case. | ||||||
|         -- If an error is caught here, it is a bug of GhcMod library. |         -- If an error is caught here, it is a bug of GhcMod library. | ||||||
| @ -116,7 +116,7 @@ replace (x:xs)    =  x  : replace xs | |||||||
| 
 | 
 | ||||||
| ---------------------------------------------------------------- | ---------------------------------------------------------------- | ||||||
| 
 | 
 | ||||||
| setupDB :: MVar SymMdlDb -> GhcMod () | setupDB :: IOish m => MVar SymMdlDb -> GhcModT m () | ||||||
| setupDB mvar = ghandle handler $ do | setupDB mvar = ghandle handler $ do | ||||||
|     liftIO . putMVar mvar =<< getSymMdlDb |     liftIO . putMVar mvar =<< getSymMdlDb | ||||||
|   where |   where | ||||||
| @ -124,7 +124,7 @@ setupDB mvar = ghandle handler $ do | |||||||
| 
 | 
 | ||||||
| ---------------------------------------------------------------- | ---------------------------------------------------------------- | ||||||
| 
 | 
 | ||||||
| loop :: Set FilePath -> MVar SymMdlDb -> GhcMod () | loop :: IOish m => Set FilePath -> MVar SymMdlDb -> GhcModT m () | ||||||
| loop set mvar = do | loop set mvar = do | ||||||
|     cmdArg <- liftIO getLine |     cmdArg <- liftIO getLine | ||||||
|     let (cmd,arg') = break (== ' ') cmdArg |     let (cmd,arg') = break (== ' ') cmdArg | ||||||
| @ -152,9 +152,10 @@ loop set mvar = do | |||||||
| 
 | 
 | ||||||
| ---------------------------------------------------------------- | ---------------------------------------------------------------- | ||||||
| 
 | 
 | ||||||
| checkStx :: Set FilePath | checkStx :: IOish m | ||||||
|  |          => Set FilePath | ||||||
|          -> FilePath |          -> FilePath | ||||||
|          -> GhcMod (String, Bool, Set FilePath) |          -> GhcModT m (String, Bool, Set FilePath) | ||||||
| checkStx set file = do | checkStx set file = do | ||||||
|     set' <- toGhcMod $ newFileSet set file |     set' <- toGhcMod $ newFileSet set file | ||||||
|     let files = S.toList set' |     let files = S.toList set' | ||||||
| @ -191,17 +192,17 @@ isSameMainFile file (Just x) | |||||||
| 
 | 
 | ||||||
| ---------------------------------------------------------------- | ---------------------------------------------------------------- | ||||||
| 
 | 
 | ||||||
| findSym :: Set FilePath -> String -> MVar SymMdlDb | findSym :: IOish m => Set FilePath -> String -> MVar SymMdlDb | ||||||
|         -> GhcMod (String, Bool, Set FilePath) |         -> GhcModT m (String, Bool, Set FilePath) | ||||||
| findSym set sym mvar = do | findSym set sym mvar = do | ||||||
|     db <- liftIO $ readMVar mvar |     db <- liftIO $ readMVar mvar | ||||||
|     opt <- options |     opt <- options | ||||||
|     let ret = lookupSym' opt sym db |     let ret = lookupSym' opt sym db | ||||||
|     return (ret, True, set) |     return (ret, True, set) | ||||||
| 
 | 
 | ||||||
| lintStx :: Set FilePath | lintStx :: IOish m => Set FilePath | ||||||
|         -> FilePath |         -> FilePath | ||||||
|         -> GhcMod (String, Bool, Set FilePath) |         -> GhcModT m (String, Bool, Set FilePath) | ||||||
| lintStx set optFile = do | lintStx set optFile = do | ||||||
|     ret <- local env' $ lint file |     ret <- local env' $ lint file | ||||||
|     return (ret, True, set) |     return (ret, True, set) | ||||||
| @ -228,36 +229,40 @@ parseLintOptions optFile = case brk (== ']') (dropWhile (/= '[') optFile) of | |||||||
| 
 | 
 | ||||||
| ---------------------------------------------------------------- | ---------------------------------------------------------------- | ||||||
| 
 | 
 | ||||||
| showInfo :: Set FilePath | showInfo :: IOish m | ||||||
|  |          => Set FilePath | ||||||
|          -> FilePath |          -> FilePath | ||||||
|          -> GhcMod (String, Bool, Set FilePath) |          -> GhcModT m (String, Bool, Set FilePath) | ||||||
| showInfo set fileArg = do | showInfo set fileArg = do | ||||||
|     let [file, expr] = words fileArg |     let [file, expr] = words fileArg | ||||||
|     set' <- newFileSet set file |     set' <- newFileSet set file | ||||||
|     ret <- info file expr |     ret <- info file expr | ||||||
|     return (ret, True, set') |     return (ret, True, set') | ||||||
| 
 | 
 | ||||||
| showType :: Set FilePath | showType :: IOish m | ||||||
|  |          => Set FilePath | ||||||
|          -> FilePath |          -> FilePath | ||||||
|          -> GhcMod (String, Bool, Set FilePath) |          -> GhcModT m (String, Bool, Set FilePath) | ||||||
| showType set fileArg  = do | showType set fileArg  = do | ||||||
|     let [file, line, column] = words fileArg |     let [file, line, column] = words fileArg | ||||||
|     set' <- newFileSet set file |     set' <- newFileSet set file | ||||||
|     ret <- types file (read line) (read column) |     ret <- types file (read line) (read column) | ||||||
|     return (ret, True, set') |     return (ret, True, set') | ||||||
| 
 | 
 | ||||||
| doSplit :: Set FilePath | doSplit :: IOish m | ||||||
|  |         => Set FilePath | ||||||
|         -> FilePath |         -> FilePath | ||||||
|         -> GhcMod (String, Bool, Set FilePath) |         -> GhcModT m (String, Bool, Set FilePath) | ||||||
| doSplit set fileArg  = do | doSplit set fileArg  = do | ||||||
|     let [file, line, column] = words fileArg |     let [file, line, column] = words fileArg | ||||||
|     set' <- newFileSet set file |     set' <- newFileSet set file | ||||||
|     ret <- splits file (read line) (read column) |     ret <- splits file (read line) (read column) | ||||||
|     return (ret, True, set') |     return (ret, True, set') | ||||||
| 
 | 
 | ||||||
| doSig :: Set FilePath | doSig :: IOish m | ||||||
|  |       => Set FilePath | ||||||
|       -> FilePath |       -> FilePath | ||||||
|       -> GhcMod (String, Bool, Set FilePath) |       -> GhcModT m (String, Bool, Set FilePath) | ||||||
| doSig set fileArg  = do | doSig set fileArg  = do | ||||||
|     let [file, line, column] = words fileArg |     let [file, line, column] = words fileArg | ||||||
|     set' <- newFileSet set file |     set' <- newFileSet set file | ||||||
| @ -266,15 +271,17 @@ doSig set fileArg  = do | |||||||
| 
 | 
 | ||||||
| ---------------------------------------------------------------- | ---------------------------------------------------------------- | ||||||
| 
 | 
 | ||||||
| bootIt :: Set FilePath | bootIt :: IOish m | ||||||
|        -> GhcMod (String, Bool, Set FilePath) |        => Set FilePath | ||||||
|  |        -> GhcModT m (String, Bool, Set FilePath) | ||||||
| bootIt set = do | bootIt set = do | ||||||
|     ret <- boot |     ret <- boot | ||||||
|     return (ret, True, set) |     return (ret, True, set) | ||||||
| 
 | 
 | ||||||
| browseIt :: Set FilePath | browseIt :: IOish m | ||||||
|  |          => Set FilePath | ||||||
|          -> ModuleString |          -> ModuleString | ||||||
|          -> GhcMod (String, Bool, Set FilePath) |          -> GhcModT m (String, Bool, Set FilePath) | ||||||
| browseIt set mdl = do | browseIt set mdl = do | ||||||
|     ret <- browse mdl |     ret <- browse mdl | ||||||
|     return (ret, True, set) |     return (ret, True, set) | ||||||
|  | |||||||
| @ -12,14 +12,14 @@ module TestUtils ( | |||||||
| import Language.Haskell.GhcMod.Monad | import Language.Haskell.GhcMod.Monad | ||||||
| import Language.Haskell.GhcMod.Types | import Language.Haskell.GhcMod.Types | ||||||
| 
 | 
 | ||||||
| isolateCradle :: GhcMod a -> GhcMod a | isolateCradle :: IOish m => GhcModT m a -> GhcModT m a | ||||||
| isolateCradle action = | isolateCradle action = | ||||||
|     local modifyEnv  $ action |     local modifyEnv  $ action | ||||||
|  where |  where | ||||||
|     modifyEnv e = e { gmCradle = (gmCradle e) { cradlePkgDbStack = [GlobalDb] } } |     modifyEnv e = e { gmCradle = (gmCradle e) { cradlePkgDbStack = [GlobalDb] } } | ||||||
| 
 | 
 | ||||||
| runIsolatedGhcMod :: Options -> GhcMod a -> IO a | runIsolatedGhcMod :: Options -> GhcModT IO a -> IO a | ||||||
| runIsolatedGhcMod opt action = runGhcMod opt $ isolateCradle action | runIsolatedGhcMod opt action = runGhcModT opt $ isolateCradle action | ||||||
| 
 | 
 | ||||||
| -- | Run GhcMod in isolated cradle with default options | -- | Run GhcMod in isolated cradle with default options | ||||||
| runID = runIsolatedGhcMod defaultOptions | runID = runIsolatedGhcMod defaultOptions | ||||||
| @ -28,7 +28,9 @@ runID = runIsolatedGhcMod defaultOptions | |||||||
| runI = runIsolatedGhcMod | runI = runIsolatedGhcMod | ||||||
| 
 | 
 | ||||||
| -- | Run GhcMod | -- | Run GhcMod | ||||||
| run = runGhcMod | run :: Options -> GhcModT IO a -> IO a | ||||||
|  | run = runGhcModT | ||||||
| 
 | 
 | ||||||
| -- | Run GhcMod with default options | -- | Run GhcMod with default options | ||||||
| runD = runGhcMod defaultOptions | runD :: GhcModT IO a -> IO a | ||||||
|  | runD = runGhcModT defaultOptions | ||||||
|  | |||||||
| @ -6,6 +6,7 @@ main :: IO () | |||||||
| main = doctest [ | main = doctest [ | ||||||
|     "-package" |     "-package" | ||||||
|   , "ghc" |   , "ghc" | ||||||
|  |   , "-XConstraintKinds", "-XFlexibleContexts" | ||||||
|   , "-idist/build/autogen/" |   , "-idist/build/autogen/" | ||||||
|   , "-optP-include" |   , "-optP-include" | ||||||
|   , "-optPdist/build/autogen/cabal_macros.h" |   , "-optPdist/build/autogen/cabal_macros.h" | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Kazu Yamamoto
						Kazu Yamamoto