{-# 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