@@ -51,26 +51,27 @@ module Language.Fortran.Util.ModFile
51
51
, genModFile , regenModFile , encodeModFile , decodeModFile
52
52
, StringMap , DeclMap , ParamVarMap , DeclContext (.. ), extractModuleMap , extractDeclMap
53
53
, moduleFilename , combinedStringMap , combinedDeclMap , combinedModuleMap , combinedTypeEnv , combinedParamVarMap
54
- , genUniqNameToFilenameMap )
54
+ , genUniqNameToFilenameMap
55
+ , TimestampStatus (.. ), checkTimestamps )
55
56
where
56
57
58
+ import Control.Monad.State
59
+ import Data.Binary (Binary , encode , decodeOrFail )
60
+ import qualified Data.ByteString.Lazy.Char8 as LB
57
61
import Data.Data
58
- import Data.Maybe
59
62
import Data.Generics.Uniplate.Operations
60
63
import qualified Data.Map.Strict as M
61
- import Data.Binary (Binary , encode , decodeOrFail )
62
- import Control.Monad.State
64
+ import Data.Maybe
63
65
import GHC.Generics (Generic )
64
- -- import qualified Data.ByteString.Char8 as B
65
- import qualified Data.ByteString.Lazy.Char8 as LB
66
-
67
- import qualified Language.Fortran.Util.Position as P
68
66
import qualified Language.Fortran.AST as F
69
67
import qualified Language.Fortran.Analysis as FA
68
+ import qualified Language.Fortran.Analysis.BBlocks as FAB
69
+ import qualified Language.Fortran.Analysis.DataFlow as FAD
70
70
import qualified Language.Fortran.Analysis.Renaming as FAR
71
71
import qualified Language.Fortran.Analysis.Types as FAT
72
- import qualified Language.Fortran.Analysis.DataFlow as FAD
73
- import qualified Language.Fortran.Analysis.BBlocks as FAB
72
+ import qualified Language.Fortran.Util.Position as P
73
+ import System.Directory
74
+ import System.FilePath
74
75
75
76
--------------------------------------------------
76
77
@@ -304,3 +305,23 @@ extractParamVarMap pf = M.fromList cvm
304
305
, st@ F. StParameter {} <- universeBi bs :: [F. Statement (FA. Analysis a )]
305
306
, (F. DeclVariable _ _ v _ _) <- universeBi st :: [F. Declarator (FA. Analysis a )]
306
307
, Just con <- [FA. constExp (F. getAnnotation v)] ]
308
+
309
+ -- | Status of mod-file compared to Fortran file.
310
+ data TimestampStatus = NoSuchFile | CompileFile | ModFileExists FilePath
311
+
312
+ -- | Compare the source file timestamp to the fsmod file timestamp, if
313
+ -- it exists.
314
+ checkTimestamps :: FilePath -> IO TimestampStatus
315
+ checkTimestamps path = do
316
+ pathExists <- doesFileExist path
317
+ modExists <- doesFileExist $ path -<.> modFileSuffix
318
+ case (pathExists, modExists) of
319
+ (False , _) -> pure NoSuchFile
320
+ (True , False ) -> pure CompileFile
321
+ (True , True ) -> do
322
+ let modPath = path -<.> modFileSuffix
323
+ pathModTime <- getModificationTime path
324
+ modModTime <- getModificationTime modPath
325
+ if pathModTime < modModTime
326
+ then pure $ ModFileExists modPath
327
+ else pure CompileFile
0 commit comments