uhc-util 0.1.5.6 → 0.1.6.0
raw patch · 7 files changed
+892/−11 lines, 7 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
+ UHC.Util.CompileRun2: instance (CompileRunner state n pos loc u i e m, MonadFix m) => MonadFix (CompilePhaseT n u i e m)
+ UHC.Util.CompileRun3: CRSErrInfoL :: String -> Bool -> [err] -> CompileRunState err
+ UHC.Util.CompileRun3: CRSFail :: CompileRunState err
+ UHC.Util.CompileRun3: CRSFailErrL :: String -> [err] -> (Maybe Int) -> CompileRunState err
+ UHC.Util.CompileRun3: CRSFailMsg :: String -> CompileRunState err
+ UHC.Util.CompileRun3: CRSOk :: CompileRunState err
+ UHC.Util.CompileRun3: CRSStop :: CompileRunState err
+ UHC.Util.CompileRun3: CRSStopAllSeq :: CompileRunState err
+ UHC.Util.CompileRun3: CRSStopSeq :: CompileRunState err
+ UHC.Util.CompileRun3: CompileParticipation_NoImport :: CompileParticipation
+ UHC.Util.CompileRun3: CompileRun :: Map nm unit -> Map nm nm -> [[nm]] -> nm -> CompileRunState err -> info -> Bool -> CompileRun nm unit info err
+ UHC.Util.CompileRun3: _crCUCache :: CompileRun nm unit info err -> Map nm unit
+ UHC.Util.CompileRun3: _crCompileOrder :: CompileRun nm unit info err -> [[nm]]
+ UHC.Util.CompileRun3: _crNmForward :: CompileRun nm unit info err -> Map nm nm
+ UHC.Util.CompileRun3: _crOutputDebug :: CompileRun nm unit info err -> Bool
+ UHC.Util.CompileRun3: _crState :: CompileRun nm unit info err -> CompileRunState err
+ UHC.Util.CompileRun3: _crStateInfo :: CompileRun nm unit info err -> info
+ UHC.Util.CompileRun3: _crTopModNm :: CompileRun nm unit info err -> nm
+ UHC.Util.CompileRun3: class CompileModName n
+ UHC.Util.CompileRun3: class CompileRunError e p | e -> p where crePPErrL _ = empty creMkNotFoundErrL _ _ _ _ = [] creAreFatal _ = True
+ UHC.Util.CompileRun3: class CompileRunStateInfo i n p
+ UHC.Util.CompileRun3: class (CompileModName nm, CompileUnitState state, CompileUnit unit nm loc state, CompileRunError err pos, CompileRunStateInfo info nm pos, MonadState (CompileRun nm unit info err) m, MonadIO m, Monad m) => CompileRunner state nm pos loc unit info err m
+ UHC.Util.CompileRun3: class CompileUnit u n l s | u -> n l s where cuParticipation _ = []
+ UHC.Util.CompileRun3: class CompileUnitState s
+ UHC.Util.CompileRun3: class FileLocatable x loc | loc -> x
+ UHC.Util.CompileRun3: cpEmpty :: CompileRunner s n p l u i e m => CompilePhaseT n u i e m ()
+ UHC.Util.CompileRun3: cpFindFileForFPath :: (Ord n, Show n, FPATH n, FileLocatable u String, CompileRunner s n p String u i e m) => [(FileSuffix, s)] -> [String] -> Maybe n -> Maybe FPath -> CompilePhaseT n u i e m (Maybe FPath)
+ UHC.Util.CompileRun3: cpFindFileForNameOrFPath :: FPATH n => String -> n -> FPath -> [(String, FPath)]
+ UHC.Util.CompileRun3: cpFindFilesForFPath :: (Ord n, Show n, FPATH n, FileLocatable u String, CompileRunner s n p String u i e m) => Bool -> [(FileSuffix, s)] -> [String] -> Maybe n -> Maybe FPath -> CompilePhaseT n u i e m [FPath]
+ UHC.Util.CompileRun3: cpFindFilesForFPathInLocations :: (Ord n, Show n, FPATH n, FileLocatable u loc, Show loc, CompileRunner s n p loc u i e m) => (loc -> n -> FPath -> [(loc, FPath, [e])]) -> ((FPath, loc, [e]) -> res) -> Bool -> [(FileSuffix, s)] -> [loc] -> Maybe n -> Maybe FPath -> CompilePhaseT n u i e m [res]
+ UHC.Util.CompileRun3: cpImportGather :: (Show n, Ord n, CompileRunner s n p l u i e m) => (n -> CompilePhaseT n u i e m ()) -> n -> CompilePhaseT n u i e m ()
+ UHC.Util.CompileRun3: cpImportGatherFromMods :: (Show n, Ord n, CompileRunner s n p l u i e m) => (Maybe prev -> n -> CompilePhaseT n u i e m (x, Maybe prev)) -> [n] -> CompilePhaseT n u i e m ()
+ UHC.Util.CompileRun3: cpImportGatherFromModsWithImp :: (Show n, Ord n, CompileRunner s n p l u i e m) => (u -> [n]) -> (Maybe prev -> n -> CompilePhaseT n u i e m (x, Maybe prev)) -> [n] -> CompilePhaseT n u i e m ()
+ UHC.Util.CompileRun3: cpMbCU :: (Ord n, CompileRunner s n p l u i e m) => n -> CompilePhaseT n u i e m (Maybe u)
+ UHC.Util.CompileRun3: cpPP :: (PP n, PP u, CompileRunner s n p l u i e m) => String -> CompilePhaseT n u i e m ()
+ UHC.Util.CompileRun3: cpPPMsg :: (PP msg, CompileRunner s n p l u i e m) => msg -> CompilePhaseT n u i e m ()
+ UHC.Util.CompileRun3: cpSeq :: CompileRunner s n p l u i e m => [CompilePhaseT n u i e m ()] -> CompilePhaseT n u i e m ()
+ UHC.Util.CompileRun3: cpSeqWhen :: CompileRunner s n p l u i e m => Bool -> [CompilePhaseT n u i e m ()] -> CompilePhaseT n u i e m ()
+ UHC.Util.CompileRun3: cpSetCompileOrder :: CompileRunner s n p l u i e m => [[n]] -> CompilePhaseT n u i e m ()
+ UHC.Util.CompileRun3: cpSetErrs :: CompileRunner s n p l u i e m => [e] -> CompilePhaseT n u i e m ()
+ UHC.Util.CompileRun3: cpSetFail :: CompileRunner s n p l u i e m => CompilePhaseT n u i e m ()
+ UHC.Util.CompileRun3: cpSetInfos :: CompileRunner s n p l u i e m => String -> Bool -> [e] -> CompilePhaseT n u i e m ()
+ UHC.Util.CompileRun3: cpSetLimitErrs :: CompileRunner s n p l u i e m => Int -> String -> [e] -> CompilePhaseT n u i e m ()
+ UHC.Util.CompileRun3: cpSetLimitErrsWhen :: CompileRunner s n p l u i e m => Int -> String -> [e] -> CompilePhaseT n u i e m ()
+ UHC.Util.CompileRun3: cpSetOk :: CompileRunner s n p l u i e m => CompilePhaseT n u i e m ()
+ UHC.Util.CompileRun3: cpSetStop :: CompileRunner s n p l u i e m => CompilePhaseT n u i e m ()
+ UHC.Util.CompileRun3: cpSetStopAllSeq :: CompileRunner s n p l u i e m => CompilePhaseT n u i e m ()
+ UHC.Util.CompileRun3: cpSetStopSeq :: CompileRunner s n p l u i e m => CompilePhaseT n u i e m ()
+ UHC.Util.CompileRun3: cpUpdCU :: (Show n, Ord n, CompileRunner s n p l u i e m) => n -> (u -> u) -> CompilePhaseT n u i e m ()
+ UHC.Util.CompileRun3: cpUpdCUWithKey :: (Show n, Ord n, CompileRunner s n p l u i e m) => n -> (n -> u -> (n, u)) -> CompilePhaseT n u i e m n
+ UHC.Util.CompileRun3: cpUpdSI :: CompileRunner s n p l u i e m => (i -> i) -> CompilePhaseT n u i e m ()
+ UHC.Util.CompileRun3: cpUpdStateInfo :: CompileRunner s n p l u i e m => (i -> i) -> CompilePhaseT n u i e m ()
+ UHC.Util.CompileRun3: crCU :: (Show n, Ord n) => n -> CompileRun n u i e -> u
+ UHC.Util.CompileRun3: crCUCache :: ArrowApply cat => Lens cat (CompileRun nm unit info err) (Map nm unit)
+ UHC.Util.CompileRun3: crCompileOrder :: ArrowApply cat => Lens cat (CompileRun nm unit info err) [[nm]]
+ UHC.Util.CompileRun3: crMbCU :: Ord n => n -> CompileRun n u i e -> Maybe u
+ UHC.Util.CompileRun3: crMbCUForwarded :: Ord n => n -> CompileRun n u i e -> Maybe u
+ UHC.Util.CompileRun3: crMbCUNotForwarded :: Ord n => n -> CompileRun n u i e -> Maybe u
+ UHC.Util.CompileRun3: crNmForward :: ArrowApply cat => Lens cat (CompileRun nm unit info err) (Map nm nm)
+ UHC.Util.CompileRun3: crState :: ArrowApply cat => Lens cat (CompileRun nm unit info err -> CompileRun nm unit info a) (CompileRunState err -> CompileRunState a)
+ UHC.Util.CompileRun3: crStateInfo :: ArrowApply cat => Lens cat (CompileRun nm unit info err -> CompileRun nm unit a err) (info -> a)
+ UHC.Util.CompileRun3: crTopModNm :: ArrowApply cat => Lens cat (CompileRun nm unit info err) nm
+ UHC.Util.CompileRun3: creAreFatal :: CompileRunError e p => [e] -> Bool
+ UHC.Util.CompileRun3: creMkNotFoundErrL :: CompileRunError e p => p -> String -> [String] -> [FileSuffix] -> [e]
+ UHC.Util.CompileRun3: crePPErrL :: CompileRunError e p => [e] -> PP_Doc
+ UHC.Util.CompileRun3: crsiImportPosOfCUKey :: CompileRunStateInfo i n p => n -> i -> p
+ UHC.Util.CompileRun3: cuDefault :: CompileUnit u n l s => u
+ UHC.Util.CompileRun3: cuFPath :: CompileUnit u n l s => u -> FPath
+ UHC.Util.CompileRun3: cuImports :: CompileUnit u n l s => u -> [n]
+ UHC.Util.CompileRun3: cuKey :: CompileUnit u n l s => u -> n
+ UHC.Util.CompileRun3: cuLocation :: CompileUnit u n l s => u -> l
+ UHC.Util.CompileRun3: cuParticipation :: CompileUnit u n l s => u -> [CompileParticipation]
+ UHC.Util.CompileRun3: cuState :: CompileUnit u n l s => u -> s
+ UHC.Util.CompileRun3: cuUpdFPath :: CompileUnit u n l s => FPath -> u -> u
+ UHC.Util.CompileRun3: cuUpdKey :: CompileUnit u n l s => n -> u -> u
+ UHC.Util.CompileRun3: cuUpdLocation :: CompileUnit u n l s => l -> u -> u
+ UHC.Util.CompileRun3: cuUpdState :: CompileUnit u n l s => s -> u -> u
+ UHC.Util.CompileRun3: cusDefault :: CompileUnitState s => s
+ UHC.Util.CompileRun3: cusIsImpKnown :: CompileUnitState s => s -> Bool
+ UHC.Util.CompileRun3: cusIsUnk :: CompileUnitState s => s -> Bool
+ UHC.Util.CompileRun3: cusUnk :: CompileUnitState s => s
+ UHC.Util.CompileRun3: data CompileParticipation
+ UHC.Util.CompileRun3: data CompilePhaseT n u i e m a
+ UHC.Util.CompileRun3: data CompileRun nm unit info err
+ UHC.Util.CompileRun3: data CompileRunState err
+ UHC.Util.CompileRun3: fileLocation :: FileLocatable x loc => x -> loc
+ UHC.Util.CompileRun3: forgetM :: Monad m => m a -> m ()
+ UHC.Util.CompileRun3: instance (CompileRunner state n pos loc u i e m, MonadError e' m) => MonadError e' (CompilePhaseT n u i e m)
+ UHC.Util.CompileRun3: instance (CompileRunner state n pos loc u i e m, MonadFix m) => MonadFix (CompilePhaseT n u i e m)
+ UHC.Util.CompileRun3: instance (CompileRunner state n pos loc u i e m, MonadIO m) => MonadIO (CompilePhaseT n u i e m)
+ UHC.Util.CompileRun3: instance (CompileRunner state n pos loc u i e m, MonadState s m) => MonadState s (CompilePhaseT n u i e m)
+ UHC.Util.CompileRun3: instance CompileRunError String ()
+ UHC.Util.CompileRun3: instance CompileRunner state n pos loc u i e m => Applicative (CompilePhaseT n u i e m)
+ UHC.Util.CompileRun3: instance CompileRunner state n pos loc u i e m => Functor (CompilePhaseT n u i e m)
+ UHC.Util.CompileRun3: instance CompileRunner state n pos loc u i e m => Monad (CompilePhaseT n u i e m)
+ UHC.Util.CompileRun3: instance Eq CompileParticipation
+ UHC.Util.CompileRun3: instance Error (CompileRunState err)
+ UHC.Util.CompileRun3: instance MonadTrans (CompilePhaseT n u i e)
+ UHC.Util.CompileRun3: instance Ord CompileParticipation
+ UHC.Util.CompileRun3: instance Show (CompileRunState err)
+ UHC.Util.CompileRun3: mkCMNm :: CompileModName n => String -> n
+ UHC.Util.CompileRun3: mkEmptyCompileRun :: n -> i -> CompileRun n u i e
+ UHC.Util.CompileRun3: noFileLocation :: FileLocatable x loc => loc
+ UHC.Util.CompileRun3: ppCR :: (PP n, PP u) => CompileRun n u i e -> PP_Doc
+ UHC.Util.CompileRun3: type CompilePhase n u i e a = CompilePhaseT n u i e Identity a
+ UHC.Util.FPath: instance Typeable FPath
+ UHC.Util.Hashable: instance (Hashable a, Hashable b) => Hashable (Map a b)
+ UHC.Util.Hashable: instance Hashable a => Hashable (Set a)
+ UHC.Util.Utils: showUnprefixedWithTypeable :: (Show x, Typeable x) => Int -> x -> String
+ UHC.Util.Utils: strToLower :: String -> String
Files
- src/UHC/Util/CompileRun.hs +8/−2
- src/UHC/Util/CompileRun2.hs +18/−2
- src/UHC/Util/CompileRun3.hs +823/−0
- src/UHC/Util/FPath.hs +10/−2
- src/UHC/Util/Hashable.hs +10/−2
- src/UHC/Util/Utils.hs +20/−1
- uhc-util.cabal +3/−2
src/UHC/Util/CompileRun.hs view
@@ -489,8 +489,14 @@ :: ( Ord n , FPATH n, FileLocatable u loc, Show loc , CompileUnitState s,CompileRunError e p,CompileUnit u n loc s,CompileModName n,CompileRunStateInfo i n p- ) => (loc -> n -> FPath -> [(loc,FPath,[e])]) -> ((FPath,loc,[e]) -> res)- -> Bool -> [(FileSuffix,s)] -> [loc] -> Maybe n -> Maybe FPath -> CompilePhase n u i e [res]+ ) => (loc -> n -> FPath -> [(loc,FPath,[e])]) -- ^ get the locations for a name, possibly with errors+ -> ((FPath,loc,[e]) -> res) -- ^ construct a result given a found location+ -> Bool -- ^ stop when first is found+ -> [(FileSuffix,s)] -- ^ suffix info+ -> [loc] -- ^ locations to search+ -> Maybe n -- ^ possibly a module name+ -> Maybe FPath -- ^ possibly a file path+ -> CompilePhase n u i e [res] cpFindFilesForFPathInLocations getfp putres stopAtFirst suffs locs mbModNm mbFp = do { cr <- get ; let cus = maybe cusUnk (flip crCUState cr) mbModNm
src/UHC/Util/CompileRun2.hs view
@@ -54,6 +54,7 @@ import Data.Maybe import System.Exit import Control.Monad+import Control.Monad.Fix import Control.Applicative(Applicative(..)) import Control.Monad.Error as ME import Control.Monad.State@@ -301,7 +302,16 @@ throwError = lift . throwError catchError m hdl = lift $ catchError (runCompilePhaseT m) (runCompilePhaseT . hdl) +instance (CompileRunner state n pos loc u i e m, MonadFix m) => MonadFix (CompilePhaseT n u i e m) where+ mfix f = CompilePhaseT $ mfix $ \ ~a -> runCompilePhaseT (f a)+ {-+instance (MonadFix m) => MonadFix (StateT s m) where+ mfix f = StateT $ \ s -> mfix $ \ ~(a, _) -> runStateT (f a) s++-}++{- instance (Show e, MonadIO m) => MonadError e m where throwError e = CE.throwIO $ CE.ErrorCall $ show e catchError m hdl = CE.catch m hdl@@ -419,8 +429,14 @@ :: ( Ord n , FPATH n, FileLocatable u loc, Show loc , CompileRunner s n p loc u i e m- ) => (loc -> n -> FPath -> [(loc,FPath,[e])]) -> ((FPath,loc,[e]) -> res)- -> Bool -> [(FileSuffix,s)] -> [loc] -> Maybe n -> Maybe FPath -> CompilePhaseT n u i e m [res]+ ) => (loc -> n -> FPath -> [(loc,FPath,[e])]) -- ^ get the locations for a name, possibly with errors+ -> ((FPath,loc,[e]) -> res) -- ^ construct a result given a found location+ -> Bool -- ^ stop when first is found+ -> [(FileSuffix,s)] -- ^ suffix info+ -> [loc] -- ^ locations to search+ -> Maybe n -- ^ possibly a module name+ -> Maybe FPath -- ^ possibly a file path+ -> CompilePhaseT n u i e m [res] cpFindFilesForFPathInLocations getfp putres stopAtFirst suffs locs mbModNm mbFp = do { cr <- get ; let cus = maybe cusUnk (flip crCUState cr) mbModNm
+ src/UHC/Util/CompileRun3.hs view
@@ -0,0 +1,823 @@+{-# LANGUAGE TemplateHaskell, UndecidableInstances, FlexibleContexts, FlexibleInstances, TypeSynonymInstances, FunctionalDependencies, MultiParamTypeClasses, RankNTypes, ScopedTypeVariables #-}++-------------------------------------------------------------------------+-- | Combinators for a compile run.+-- 20150807: experimental version, to provide with a forwarding mechanism for renamed compile units. As of now does not work with UHC, suspect a non intented name capture+-------------------------------------------------------------------------++module UHC.Util.CompileRun3+ ( CompileRunner++ , CompileRunState(..)+ + , CompileRun(..)+ , crCUCache, crCompileOrder, crTopModNm, crState, crStateInfo, crNmForward++ , CompilePhase+ , CompilePhaseT(runCompilePhaseT)+ + , CompileUnit(..)+ , CompileUnitState(..)+ , CompileRunError(..)+ , CompileModName(..)+ , CompileRunStateInfo(..)++ , CompileParticipation(..)++ , FileLocatable(..)++ , mkEmptyCompileRun++ , crCU+ , crMbCU, crMbCUNotForwarded, crMbCUForwarded+ , ppCR+ + , cpUpdStateInfo, cpUpdSI++ , cpUpdCU+ , cpUpdCUWithKey+ , cpMbCU+ + , cpSetFail, cpSetStop, cpSetStopSeq, cpSetStopAllSeq+ , cpSetOk, cpSetErrs, cpSetLimitErrs, cpSetLimitErrsWhen, cpSetInfos, cpSetCompileOrder++ , cpSeq, cpSeqWhen+ , cpEmpty++ , cpFindFileForNameOrFPath+ , cpFindFilesForFPathInLocations, cpFindFilesForFPath, cpFindFileForFPath+ , cpImportGather, cpImportGatherFromMods, cpImportGatherFromModsWithImp+ , cpPP, cpPPMsg++ , forgetM+ )+ where++import Data.Maybe+import System.Exit+import Control.Applicative ((<|>))+import Control.Monad+import Control.Monad.Fix+import Control.Applicative(Applicative(..))+import Control.Monad.Error as ME+import Control.Monad.State+import qualified Control.Exception as CE+import Control.Monad.Identity+import System.IO+import qualified Data.Map as Map+import UHC.Util.Pretty+import UHC.Util.Utils+import UHC.Util.FPath+import UHC.Util.Lens+++-------------------------------------------------------------------------+-- Utility+-------------------------------------------------------------------------++-- forget result+forgetM :: Monad m => m a -> m ()+forgetM m+ = do { _ <- m+ ; return ()+ }++-------------------------------------------------------------------------+-- The way a CompileUnit can participate+-------------------------------------------------------------------------++data CompileParticipation+ = CompileParticipation_NoImport+ deriving (Eq, Ord)++-------------------------------------------------------------------------+-- Interfacing with actual state info+-------------------------------------------------------------------------++-- | Conversion from string to module name+class CompileModName n where+ mkCMNm :: String -> n++-- | State of a compile unit+class CompileUnitState s where+ cusDefault :: s+ cusUnk :: s+ cusIsUnk :: s -> Bool+ cusIsImpKnown :: s -> Bool++-- | Per compile unit+class CompileUnit u n l s | u -> n l s where+ cuDefault :: u+ cuFPath :: u -> FPath+ cuUpdFPath :: FPath -> u -> u+ cuLocation :: u -> l+ cuUpdLocation :: l -> u -> u+ cuKey :: u -> n+ cuUpdKey :: n -> u -> u+ cuState :: u -> s+ cuUpdState :: s -> u -> u+ cuImports :: u -> [n]+ cuParticipation :: u -> [CompileParticipation]++ -- defaults+ cuParticipation _ = []++-- | Error reporting+class {- FPathError e => -} CompileRunError e p | e -> p where+ crePPErrL :: [e] -> PP_Doc+ creMkNotFoundErrL :: p -> String -> [String] -> [FileSuffix] -> [e]+ creAreFatal :: [e] -> Bool++ -- defaults+ crePPErrL _ = empty+ creMkNotFoundErrL _ _ _ _ = []+ creAreFatal _ = True++class CompileRunStateInfo i n p where+ crsiImportPosOfCUKey :: n -> i -> p++-------------------------------------------------------------------------+-- Class alias covering all requirements+-------------------------------------------------------------------------++-- | Class alias for compile functionality+class+ ( CompileModName nm+ , CompileUnitState state+ , CompileUnit unit nm loc state+ , CompileRunError err pos+ , CompileRunStateInfo info nm pos+ , MonadState (CompileRun nm unit info err) m+ -- , MonadError (CompileRunState err) m+ , MonadIO m+ , Monad m+ ) => CompileRunner state nm pos loc unit info err m+ where++-------------------------------------------------------------------------+-- Instances+-------------------------------------------------------------------------++instance CompileRunError String ()++-------------------------------------------------------------------------+-- Locatable+-------------------------------------------------------------------------++class FileLocatable x loc | loc -> x where -- funcdep has unlogical direction, but well...+ fileLocation :: x -> loc+ noFileLocation :: loc++-------------------------------------------------------------------------+-- State+-------------------------------------------------------------------------++data CompileRunState err+ = CRSOk -- continue+ | CRSFail -- fail and stop+ | CRSFailMsg String -- fail with a message and stop+ | CRSStopSeq -- stop current cpSeq+ | CRSStopAllSeq -- stop current cpSeq, but also the surrounding ones+ | CRSStop -- stop completely+ | CRSFailErrL String [err] (Maybe Int) -- fail with errors and stop+ | CRSErrInfoL String Bool [err] -- just errors, continue++data CompileRun nm unit info err+ = CompileRun+ { _crCUCache :: Map.Map nm unit -- cached compile units+ , _crNmForward :: Map.Map nm nm -- Forwarding mechanism for name changes+ , _crCompileOrder :: [[nm]]+ , _crTopModNm :: nm+ , _crState :: CompileRunState err+ , _crStateInfo :: info+ , _crOutputDebug :: Bool+ }++mkLabel ''CompileRun++instance Error (CompileRunState err) where+ noMsg = CRSOk+ strMsg = CRSFailMsg+ +-- instance Monad m => MonadError (CompileRunState err) m + +instance Show (CompileRunState err) where+ show CRSOk = "CRSOk"+ show CRSFail = "CRSFail"+ show (CRSFailMsg s) = "CRSFail: " ++ s+ show CRSStopSeq = "CRSStopSeq"+ show CRSStopAllSeq = "CRSStopAllSeq"+ show CRSStop = "CRSStop"+ show (CRSFailErrL _ _ _) = "CRSFailErrL"+ show (CRSErrInfoL _ _ _) = "CRSErrInfoL"++mkEmptyCompileRun :: n -> i -> CompileRun n u i e+mkEmptyCompileRun nm info+ = CompileRun+ { _crCUCache = Map.empty+ , _crNmForward = Map.empty+ , _crCompileOrder = []+ , _crTopModNm = nm+ , _crState = CRSOk+ , _crStateInfo = info+ , _crOutputDebug = False+ }++-------------------------------------------------------------------------+-- Monad impl (20140804 AD, not (yet?) put into action, too much code still breaks)+-------------------------------------------------------------------------++-- | 'CompileRun' as state in specific StateT variant with non standard >>=+-- newtype CompilePhaseT n u i e m a = CompilePhaseT {runCompilePhaseT :: CompileRun n u i e -> m (a, CompileRun n u i e)}+newtype CompilePhaseT n u i e m a+ = CompilePhaseT {runCompilePhaseT :: m a}++type CompilePhase n u i e a = CompilePhaseT n u i e Identity a++instance CompileRunner state n pos loc u i e m => Functor (CompilePhaseT n u i e m) where+ fmap = liftM+ +instance CompileRunner state n pos loc u i e m => Applicative (CompilePhaseT n u i e m) where+ pure = return+ (<*>) = ap++-- instance CompileRunner state n pos loc u i e m where++instance CompileRunner state n pos loc u i e m => Monad (CompilePhaseT n u i e m) where+ return x = CompilePhaseT $ return x -- \cr -> return (x, cr)+ cp >>= f = CompilePhaseT $ do -- \cr1 -> do+ x <- {- cpHandleErr' $ -} runCompilePhaseT cp -- (x,cr2) <- runCompilePhaseT cp cr1+ let modf f = do {modify f ; return x}+ cr <- get+ case _crState cr of+ CRSFailErrL about es mbLim+ -> do { let (showErrs,omitErrs) = maybe (es,[]) (flip splitAt es) mbLim+ ; liftIO (unless (null about) (hPutPPLn stderr (pp about)))+ ; liftIO $ unless (null showErrs) $ + do { hPutPPLn stderr (crePPErrL showErrs)+ ; unless (null omitErrs) $ hPutStrLn stderr "... and more errors"+ ; hFlush stderr+ }+ ; if creAreFatal es then liftIO exitFailure else modf crSetOk+ }+ CRSErrInfoL about doPrint is+ -> do { if null is+ then return x+ else liftIO (do { hFlush stdout+ ; hPutPPLn stderr (about >#< "found errors" >-< e)+ ; return x+ })+ ; if not (null is) then liftIO exitFailure else return x+ }+ where e = empty -- if doPrint then crePPErrL is else empty+ CRSFailMsg msg+ -> do { liftIO $ hPutStrLn stderr msg+ ; liftIO exitFailure+ }+ CRSFail+ -> do { liftIO exitFailure+ }+ CRSStop+ -> do { liftIO $ exitWith ExitSuccess+ }+ _ -> return x+ cr <- get+ case _crState cr of+ CRSOk -> runCompilePhaseT (f x)+ CRSStopSeq -> do { modf crSetOk ; return $ panic "Monad.CompilePhaseT.CRSStopSeq" }+ CRSStopAllSeq -> do { modf crSetStopAllSeq ; return $ panic "Monad.CompilePhaseT.CRSStopAllSeq" }+ crs -> return $ panic "Monad.CompilePhaseT._"+{- + case _crState cr of+ CRSOk -> runCompilePhaseT (f x)+ CRSStopSeq -> do { modf crSetOk ; ME.throwError CRSStopSeq }+ CRSStopAllSeq -> do { modf crSetStopAllSeq ; ME.throwError CRSStopAllSeq }+ crs -> ME.throwError crs+-}++instance MonadTrans (CompilePhaseT n u i e) where+ lift = CompilePhaseT++instance (CompileRunner state n pos loc u i e m, MonadState s m) => MonadState s (CompilePhaseT n u i e m) where+ get = lift get+ put = lift . put++instance (CompileRunner state n pos loc u i e m, MonadIO m) => MonadIO (CompilePhaseT n u i e m) where+ liftIO = lift . liftIO++instance (CompileRunner state n pos loc u i e m, MonadError e' m) => MonadError e' (CompilePhaseT n u i e m) where+ throwError = lift . throwError+ catchError m hdl = lift $ catchError (runCompilePhaseT m) (runCompilePhaseT . hdl)++instance (CompileRunner state n pos loc u i e m, MonadFix m) => MonadFix (CompilePhaseT n u i e m) where+ mfix f = CompilePhaseT $ mfix $ \ ~a -> runCompilePhaseT (f a)++{-+instance (MonadFix m) => MonadFix (StateT s m) where+ mfix f = StateT $ \ s -> mfix $ \ ~(a, _) -> runStateT (f a) s++-}++{-+instance (Show e, MonadIO m) => MonadError e m where+ throwError e = CE.throwIO $ CE.ErrorCall $ show e+ catchError m hdl = CE.catch m hdl+-}++{-+-}++{-+instance MonadError m => MonadError (CompilePhaseT n u i e m) where+ liftIO = CompilePhaseT . liftIO+-}++{-+instance (Monad m, MonadIO m, Monad (CompilePhaseT n u i e m)) => MonadIO (CompilePhaseT n u i e m) where+ liftIO = lift . liftIO+-}++-------------------------------------------------------------------------+-- Pretty printing+-------------------------------------------------------------------------++ppCR :: (PP n,PP u) => CompileRun n u i e -> PP_Doc+ppCR cr+ = "CR" >#< show (_crState cr) >|< ":" >#<+ ( (ppBracketsCommasBlock $ map (\(n,u) -> pp n >#< "->" >#< pp u) $ Map.toList $ _crCUCache cr)+ >-< ppBracketsCommas (map ppBracketsCommas $ _crCompileOrder $ cr)+ )++crPP :: (PP n,PP u) => String -> CompileRun n u i e -> IO (CompileRun n u i e)+crPP m cr = do { hPutStrLn stderr (m ++ ":") ; hPutPPLn stderr (ppCR cr) ; hFlush stderr ; return cr }++crPPMsg :: (PP m) => m -> CompileRun n u i e -> IO (CompileRun n u i e)+crPPMsg m cr = do { hPutPPLn stdout (pp m) ; return cr }++cpPP :: (PP n, PP u, CompileRunner s n p l u i e m) => String -> CompilePhaseT n u i e m ()+cpPP m+ = do { liftIO (hPutStrLn stderr (m ++ ":"))+ ; cr <- get+ ; liftIO (hPutPPLn stderr (ppCR cr))+ ; liftIO (hFlush stderr)+ ; return ()+ }++cpPPMsg :: (PP msg, CompileRunner s n p l u i e m) => msg -> CompilePhaseT n u i e m ()+cpPPMsg m+ = do { liftIO (hPutPPLn stdout (pp m))+ ; return ()+ }++++-------------------------------------------------------------------------+-- State manipulation, sequencing: compile unit+-------------------------------------------------------------------------++crResolveForward :: Ord n => CompileRun n u i e -> n -> Maybe (n, n)+crResolveForward cr = resolve+ where resolve n = Map.lookup n (_crNmForward cr) >>= \n -> (resolve n <|> return (n,n))++crLiftResolvedForward+ :: Ord n+ => Maybe (n -> Maybe (n,rslv))+ -> (n -> CompileRun n u i e -> Maybe res)+ -> n+ -> CompileRun n u i e+ -> Maybe (res, Maybe rslv)+crLiftResolvedForward resolve action modNm cr =+ (action modNm cr >>= \r -> return (r,Nothing))+ <|> (resolve >>= ($ modNm) >>= \(n,rslv) -> action n cr >>= \r -> return (r, Just rslv))+ -- <|> (resolve >>= \f -> let (n,rslv) = f modNm in fmap (\r -> (r, Just rslv)) $ action n cr)++crMbCU' :: Ord n => n -> CompileRun n u i e -> Maybe u+crMbCU' modNm cr = Map.lookup modNm (_crCUCache cr)++crMbCU :: Ord n => n -> CompileRun n u i e -> Maybe u+crMbCU = crMbCUForwarded -- crMbCU' id+{-# INLINE crMbCU #-}++crMbCUNotForwarded :: Ord n => n -> CompileRun n u i e -> Maybe u+crMbCUNotForwarded modNm cr = fmap fst $ crLiftResolvedForward Nothing crMbCU' modNm cr+{-# INLINE crMbCUNotForwarded #-}++crMbCUForwarded' :: Ord n => n -> CompileRun n u i e -> Maybe (u, Maybe n)+crMbCUForwarded' modNm cr = crLiftResolvedForward (Just $ crResolveForward cr) crMbCU' modNm cr++crMbCUForwarded :: Ord n => n -> CompileRun n u i e -> Maybe u+crMbCUForwarded modNm cr = fmap fst $ crMbCUForwarded' modNm cr++{-+crMbCU' :: Ord n => n -> CompileRun n u i e -> Maybe (n,u)+crMbCU' modNm cr = (fmap ((,) modNm) $ Map.lookup modNm (_crCUCache cr)) <|> (Map.lookup modNm (_crNmForward cr) >>= flip crMbCU' cr)++crMbCU :: Ord n => n -> CompileRun n u i e -> Maybe u+crMbCU modNm cr = fmap snd $ crMbCU' modNm cr+-}++crCU :: (Show n,Ord n) => n -> CompileRun n u i e -> u+crCU modNm = panicJust ("crCU: " ++ show modNm) . crMbCU modNm++-------------------------------------------------------------------------+-- State manipulation, sequencing: non monadic+-------------------------------------------------------------------------++crSetOk :: CompileRun n u i e -> CompileRun n u i e+crSetOk = crState ^= CRSOk -- cr {_crState = CRSOk}++crSetFail :: CompileRun n u i e -> CompileRun n u i e+crSetFail = crState ^= CRSFail -- cr {_crState = CRSFail}++crSetStop :: CompileRun n u i e -> CompileRun n u i e+crSetStop = crState ^= CRSStop -- cr {_crState = CRSStop}++crSetStopSeq :: CompileRun n u i e -> CompileRun n u i e+crSetStopSeq = crState ^= CRSStopSeq -- cr {_crState = CRSStopSeq}++crSetStopAllSeq :: CompileRun n u i e -> CompileRun n u i e+crSetStopAllSeq = crState ^= CRSStopAllSeq -- cr {_crState = CRSStopAllSeq}++crSetErrs' :: Maybe Int -> String -> [e] -> CompileRun n u i e -> CompileRun n u i e+crSetErrs' limit about es cr+ = case es of+ [] -> cr+ _ -> cr {_crState = CRSFailErrL about es limit}++crSetInfos' :: String -> Bool -> [e] -> CompileRun n u i e -> CompileRun n u i e+crSetInfos' msg dp is cr+ = case is of+ [] -> cr+ _ -> cr {_crState = CRSErrInfoL msg dp is}++-------------------------------------------------------------------------+-- Compile unit observations+-------------------------------------------------------------------------++crCUState :: (Ord n,CompileUnit u n l s,CompileUnitState s) => n -> CompileRun n u i e -> s+crCUState modNm cr = maybe cusUnk cuState (crMbCU modNm cr)++crCUFPath :: (Ord n,CompileUnit u n l s) => n -> CompileRun n u i e -> FPath+crCUFPath modNm cr = maybe emptyFPath cuFPath (crMbCU modNm cr)++crCULocation :: (Ord n,FileLocatable u loc) => n -> CompileRun n u i e -> loc+crCULocation modNm cr = maybe noFileLocation fileLocation (crMbCU modNm cr)++-------------------------------------------------------------------------+-- Find file for FPath+-------------------------------------------------------------------------++cpFindFileForNameOrFPath :: (FPATH n) => String -> n -> FPath -> [(String,FPath)]+cpFindFileForNameOrFPath loc _ fp = searchFPathFromLoc loc fp++cpFindFilesForFPathInLocations+ :: ( Ord n, Show n+ , FPATH n, FileLocatable u loc, Show loc+ , CompileRunner s n p loc u i e m+ ) => (loc -> n -> FPath -> [(loc,FPath,[e])]) -- ^ get the locations for a name, possibly with errors+ -> ((FPath,loc,[e]) -> res) -- ^ construct a result given a found location+ -> Bool -- ^ stop when first is found+ -> [(FileSuffix,s)] -- ^ suffix info+ -> [loc] -- ^ locations to search+ -> Maybe n -- ^ possibly a module name+ -> Maybe FPath -- ^ possibly a file path+ -> CompilePhaseT n u i e m [res]+cpFindFilesForFPathInLocations getfp putres stopAtFirst suffs locs mbModNm mbFp+ = do { cr <- get+ ; let cus = maybe cusUnk (flip crCUState cr) mbModNm+ ; if cusIsUnk cus+ then do { let fp = maybe (mkFPath $ panicJust ("cpFindFileForFPath") $ mbModNm) id mbFp+ modNm = maybe (mkCMNm $ fpathBase $ fp) id mbModNm+ suffs' = map fst suffs+ ; fpsFound <- liftIO (searchLocationsForReadableFiles (\l f -> getfp l modNm f)+ stopAtFirst locs suffs' fp+ )+ ; case fpsFound of+ []+ -> do { cpSetErrs (creMkNotFoundErrL (crsiImportPosOfCUKey modNm (_crStateInfo cr)) (fpathToStr fp) (map show locs) suffs')+ ; return []+ }+ ((_,_,e@(_:_)):_)+ -> do { cpSetErrs e+ ; return []+ }+ ffs@((ff,loc,_):_)+ -> do { when (_crOutputDebug cr) $ liftIO $ do+ putStrLn $ "cpFindFilesForFPathInLocations found: " ++ show modNm ++ ", " ++ fpathToStr ff+ putStrLn $ " mbModNm=" ++ show mbModNm ++ ", fp=" ++ fpathToStr fp+ ; cpUpdCU' True modNm (cuUpdLocation loc . cuUpdFPath ff . cuUpdState cus . cuUpdKey modNm)+ ; return (map putres ffs)+ }+ where cus = case lookup (Just $ fpathSuff ff) suffs of+ Just c -> c+ Nothing -> case lookup (Just "*") suffs of+ Just c -> c+ Nothing -> cusUnk+ }+ else return (maybe [] (\nm -> [putres (crCUFPath nm cr,crCULocation nm cr,[])]) mbModNm)+ }++cpFindFilesForFPath+ :: forall e n u p i s m .+ ( Ord n, Show n+ , FPATH n, FileLocatable u String+ , CompileRunner s n p String u i e m+ ) => Bool -> [(FileSuffix,s)] -> [String] -> Maybe n -> Maybe FPath -> CompilePhaseT n u i e m [FPath]+cpFindFilesForFPath+ = cpFindFilesForFPathInLocations (\l n f -> map (tup12to123 ([]::[e])) $ cpFindFileForNameOrFPath l n f) tup123to1++cpFindFileForFPath+ :: ( Ord n, Show n+ , FPATH n, FileLocatable u String+ , CompileRunner s n p String u i e m+ ) => [(FileSuffix,s)] -> [String] -> Maybe n -> Maybe FPath -> CompilePhaseT n u i e m (Maybe FPath)+cpFindFileForFPath suffs sp mbModNm mbFp+ = do { fps <- cpFindFilesForFPath True suffs sp mbModNm mbFp+ ; return (listToMaybe fps)+ }++-------------------------------------------------------------------------+-- Gather all imports+-------------------------------------------------------------------------++-- | recursively extract imported modules, providing a way to import + do the import+cpImportGatherFromModsWithImp+ :: (Show n, Ord n, CompileRunner s n p l u i e m)+ => (u -> [n]) -- get imports+ -> (Maybe prev -> n -> CompilePhaseT n u i e m (x,Maybe prev)) -- extract imports from 1 module+ -> [n] -- to be imported modules+ -> CompilePhaseT n u i e m ()+cpImportGatherFromModsWithImp getImports imp1Mod modNmL+ = do { cr <- get+ ; cpSeq ( [ one Nothing modNm | modNm <- modNmL ]+ ++ [ cpImportScc ]+ )+ }+ where one prev modNm+ = do { (_,new) <- {- cpHandleErr' $ -} imp1Mod prev modNm+ -- ; cpHandleErr+ ; cr <- get+ ; if CompileParticipation_NoImport `elem` cuParticipation (crCU modNm cr)+ then cpDelCU modNm+ else imps new modNm+ }+ imps prev m+ = do { cr <- get+ ; let impL m = [ i | i <- getImports (crCU m cr), not (cusIsImpKnown (crCUState i cr)) ]+ ; cpSeq (map (\n -> one prev n) (impL m))+ }++-- | recursively extract imported modules+cpImportGatherFromMods+ :: (Show n, Ord n, CompileRunner s n p l u i e m)+ => (Maybe prev -> n -> CompilePhaseT n u i e m (x,Maybe prev)) -- extract imports from 1 module+ -> [n] -- to be imported modules+ -> CompilePhaseT n u i e m ()+cpImportGatherFromMods = cpImportGatherFromModsWithImp cuImports++-- | Abbreviation for cpImportGatherFromMods for 1 module+cpImportGather+ :: (Show n,Ord n,CompileRunner s n p l u i e m)+ => (n -> CompilePhaseT n u i e m ()) -> n -> CompilePhaseT n u i e m ()+cpImportGather imp1Mod modNm+ = cpImportGatherFromMods+ (\_ n -> do { r <- imp1Mod n+ ; return (r,Nothing)+ }+ )+ [modNm]++crImportDepL :: (CompileUnit u n l s) => CompileRun n u i e -> [(n,[n])]+crImportDepL = map (\cu -> (cuKey cu,cuImports cu)) . Map.elems . _crCUCache++cpImportScc :: (Ord n, CompileRunner s n p l u i e m) => CompilePhaseT n u i e m ()+cpImportScc = modify (\cr -> (cr {_crCompileOrder = scc (crImportDepL cr)}))+++-------------------------------------------------------------------------+-- State manipulation, state update (Monadic)+-------------------------------------------------------------------------++cpUpdStateInfo, cpUpdSI :: CompileRunner s n p l u i e m => (i -> i) -> CompilePhaseT n u i e m ()+cpUpdStateInfo upd = crStateInfo =$: upd+{-+ = do { cr <- get+ ; put (cr {_crStateInfo = upd (_crStateInfo cr)})+ }+-}++cpUpdSI = cpUpdStateInfo++-------------------------------------------------------------------------+-- State manipulation, compile unit update (Monadic)+-------------------------------------------------------------------------++{-+cpUpdCUM :: (Ord n, CompileRunner s n p l u i e m) => n -> (u -> IO u) -> CompilePhaseT n u i e m ()+cpUpdCUM modNm upd+ = do { cr <- get+ ; cu <- liftIO $ maybe (upd cuDefault) upd (crMbCU modNm cr)+ ; crCUCache =$: Map.insert modNm cu+ }+-}++{-+cpUpdCUWithKey :: (Ord n, CompileRunner s n p l u i e m) => n -> (n -> u -> (n,u)) -> CompilePhaseT n u i e m n+cpUpdCUWithKey modNm upd+ = do { cr <- get+ ; let (modNm',cu) = (maybe (upd modNm cuDefault) (upd modNm) (crMbCU modNm cr))+ ; crCUCache =$: Map.insert modNm' cu . Map.delete modNm+ ; return modNm'+ }+-}++cpUpdCUWithKey' :: (Show n, Ord n, CompileRunner s n p l u i e m) => Bool -> n -> (n -> u -> (n,u)) -> CompilePhaseT n u i e m n+cpUpdCUWithKey' isNew modNm upd+ = do { cr <- get+ ; when isNew $ crNmForward =$: Map.delete modNm+ ; modNm' <- case crMbCUForwarded' modNm cr of+ Just (cu, Nothing) -> do+ let (modNm',cu') = upd modNm cu+ if modNm == modNm'+ then crCUCache =$: Map.adjust (const cu') modNm+ else do+ crCUCache =$: Map.insert modNm' cu' . Map.delete modNm+ crNmForward =$: Map.insert modNm modNm'+ -- ???? TBD, modNm' may have been used as a name in the forwarding map, should be delete there?+ return modNm'++ Just (cu, Just modNmForw) -> do+ -- modNmForw /= modNm+ let (modNm',cu') = upd modNm cu+ if modNm == modNm'+ then crCUCache =$: Map.adjust (const cu') modNmForw+ else -- modNm /= modNm' && modNmForw /= modNm+ if modNmForw == modNm'+ then do+ crCUCache =$: Map.insert modNm' cu' . Map.delete modNmForw+ crNmForward =$: Map.insert modNm modNm'+ else do -- modNm /= modNm' && modNmForw /= modNm && modNmForw /= modNm'+ crCUCache =$: Map.insert modNm' cu' . Map.delete modNmForw+ crNmForward =$: Map.insert modNm modNm' . Map.insert modNmForw modNm' -- TBD: whole chain must be updated to point to modNm'+ return modNm'++ _ -> do+ let (modNm',cu') = upd modNm cuDefault+ crCUCache =$: Map.insert modNm' cu'+ return modNm'++ ; cr <- get+ ; when (_crOutputDebug cr) $ liftIO $ do+ putStrLn $ "cpUpdCUWithKey " ++ show modNm ++ " -> " ++ show modNm'+ putStrLn $ " " ++ (show $ Map.keys $ cr ^. crCUCache)+ putStrLn $ " " ++ (show $ cr ^. crNmForward)+ ; return modNm'+ }++cpUpdCUWithKey :: (Show n, Ord n, CompileRunner s n p l u i e m) => n -> (n -> u -> (n,u)) -> CompilePhaseT n u i e m n+cpUpdCUWithKey = cpUpdCUWithKey' False+{-# INLINE cpUpdCUWithKey #-}++cpUpdCU' :: (Show n, Ord n, CompileRunner s n p l u i e m) => Bool -> n -> (u -> u) -> CompilePhaseT n u i e m ()+cpUpdCU' isNew modNm upd+ = do { cpUpdCUWithKey' isNew modNm (\k u -> (k, upd u))+ ; return ()+ }++cpUpdCU :: (Show n, Ord n, CompileRunner s n p l u i e m) => n -> (u -> u) -> CompilePhaseT n u i e m ()+cpUpdCU = cpUpdCU' False+{-# INLINE cpUpdCU #-}++-- | lookup unit+cpMbCU :: (Ord n,CompileRunner s n p l u i e m) => n -> CompilePhaseT n u i e m (Maybe u)+cpMbCU modNm = liftM (crMbCU modNm) get++-- | lookup unit, with forwarding of renamed keys+cpMbCUForwarded :: (Ord n,CompileRunner s n p l u i e m) => n -> CompilePhaseT n u i e m (Maybe u)+cpMbCUForwarded modNm = liftM (crMbCUForwarded modNm) get++-- | delete unit+cpDelCU :: (Ord n,CompileRunner s n p l u i e m) => n -> CompilePhaseT n u i e m ()+cpDelCU modNm = do+ cr <- get+ case crMbCUForwarded' modNm cr of+ Just (_, Nothing) -> do+ crCUCache =$: Map.delete modNm+ Just (_, Just modNmForw) -> do+ crCUCache =$: Map.delete modNmForw+ _ -> return ()++-------------------------------------------------------------------------+-- State manipulation, sequencing (Monadic)+-------------------------------------------------------------------------++cpSetErrs :: CompileRunner s n p l u i e m => [e] -> CompilePhaseT n u i e m ()+cpSetErrs es+ = modify (crSetErrs' Nothing "" es)++cpSetInfos :: CompileRunner s n p l u i e m => String -> Bool -> [e] -> CompilePhaseT n u i e m ()+cpSetInfos msg dp is+ = modify (crSetInfos' msg dp is)++cpSetFail :: CompileRunner s n p l u i e m => CompilePhaseT n u i e m ()+cpSetFail+ = modify crSetFail++cpSetStop :: CompileRunner s n p l u i e m => CompilePhaseT n u i e m ()+cpSetStop+ = modify crSetStop++cpSetStopSeq :: CompileRunner s n p l u i e m => CompilePhaseT n u i e m ()+cpSetStopSeq+ = modify crSetStopSeq++cpSetStopAllSeq :: CompileRunner s n p l u i e m => CompilePhaseT n u i e m ()+cpSetStopAllSeq+ = modify crSetStopAllSeq++cpSetOk :: CompileRunner s n p l u i e m => CompilePhaseT n u i e m ()+cpSetOk = crState =: CRSOk+ -- = modify (\cr -> (cr {_crState = CRSOk}))++cpSetCompileOrder :: CompileRunner s n p l u i e m => [[n]] -> CompilePhaseT n u i e m ()+cpSetCompileOrder nameLL = crCompileOrder =: nameLL+ -- = modify (\cr -> (cr {_crCompileOrder = nameLL}))++cpSetLimitErrs, cpSetLimitErrsWhen :: CompileRunner s n p l u i e m => Int -> String -> [e] -> CompilePhaseT n u i e m ()+cpSetLimitErrs l a e+ = modify (crSetErrs' (Just l) a e)++cpSetLimitErrsWhen l a e+ = do { when (not (null e))+ (cpSetLimitErrs l a e)+ }++cpEmpty :: CompileRunner s n p l u i e m => CompilePhaseT n u i e m ()+cpEmpty = return ()++-- sequence of phases, each may stop the whole sequencing+cpSeq :: CompileRunner s n p l u i e m => [CompilePhaseT n u i e m ()] -> CompilePhaseT n u i e m ()+cpSeq = sequence_+{-+-}+{-+cpSeq [] = return ()+cpSeq (a:as) = do { a+ ; cpHandleErr+ ; cr <- get+ ; case _crState cr of+ CRSOk -> cpSeq as+ CRSStopSeq -> cpSetOk+ CRSStopAllSeq -> cpSetStopAllSeq+ _ -> return ()+ }+-}++-- conditional sequence+cpSeqWhen :: CompileRunner s n p l u i e m => Bool -> [CompilePhaseT n u i e m ()] -> CompilePhaseT n u i e m ()+cpSeqWhen True as = cpSeq as+cpSeqWhen _ _ = return ()++-- handle possible error in sequence+{-+cpHandleErr :: CompileRunError e p => CompilePhase n u i e ()+cpHandleErr+ = do { cr <- get+ ; case _crState cr of+ CRSFailErrL about es (Just lim)+ -> do { let (showErrs,omitErrs) = splitAt lim es+ ; liftIO (unless (null about) (hPutPPLn stderr (pp about)))+ ; liftIO (putErr' (if null omitErrs then return () else hPutStrLn stderr "... and more errors") showErrs)+ ; failOrNot es+ }+ CRSFailErrL about es Nothing+ -> do { liftIO (unless (null about) (hPutPPLn stderr (pp about)))+ ; liftIO (putErr' (return ()) es)+ ; failOrNot es+ }+ CRSErrInfoL about doPrint is+ -> do { if null is+ then return ()+ else liftIO (do { hFlush stdout+ ; hPutPPLn stderr (about >#< "found errors" >-< e)+ })+ ; if not (null is) then liftIO exitFailure else return ()+ }+ where e = empty -- if doPrint then crePPErrL is else empty+ CRSFail+ -> do { liftIO exitFailure+ }+ CRSStop+ -> do { liftIO $ exitWith ExitSuccess+ }+ _ -> return ()+ }+ where putErr' m e = if null e+ then return ()+ else do { hPutPPLn stderr (crePPErrL e)+ ; m+ ; hFlush stderr+ }+ failOrNot es = if creAreFatal es then liftIO exitFailure else cpSetOk+-}+
src/UHC/Util/FPath.hs view
@@ -54,6 +54,7 @@ where import Data.Maybe+import Data.Typeable import Data.List import Control.Monad import System.IO@@ -111,7 +112,7 @@ , fpathBase :: !String , fpathMbSuff :: !(Maybe String) }- deriving (Show,Eq,Ord,Generic)+ deriving (Show,Eq,Ord,Typeable,Generic) -- | Empty FPath emptyFPath :: FPath@@ -374,7 +375,14 @@ searchFPathFromLoc :: FilePath -> FPath -> [(FilePath,FPath)] searchFPathFromLoc loc fp = [(loc,fpathPrependDir loc fp)] -searchLocationsForReadableFiles :: (loc -> FPath -> [(loc,FPath,[e])]) -> Bool -> [loc] -> FileSuffixes -> FPath -> IO [(FPath,loc,[e])]+-- | Search for file in locations, with possible suffices+searchLocationsForReadableFiles+ :: (loc -> FPath -> [(loc,FPath,[e])]) -- ^ get the locations for a name, possibly with errors+ -> Bool -- ^ stop when first is found+ -> [loc] -- ^ locations to search+ -> FileSuffixes -- ^ suffixes to try+ -> FPath -- ^ search for a path+ -> IO [(FPath,loc,[e])] searchLocationsForReadableFiles getfp stopAtFirst locs suffs fp = let select stop f fps = foldM chk [] fps
src/UHC/Util/Hashable.hs view
@@ -7,9 +7,17 @@ ) where -import Data.Hashable-import UHC.Util.FPath+import Data.Hashable+import qualified Data.Map as Map+import qualified Data.Set as Set+import UHC.Util.FPath -- Instances instance Hashable FPath++instance Hashable a => Hashable (Set.Set a) where+ hashWithSalt = Set.foldl' hashWithSalt++instance (Hashable a, Hashable b) => Hashable (Map.Map a b) where+ hashWithSalt = Map.foldlWithKey (\salt a b -> salt `hashWithSalt` a `hashWithSalt` b)
src/UHC/Util/Utils.hs view
@@ -29,10 +29,14 @@ , strWhite , strPad , strCapitalize+ , strToLower , strToInt , splitForQualified + -- * Show+ , showUnprefixedWithTypeable+ -- * Misc , panic @@ -62,7 +66,7 @@ -- * Graph , scc - -- * MOnad+ -- * Monad , firstMaybeM ) where@@ -70,6 +74,7 @@ -- import UHC.Util.Pretty import Data.Char import Data.List+import Data.Typeable import qualified Data.Set as Set import qualified Data.Map as Map import qualified Data.Graph as Graph@@ -213,9 +218,23 @@ (c:cs) -> toUpper c : cs _ -> s +-- | Lower case+strToLower :: String -> String+strToLower = map toLower+{-# INLINE strToLower #-}+ -- | Convert string to Int strToInt :: String -> Int strToInt = foldl (\i c -> i * 10 + ord c - ord '0') 0++-------------------------------------------------------------------------+-- Split for qualified name+-------------------------------------------------------------------------++-- | Show, additionally removing type name prefix, assuming constructor names are prefixed with type name, possibly with additional underscore (or something like that)+showUnprefixedWithTypeable :: (Show x, Typeable x) => Int -> x -> String+showUnprefixedWithTypeable extralen x = drop prelen $ show x+ where prelen = (length $ show $ typeOf x) + extralen ------------------------------------------------------------------------- -- Split for qualified name
uhc-util.cabal view
@@ -1,5 +1,5 @@ Name: uhc-util-Version: 0.1.5.6+Version: 0.1.6.0 cabal-version: >= 1.6 License: BSD3 Copyright: Utrecht University, Department of Information and Computing Sciences, Software Technology group@@ -43,6 +43,7 @@ UHC.Util.Binary, UHC.Util.CompileRun, UHC.Util.CompileRun2,+ UHC.Util.CompileRun3, UHC.Util.Control.Monad, UHC.Util.Debug, UHC.Util.DependencyGraph,@@ -68,4 +69,4 @@ Ghc-Options: HS-Source-Dirs: src Build-Tools: - Extensions: NoMagicHash, DeriveGeneric+ Extensions: NoMagicHash, DeriveGeneric, DeriveDataTypeable