uhc-light-1.1.8.10: src/UHC/Light/Compiler/EHC/CompileUnit.hs
{-# LANGUAGE TemplateHaskell #-}
module UHC.Light.Compiler.EHC.CompileUnit
( EHCompileUnit (..)
, ecuASTType, ecuASTFileContent, ecuASTFileUse
, ecuMbCore, ecuCore, ecuMbCoreSem, ecuCoreSem
, ecuMbCore2CoreRunSem, ecuMbCoreRun, ecuCoreRun
, ecuMbCoreSemMod, ecuCoreSemMod
, ecuMbCoreRunSemMod, ecuCoreRunSemMod
, ecuMbHS, ecuHS, ecuMbHSSem, ecuHSSem, ecuMbEH, ecuEH, ecuMbEHSem, ecuEHSem
, ecuFilePath
, emptyECU
, ecuFinalDestinationState
, EcuUpdater, ecuStoreSrcFilePath, ecuStoreState, ecuStoreHS, ecuStoreEH, ecuStoreHSSem, ecuStoreEHSem
, ecuStoreCoreSemMod
, ecuStoreCoreSem
, ecuStoreCore
, ecuStoreCoreRun
, ecuStoreCoreRunSemMod
, ecuStoreCore2CoreRunSem
, ecuSrcHasSuffix
, Optim (..), defaultOptim
, ecuMbCoreTime, ecuCoreTime
, ecuMbCoreRunTime, ecuCoreRunTime
, ecuMbHIInfo, ecuHIInfo, ecuMbPrevHIInfo, ecuPrevHIInfo, ecuMbHSSemMod, ecuHSSemMod, ecuMbSrcTime, ecuSrcTime, ecuMbHIInfoTime, ecuHIInfoTime
, ecuHSDeclImpNmS, ecuHIDeclImpNmS, ecuHIUsedImpNmS
, ecuIsMainMod
, ecuImpNmS, ecuImpNmL
, ecuTransClosedUsedModMp, ecuTransClosedOrphanModS
, ecuIsOrphan
, ecuStoreHSDeclImpS, ecuSetNeedsCompile, ecuStoreHIUsedImpS, ecuStoreHIInfoTime, ecuStoreSrcTime, ecuStoreHSSemMod, ecuStoreIntrodModS, ecuStoreHIDeclImpS, ecuStoreMod, ecuSetIsTopMod, ecuSetHasMain, ecuStoreOptim, ecuStoreHIInfo, ecuStorePrevHIInfo
, ecuStoreCoreTime
, ecuStoreCoreRunTime
, ecuStoreDirIsWritable
, ecuIsHSNewerThanHI
, ecuIsValidHIInfo
, ecuCanUseHIInsteadOfHS
, ecuCanCompile
, EHCCompileSeqNr (..)
, ecuMbPrevSearchInfo, ecuPrevSearchInfo
, ecuAnHIInfo
, ecuStoreOpts, ecuStorePragmas, ecuStoreUsedNames, ecuSetTarget
, ecuStoreGenCodeFiles
, ecuStoreCppFilePath, ecuStoreSeqNr )
where
import qualified Data.Map as Map
import qualified Data.Set as Set
import UHC.Light.Compiler.EHC.Common
import UHC.Util.Lens
import Data.Typeable
import qualified UHC.Light.Compiler.HS as HS
import qualified UHC.Light.Compiler.EH as EH
import qualified UHC.Light.Compiler.Core as Core
import qualified UHC.Light.Compiler.CoreRun as CoreRun
import qualified UHC.Light.Compiler.EH.MainAG as EHSem
import qualified UHC.Light.Compiler.HS.MainAG as HSSem
import qualified UHC.Light.Compiler.Core.ToGrin as Core2GrSem
import qualified UHC.Light.Compiler.Core.ToCoreRun as Core2CoreRunSem
import qualified UHC.Light.Compiler.Core.Check as Core2ChkSem
import qualified UHC.Light.Compiler.CoreRun.Check as CoreRun2ChkSem
import qualified UHC.Light.Compiler.HI as HI
import qualified UHC.Light.Compiler.HS.ModImpExp as HSSemMod
import UHC.Light.Compiler.Module.ImportExport
import UHC.Light.Compiler.CodeGen.ImportUsedModules
import UHC.Util.Time
import System.Directory
import qualified UHC.Light.Compiler.Base.Pragma as Pragma
import UHC.Light.Compiler.Base.Target
import UHC.Util.Debug
{-# LINE 88 "src/ehc/EHC/CompileUnit.chs" #-}
data Optim
= Optim
defaultOptim :: Optim
defaultOptim
= Optim
{-# LINE 111 "src/ehc/EHC/CompileUnit.chs" #-}
data EHCCompileSeqNr
= EHCCompileSeqNr
{ ecseqnrThis :: !Int
, ecseqnrTotal :: !Int
}
deriving (Eq,Ord)
zeroEHCCompileSeqNr :: EHCCompileSeqNr
zeroEHCCompileSeqNr = EHCCompileSeqNr 0 0
instance Show EHCCompileSeqNr where
show (EHCCompileSeqNr this total)
= "[" ++ replicate (length tot - length ths) ' ' ++ ths ++ "/" ++ tot ++ "]"
where tot = show total
ths = show this
{-# LINE 133 "src/ehc/EHC/CompileUnit.chs" #-}
-- | Single compilation unit info, fields prefixed with _ have Lens access
data EHCompileUnit
= EHCompileUnit
{ ecuSrcFilePath :: !FPath
, ecuMbCppFilePath :: !(Maybe FPath)
, _ecuMbPrevSearchInfo :: !(Maybe PrevSearchInfo)
, ecuFileLocation :: !FileLoc
, ecuGrpNm :: !HsName
, ecuModNm :: !HsName
, _ecuMbHS :: !(Maybe HS.AGItf)
, _ecuMbHSSem :: !(Maybe HSSem.Syn_AGItf)
, _ecuMbEH :: !(Maybe EH.AGItf)
, _ecuMbEHSem :: !(Maybe EHSem.Syn_AGItf)
, _ecuMbCore :: !(Maybe Core.CModule)
, _ecuMbCoreSem :: !(Maybe Core2GrSem.Syn_CodeAGItf)
, _ecuMbCore2CoreRunSem:: !(Maybe Core2CoreRunSem.Syn_CodeAGItf)
, _ecuMbCoreSemMod :: !(Maybe Core2ChkSem.Syn_CodeAGItf)
, _ecuMbCoreRun :: !(Maybe CoreRun.Mod)
, _ecuMbCoreRunSemMod :: !(Maybe CoreRun2ChkSem.Syn_AGItf)
, ecuState :: !EHCompileUnitState
, _ecuASTType :: !ASTType
, _ecuASTFileContent :: !ASTFileContent
, _ecuASTFileUse :: !ASTFileUse
, ecuImportUsedModules :: !ImportUsedModules -- imported modules info
, ecuIsTopMod :: !Bool -- module has been specified for compilation on commandline
, ecuHasMain :: !Bool -- has a def for 'main'?
, ecuNeedsCompile :: !Bool -- (re)compilation from .hs needed?
, _ecuMbSrcTime :: !(Maybe ClockTime) -- timestamp of possibly absent source (hs, or other type) file
, _ecuMbHIInfoTime :: !(Maybe ClockTime) -- timestamp of possibly previously generated hi file
, _ecuMbCoreTime :: !(Maybe ClockTime) -- timestamp of possibly previously generated core file
, _ecuMbCoreRunTime :: !(Maybe ClockTime) -- timestamp of possibly previously generated corerun file
, _ecuMbHSSemMod :: !(Maybe HSSemMod.Syn_AGItf)
, ecuMod :: !Mod -- import/export info of module
, _ecuMbPrevHIInfo :: !(Maybe HI.HIInfo) -- possible HI info of previous run
, ecuMbOptim :: !(Maybe Optim)
, _ecuMbHIInfo :: !(Maybe HI.HIInfo) -- HI info of module
, ecuDirIsWritable :: !Bool -- can be written in dir of module?
, ecuMbOpts :: (Maybe EHCOpts) -- possibly per module adaption of options (caused by pragmas)
, ecuTarget :: Target -- target for which we compile
, ecuPragmas :: !(Set.Set Pragma.Pragma) -- pragmas of module
, ecuUsedNames :: ModEntRelFilterMp -- map holding actually used names, to later filter cache of imported hi's to be included in this module's hi
, ecuSeqNr :: !EHCCompileSeqNr -- sequence nr of sorted compilation
, ecuGenCodeFiles :: ![FPath] -- generated code files
}
deriving Typeable
{-# LINE 225 "src/ehc/EHC/CompileUnit.chs" #-}
mkLabel ''EHCompileUnit
{-# LINE 232 "src/ehc/EHC/CompileUnit.chs" #-}
ecuCore = isoMb "ecuMbCore" ecuMbCore
ecuCoreSem = isoMb "ecuMbCoreSem" ecuMbCoreSem
{-# LINE 236 "src/ehc/EHC/CompileUnit.chs" #-}
ecuCoreTime = isoMb "ecuMbCoreTime" ecuMbCoreTime
{-# LINE 248 "src/ehc/EHC/CompileUnit.chs" #-}
ecuCoreRun = isoMb "ecuMbCoreRun" ecuMbCoreRun
{-# LINE 251 "src/ehc/EHC/CompileUnit.chs" #-}
ecuCoreRunTime = isoMb "ecuMbCoreRunTime" ecuMbCoreRunTime
{-# LINE 254 "src/ehc/EHC/CompileUnit.chs" #-}
ecuCoreSemMod = isoMb "ecuMbCoreSemMod" ecuMbCoreSemMod
{-# LINE 257 "src/ehc/EHC/CompileUnit.chs" #-}
ecuCoreRunSemMod = isoMb "ecuMbCoreRunSemMod" ecuMbCoreRunSemMod
{-# LINE 261 "src/ehc/EHC/CompileUnit.chs" #-}
ecuEH = isoMb "ecuMbEH" ecuMbEH
ecuEHSem = isoMb "ecuMbEHSem" ecuMbEHSem
ecuHS = isoMb "ecuMbHS" ecuMbHS
ecuHSSem = isoMb "ecuMbHSSem" ecuMbHSSem
{-# LINE 268 "src/ehc/EHC/CompileUnit.chs" #-}
ecuHIInfo = isoMbWithDefault HI.emptyHIInfo ecuMbHIInfo
ecuPrevHIInfo = isoMb "ecuMbPrevHIInfo" ecuMbPrevHIInfo
ecuHSSemMod = isoMb "ecuMbHSSemMod" ecuMbHSSemMod
ecuSrcTime = isoMb "ecuMbSrcTime" ecuMbSrcTime
ecuHIInfoTime = isoMb "ecuMbHIInfoTime" ecuMbHIInfoTime
{-# LINE 276 "src/ehc/EHC/CompileUnit.chs" #-}
ecuPrevSearchInfo = isoMb "ecuMbPrevSearchInfo" ecuMbPrevSearchInfo
{-# LINE 280 "src/ehc/EHC/CompileUnit.chs" #-}
ecuHSDeclImpNmS = iumHSDeclModules . ecuImportUsedModules
ecuHIDeclImpNmS = iumHIDeclModules . ecuImportUsedModules
ecuHIUsedImpNmS = iumHIUsedModules . ecuImportUsedModules
{-# LINE 286 "src/ehc/EHC/CompileUnit.chs" #-}
ecuFilePath :: EHCompileUnit -> FPath
ecuFilePath ecu
= maybe (ecuSrcFilePath ecu) id (ecuMbCppFilePath ecu)
{-# LINE 296 "src/ehc/EHC/CompileUnit.chs" #-}
ecuIsMainMod :: EHCompileUnit -> Bool
ecuIsMainMod e = ecuIsTopMod e && ecuHasMain e
{-# LINE 301 "src/ehc/EHC/CompileUnit.chs" #-}
-- | give the current value HIInfo, or the previous one
ecuAnHIInfo :: EHCompileUnit -> HI.HIInfo
ecuAnHIInfo e
= case _ecuMbPrevHIInfo e of
Just pi | HI.hiiIsEmpty hii
-> pi
_ -> hii
where hii = e ^. ecuHIInfo
{-# LINE 312 "src/ehc/EHC/CompileUnit.chs" #-}
emptyECU :: EHCompileUnit
emptyECU
= EHCompileUnit
{ ecuSrcFilePath = emptyFPath
, ecuMbCppFilePath = Nothing
, _ecuMbPrevSearchInfo = Nothing
, ecuFileLocation = emptyFileLoc
, ecuGrpNm = hsnUnknown
, ecuModNm = hsnUnknown
, _ecuMbHS = Nothing
, _ecuMbHSSem = Nothing
, _ecuMbEH = Nothing
, _ecuMbEHSem = Nothing
, _ecuMbCore = Nothing
, _ecuMbCoreSem = Nothing
, _ecuMbCore2CoreRunSem= Nothing
, _ecuMbCoreSemMod = Nothing
, _ecuMbCoreRun = Nothing
, _ecuMbCoreRunSemMod = Nothing
, ecuState = ECUS_Unknown
, _ecuASTType = ASTType_Unknown
, _ecuASTFileContent = ASTFileContent_Unknown
, _ecuASTFileUse = ASTFileUse_Unknown
, ecuImportUsedModules = emptyImportUsedModules
, ecuIsTopMod = False
, ecuHasMain = False
, ecuNeedsCompile = True
, _ecuMbSrcTime = Nothing
, _ecuMbHIInfoTime = Nothing
, _ecuMbCoreTime = Nothing
, _ecuMbCoreRunTime = Nothing
, _ecuMbHSSemMod = Nothing
, ecuMod = emptyMod
, _ecuMbPrevHIInfo = Nothing
, ecuMbOptim = Nothing
, _ecuMbHIInfo = Nothing
, ecuDirIsWritable = False
, ecuMbOpts = Nothing
, ecuTarget = defaultTarget
, ecuPragmas = Set.empty
, ecuUsedNames = Map.empty
, ecuSeqNr = zeroEHCCompileSeqNr
, ecuGenCodeFiles = []
}
{-# LINE 405 "src/ehc/EHC/CompileUnit.chs" #-}
ecuImpNmS :: EHCompileUnit -> Set.Set HsName
ecuImpNmS ecu = -- (\v -> tr "XX" (pp $ Set.toList v) v) $
Set.delete (ecuModNm ecu) $ Set.unions [ ecuHSDeclImpNmS ecu, ecuHIDeclImpNmS ecu, ecuHIUsedImpNmS ecu ]
ecuImpNmL :: EHCompileUnit -> [HsName]
ecuImpNmL = Set.toList . ecuImpNmS -- ecu = (nub $ ecuHSDeclImpNmL ecu ++ ecuHIDeclImpNmL ecu ++ ecuHIUsedImpNmL ecu) \\ [ecuModNm ecu]
{-# LINE 414 "src/ehc/EHC/CompileUnit.chs" #-}
-- | The used modules, for linking, according to .hi info
ecuTransClosedUsedModMp :: EHCompileUnit -> HI.HIInfoUsedModMp
ecuTransClosedUsedModMp = HI.hiiTransClosedUsedModMp . ecuAnHIInfo
-- | The orphan modules, must be .hi read, according to .hi info
ecuTransClosedOrphanModS :: EHCompileUnit -> Set.Set HsName
ecuTransClosedOrphanModS = HI.hiiTransClosedOrphanModS . ecuAnHIInfo
{-# LINE 424 "src/ehc/EHC/CompileUnit.chs" #-}
-- | Is orphan, according to .hi info
ecuIsOrphan :: EHCompileUnit -> Bool
ecuIsOrphan = isJust . HI.hiiMbOrphan . ecuAnHIInfo
{-# LINE 444 "src/ehc/EHC/CompileUnit.chs" #-}
instance CompileUnitState FileSuffInitState where
cusDefault = (ECUS_Eh EHStart, ASTType_EH, ASTFileContent_Text, ASTFileUse_Src)
cusUnk = (ECUS_Unknown, ASTType_Unknown, ASTFileContent_Unknown, ASTFileUse_Unknown)
cusIsUnk (ECUS_Unknown,_,_,_) = True
cusIsUnk _ = False
{-# LINE 454 "src/ehc/EHC/CompileUnit.chs" #-}
cusIsImpKnown (s,_,_,_) = case s of
ECUS_Haskell HSOnlyImports -> True
ECUS_Haskell HIOnlyImports -> True
ECUS_Haskell HMOnlyMinimal -> True
ECUS_Haskell LHSOnlyImports -> True
ECUS_Haskell HSAllSem -> True
ECUS_Haskell HIAllSem -> True
ECUS_Core CROnlyImports -> True
ECUS_CoreRun CRROnlyImports -> True
_ -> False
{-# LINE 473 "src/ehc/EHC/CompileUnit.chs" #-}
instance FileLocatable EHCompileUnit FileLoc where
fileLocation = ecuFileLocation
noFileLocation = emptyFileLoc
{-# LINE 479 "src/ehc/EHC/CompileUnit.chs" #-}
instance CompileUnit EHCompileUnit HsName FileLoc FileSuffInitState where
cuDefault = emptyECU
cuFPath = ecuFilePath
cuLocation = fileLocation
cuKey = ecuModNm
cuState u = (ecuState u, _ecuASTType u, _ecuASTFileContent u, _ecuASTFileUse u)
cuUpdFPath = ecuStoreSrcFilePath
cuUpdLocation = ecuStoreFileLocation
cuUpdState (s,t,c,u) = ecuStoreState s . (ecuASTType ^= t) . (ecuASTFileContent ^= c) . (ecuASTFileUse ^= u)
cuUpdKey nm u = u {ecuModNm = nm}
cuImports = ecuImpNmL
cuParticipation u = if not (Set.null $ Set.filter (Pragma.pragmaIsExcludeTarget $ ecuTarget u) $ ecuPragmas u)
then [CompileParticipation_NoImport]
else []
-- instance FPathError Err
instance CompileRunError Err () where
crePPErrL = ppErrL
creMkNotFoundErrL _ fp sp sufs = [rngLift emptyRange Err_FileNotFound fp sp sufs]
creAreFatal = errLIsFatal
instance CompileModName HsName where
mkCMNm = hsnFromString
instance Show EHCompileUnit where
show _ = "EHCompileUnit"
instance PP EHCompileUnit where
pp ecu
= ecuModNm ecu >|<
":" >#< ppBracketsCommas (ecuImpNmL ecu) >|<
"," >#< show (ecuState ecu)
{-# LINE 525 "src/ehc/EHC/CompileUnit.chs" #-}
-- | The final state to be reached
ecuFinalDestinationState :: EHCompileUnit -> EHCompileUnitState
ecuFinalDestinationState ecu = ecuStateFinalDestination upd $ ecuState ecu
where
upd (ECUS_Haskell _)
| ecuNeedsCompile ecu = ECUS_Haskell HSAllSem
| otherwise = ECUS_Haskell HIAllSem
upd s = s
{-# LINE 542 "src/ehc/EHC/CompileUnit.chs" #-}
type EcuUpdater a = a -> EHCompileUnit -> EHCompileUnit
ecuStoreSrcFilePath :: EcuUpdater FPath
ecuStoreSrcFilePath x ecu = ecu { ecuSrcFilePath = x }
ecuStoreFileLocation :: EcuUpdater FileLoc
ecuStoreFileLocation x ecu = ecu { ecuFileLocation = x }
ecuStoreState :: EcuUpdater EHCompileUnitState
ecuStoreState x ecu = ecu { ecuState = x }
ecuStoreHS :: EcuUpdater HS.AGItf
ecuStoreHS x ecu = ecu { _ecuMbHS = Just x }
ecuStoreEH :: EcuUpdater EH.AGItf
ecuStoreEH x ecu = ecu { _ecuMbEH = Just x }
ecuStoreHSSem :: EcuUpdater HSSem.Syn_AGItf
ecuStoreHSSem x ecu = ecu { _ecuMbHSSem = Just x }
ecuStoreEHSem :: EcuUpdater EHSem.Syn_AGItf
ecuStoreEHSem x ecu = ecu { _ecuMbEHSem = Just x }
{-# LINE 567 "src/ehc/EHC/CompileUnit.chs" #-}
ecuStoreCoreSemMod :: EcuUpdater Core2ChkSem.Syn_CodeAGItf
ecuStoreCoreSemMod x ecu = ecu { _ecuMbCoreSemMod = Just x }
{-# LINE 572 "src/ehc/EHC/CompileUnit.chs" #-}
ecuStoreCoreSem :: EcuUpdater Core2GrSem.Syn_CodeAGItf
ecuStoreCoreSem x ecu = ecu { _ecuMbCoreSem = Just x }
{-# LINE 577 "src/ehc/EHC/CompileUnit.chs" #-}
ecuStoreCore :: EcuUpdater Core.CModule
ecuStoreCore x ecu | x `seq` True = ecu { _ecuMbCore = Just x }
{-# LINE 588 "src/ehc/EHC/CompileUnit.chs" #-}
ecuStoreCoreRun :: EcuUpdater CoreRun.Mod
ecuStoreCoreRun x ecu | x `seq` True = ecu { _ecuMbCoreRun = Just x }
{-# LINE 593 "src/ehc/EHC/CompileUnit.chs" #-}
ecuStoreCoreRunSemMod :: EcuUpdater CoreRun2ChkSem.Syn_AGItf
ecuStoreCoreRunSemMod x ecu = ecu { _ecuMbCoreRunSemMod = Just x }
{-# LINE 598 "src/ehc/EHC/CompileUnit.chs" #-}
ecuStoreCore2CoreRunSem :: EcuUpdater Core2CoreRunSem.Syn_CodeAGItf
ecuStoreCore2CoreRunSem x ecu = ecu { _ecuMbCore2CoreRunSem = Just x }
{-# LINE 649 "src/ehc/EHC/CompileUnit.chs" #-}
ecuStoreSrcTime :: EcuUpdater ClockTime
ecuStoreSrcTime x ecu = ecu { _ecuMbSrcTime = Just x }
-- ecuStoreHITime :: EcuUpdater ClockTime
-- ecuStoreHITime x ecu = ecu { ecuMbHITime = Just x }
ecuStoreHIInfoTime :: EcuUpdater ClockTime
ecuStoreHIInfoTime x ecu = ecu { _ecuMbHIInfoTime = Just x }
ecuStoreHSSemMod :: EcuUpdater HSSemMod.Syn_AGItf
ecuStoreHSSemMod x ecu = ecu { _ecuMbHSSemMod = Just x }
ecuStoreHSDeclImpS :: EcuUpdater (Set.Set HsName)
ecuStoreHSDeclImpS x ecu = ecu { ecuImportUsedModules = ium {iumHSDeclModules = x} }
where ium = ecuImportUsedModules ecu
ecuStoreHIDeclImpS :: EcuUpdater (Set.Set HsName)
ecuStoreHIDeclImpS x ecu = ecu { ecuImportUsedModules = ium {iumHIDeclModules = x} }
where ium = ecuImportUsedModules ecu
ecuStoreHIUsedImpS :: EcuUpdater (Set.Set HsName)
ecuStoreHIUsedImpS x ecu = ecu { ecuImportUsedModules = ium {iumHIUsedModules = x} }
where ium = ecuImportUsedModules ecu
ecuStoreIntrodModS :: EcuUpdater (Set.Set HsName)
ecuStoreIntrodModS x ecu = ecu { ecuImportUsedModules = ium {iumIntrodModules = x} }
where ium = ecuImportUsedModules ecu
ecuStoreMod :: EcuUpdater Mod
ecuStoreMod x ecu = ecu { ecuMod = x }
ecuSetIsTopMod :: EcuUpdater Bool
ecuSetIsTopMod x ecu = ecu { ecuIsTopMod = x }
ecuSetHasMain :: EcuUpdater Bool
ecuSetHasMain x ecu = ecu { ecuHasMain = x }
ecuSetNeedsCompile :: EcuUpdater Bool
ecuSetNeedsCompile x ecu = ecu { ecuNeedsCompile = x }
-- ecuStorePrevHI :: EcuUpdater HI.AGItf
-- ecuStorePrevHI x ecu = ecu { ecuMbPrevHI = Just x }
-- ecuStorePrevHISem :: EcuUpdater HISem.Syn_AGItf
-- ecuStorePrevHISem x ecu = ecu { ecuMbPrevHISem = Just x }
ecuStorePrevHIInfo :: EcuUpdater HI.HIInfo
ecuStorePrevHIInfo x ecu = ecu { _ecuMbPrevHIInfo = Just x }
ecuStoreOptim :: EcuUpdater Optim
ecuStoreOptim x ecu = ecu { ecuMbOptim = Just x }
ecuStoreHIInfo :: EcuUpdater HI.HIInfo
ecuStoreHIInfo x ecu | x `seq` True = ecu { _ecuMbHIInfo = Just x }
{-# LINE 710 "src/ehc/EHC/CompileUnit.chs" #-}
ecuStoreCoreTime :: EcuUpdater ClockTime
ecuStoreCoreTime x ecu = ecu { _ecuMbCoreTime = Just x }
{-# LINE 715 "src/ehc/EHC/CompileUnit.chs" #-}
ecuStoreCoreRunTime :: EcuUpdater ClockTime
ecuStoreCoreRunTime x ecu = ecu { _ecuMbCoreRunTime = Just x }
{-# LINE 725 "src/ehc/EHC/CompileUnit.chs" #-}
ecuStoreDirIsWritable :: EcuUpdater Bool
ecuStoreDirIsWritable x ecu = ecu { ecuDirIsWritable = x }
{-# LINE 730 "src/ehc/EHC/CompileUnit.chs" #-}
ecuStoreOpts :: EcuUpdater EHCOpts
ecuStoreOpts x ecu = ecu { ecuMbOpts = Just x }
ecuSetTarget :: EcuUpdater Target
ecuSetTarget x ecu = ecu { ecuTarget = x }
ecuStorePragmas :: EcuUpdater (Set.Set Pragma.Pragma)
ecuStorePragmas x ecu = ecu { ecuPragmas = x }
ecuStoreUsedNames :: EcuUpdater ModEntRelFilterMp
ecuStoreUsedNames x ecu = ecu { ecuUsedNames = x }
{-# LINE 744 "src/ehc/EHC/CompileUnit.chs" #-}
ecuStoreGenCodeFiles :: EcuUpdater [FPath]
ecuStoreGenCodeFiles x ecu = ecu { ecuGenCodeFiles = x }
{-# LINE 749 "src/ehc/EHC/CompileUnit.chs" #-}
ecuStoreSeqNr :: EcuUpdater EHCCompileSeqNr
ecuStoreSeqNr x ecu = ecu { ecuSeqNr = x }
ecuStoreCppFilePath :: EcuUpdater FPath
ecuStoreCppFilePath x ecu = ecu { ecuMbCppFilePath = Just x }
{-# LINE 761 "src/ehc/EHC/CompileUnit.chs" #-}
-- | Has the source file the given extension? Given suffix is stripped from possible prefixed '.'.
ecuSrcHasSuffix :: String -> EHCompileUnit -> Bool
ecuSrcHasSuffix suff ecu
= maybe False (==suff') $ fpathMbSuff $ ecuSrcFilePath ecu
where suff' = case suff of {('.':s) -> s; _ -> suff}
{-# LINE 769 "src/ehc/EHC/CompileUnit.chs" #-}
-- | Is HS newer?
-- If no HS exists False is returned.
ecuIsHSNewerThanHI :: EHCompileUnit -> Bool
ecuIsHSNewerThanHI ecu
= case (_ecuMbSrcTime ecu,_ecuMbHIInfoTime ecu) of
(Just ths,Just thi) -> ths `diffClockTimes` thi > noTimeDiff
(Nothing ,Just thi) -> False
_ -> True
{-# LINE 788 "src/ehc/EHC/CompileUnit.chs" #-}
ecuIsValidHIInfo :: EHCompileUnit -> Bool
ecuIsValidHIInfo ecu
= case _ecuMbPrevHIInfo ecu of
Just i -> HI.hiiValidity i == HI.HIValidity_Ok
_ -> False
{-# LINE 796 "src/ehc/EHC/CompileUnit.chs" #-}
-- | Can HI be used instead of HS?
-- This is purely based on HI being of the right version and HS not newer.
-- The need for recompilation considers dependencies on imports as well.
ecuCanUseHIInsteadOfHS :: EHCompileUnit -> Bool
ecuCanUseHIInsteadOfHS ecu
= ecuIsValidHIInfo ecu && not (ecuIsHSNewerThanHI ecu)
{-# LINE 805 "src/ehc/EHC/CompileUnit.chs" #-}
-- | Compilation can actually be done?
ecuCanCompile :: EHCompileUnit -> Bool
ecuCanCompile ecu = isJust (_ecuMbSrcTime ecu) && ecuDirIsWritable ecu