Skip to content

Commit 3c2ddf1

Browse files
committed
clean up ModFile module, expose decodeModFiles
1 parent a78ce84 commit 3c2ddf1

File tree

4 files changed

+68
-56
lines changed

4 files changed

+68
-56
lines changed

CHANGELOG.md

+2
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
* The Happy parsers have fewer dependencies, so should no longer require a
77
recompile due to apparently unrelated changes.
88
* Remove some deprecated shims (from the restructured modules).
9+
* Merge fortran-src-extras `Language.Fortran.Extras.ModFiles.Extras` module
10+
into `Language.Fortran.Util.ModFile`.
911

1012
### 0.8.0 (Jan 04, 2022)
1113
* Merge declarator constructors. Now you differentiate between array and

app/Main.hs

+4-13
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ main = do
6666
-- Build the graph of module dependencies
6767
mg0 <- genModGraph mvers (includeDirs opts) paths'
6868
-- Start the list of mods with those from the command line
69-
mods0 <- decodeModFiles $ includeDirs opts
69+
mods0 <- decodeModFiles' $ includeDirs opts
7070
-- Loop through the dependency graph until it is empty
7171
let loop mg mods
7272
| nxt <- takeNextMods mg
@@ -98,11 +98,11 @@ main = do
9898
Just f -> LB.writeFile f $ encodeModFile allMods
9999

100100
(paths, Compile) -> do
101-
mods <- decodeModFiles $ includeDirs opts
101+
mods <- decodeModFiles' $ includeDirs opts
102102
mapM_ (\ p -> compileFileToMod (fortranVersion opts) mods p (outputFile opts)) paths
103103
(path:_, actionOpt) -> do
104104
contents <- flexReadFile path
105-
mods <- decodeModFiles $ includeDirs opts
105+
mods <- decodeModFiles' $ includeDirs opts
106106
let version = fromMaybe (deduceFortranVersion path) (fortranVersion opts)
107107
parsedPF = fromRight' $ (Parser.byVerWithMods mods version) path contents
108108
outfmt = outputFormat opts
@@ -250,13 +250,6 @@ compileFileToMod mvers mods path moutfile = do
250250
LB.writeFile fspath $ encodeModFile [mod]
251251
return mod
252252

253-
decodeModFiles :: [String] -> IO ModFiles
254-
decodeModFiles = flip foldM emptyModFiles $ \ modFiles d -> do
255-
-- Figure out the camfort mod files and parse them.
256-
modFileNames <- filter isModFile `fmap` getDirContents d
257-
addedModFiles <- concat <$> mapM (decodeOneModFile . (d </>)) modFileNames
258-
return $ addedModFiles ++ modFiles
259-
260253
decodeOneModFile :: FilePath -> IO ModFiles
261254
decodeOneModFile path = do
262255
contents <- LB.readFile path
@@ -268,9 +261,7 @@ decodeOneModFile path = do
268261
hPutStrLn stderr $ path ++ ": successfully parsed summary file."
269262
return modFiles
270263

271-
isModFile :: FilePath -> Bool
272-
isModFile = (== modFileSuffix) . takeExtension
273-
264+
-- TODO almost replicated at Analysis.DataFlow.showDataFlow
274265
superGraphDataFlow :: forall a. (Out a, Data a) => ProgramFile (Analysis a) -> SuperBBGr (Analysis a) -> String
275266
superGraphDataFlow pf sgr = showBBGr (bbgrMap (nmap (map (fmap insLabel))) gr') ++ "\n\n" ++ replicate 50 '-' ++ "\n\n" ++
276267
show entries ++ "\n\n" ++ replicate 50 '-' ++ "\n\n" ++

src/Language/Fortran/Analysis/ModGraph.hs

-24
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,7 @@ import Data.Generics.Uniplate.Data
1919
import Data.Graph.Inductive hiding (version)
2020
import Data.Maybe
2121
import Data.Either.Combinators ( fromRight' )
22-
import qualified Data.ByteString.Lazy.Char8 as LB
2322
import qualified Data.Map as M
24-
import System.IO
25-
import System.FilePath
2623

2724
--------------------------------------------------
2825

@@ -124,24 +121,3 @@ delModNodes :: [Node] -> ModGraph -> ModGraph
124121
delModNodes ns mg@ModGraph { mgGraph = gr } = mg'
125122
where
126123
mg' = mg { mgGraph = delNodes ns gr }
127-
128-
--------------------------------------------------
129-
130-
decodeModFiles :: [FilePath] -> IO [(FilePath, ModFile)]
131-
decodeModFiles = foldM (\ modFiles d -> do
132-
-- Figure out the camfort mod files and parse them.
133-
modFileNames <- filter isModFile `fmap` getDirContents d
134-
addedModFiles <- fmap concat . forM modFileNames $ \ modFileName -> do
135-
contents <- LB.readFile (d </> modFileName)
136-
case decodeModFile contents of
137-
Left msg -> do
138-
hPutStrLn stderr $ modFileName ++ ": Error: " ++ msg
139-
return [(modFileName, emptyModFile)]
140-
Right mods -> do
141-
hPutStrLn stderr $ modFileName ++ ": successfully parsed precompiled file."
142-
return $ map (modFileName,) mods
143-
return $ addedModFiles ++ modFiles
144-
) [] -- can't use emptyModFiles
145-
146-
isModFile :: FilePath -> Bool
147-
isModFile = (== modFileSuffix) . takeExtension

src/Language/Fortran/Util/ModFile.hs

+62-19
Original file line numberDiff line numberDiff line change
@@ -42,14 +42,35 @@ One typical usage might look like:
4242
-}
4343

4444
module Language.Fortran.Util.ModFile
45-
( modFileSuffix, ModFile, ModFiles, emptyModFile, emptyModFiles
46-
, lookupModFileData, getLabelsModFileData, alterModFileData -- , alterModFileDataF
47-
, genModFile, regenModFile, encodeModFile, decodeModFile
48-
, StringMap, DeclMap, ParamVarMap, DeclContext(..), extractModuleMap, extractDeclMap
49-
, moduleFilename, combinedStringMap, combinedDeclMap, combinedModuleMap, combinedTypeEnv, combinedParamVarMap
45+
(
46+
-- * Main defitions
47+
ModFile, ModFiles, emptyModFile, emptyModFiles, modFileSuffix
48+
, lookupModFileData, getLabelsModFileData, alterModFileData, alterModFileDataF
49+
50+
-- * Creation
51+
, genModFile, regenModFile
52+
53+
-- * En/decoding
54+
, encodeModFile, decodeModFile, decodeModFiles, decodeModFiles'
55+
56+
-- * Operations
57+
, moduleFilename
58+
, StringMap, extractStringMap, combinedStringMap
59+
, DeclContext(..), DeclMap, extractDeclMap, combinedDeclMap
60+
, extractModuleMap, combinedModuleMap, combinedTypeEnv
61+
, ParamVarMap, extractParamVarMap, combinedParamVarMap
5062
, genUniqNameToFilenameMap
51-
, TimestampStatus(..), checkTimestamps )
52-
where
63+
, TimestampStatus(..), checkTimestamps
64+
) where
65+
66+
import qualified Language.Fortran.AST as F
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+
import qualified Language.Fortran.Analysis.Renaming as FAR
71+
import qualified Language.Fortran.Analysis.Types as FAT
72+
import qualified Language.Fortran.Util.Position as P
73+
import Language.Fortran.Util.Files ( getDirContents )
5374

5475
import Control.Monad.State
5576
import Data.Binary (Binary, encode, decodeOrFail)
@@ -59,22 +80,22 @@ import Data.Generics.Uniplate.Operations
5980
import qualified Data.Map.Strict as M
6081
import Data.Maybe
6182
import GHC.Generics (Generic)
62-
import qualified Language.Fortran.AST as F
63-
import qualified Language.Fortran.Analysis as FA
64-
import qualified Language.Fortran.Analysis.BBlocks as FAB
65-
import qualified Language.Fortran.Analysis.DataFlow as FAD
66-
import qualified Language.Fortran.Analysis.Renaming as FAR
67-
import qualified Language.Fortran.Analysis.Types as FAT
68-
import qualified Language.Fortran.Util.Position as P
69-
import System.Directory
70-
import System.FilePath
83+
import System.Directory ( doesFileExist, getModificationTime )
84+
import qualified System.FilePath
85+
import System.FilePath ( (-<.>), (</>) )
86+
import System.IO ( hPutStrLn, stderr )
7187

7288
--------------------------------------------------
7389

7490
-- | Standard ending of fortran-src-format "mod files"
7591
modFileSuffix :: String
7692
modFileSuffix = ".fsmod"
7793

94+
-- | Returns 'true' for filepaths with an extension that identifies them as a
95+
-- mod file.
96+
isModFile :: FilePath -> Bool
97+
isModFile = System.FilePath.isExtensionOf modFileSuffix
98+
7899
-- | Context of a declaration: the ProgramUnit where it was declared.
79100
data DeclContext = DCMain | DCBlockData | DCModule F.ProgramUnitName
80101
| DCFunction (F.ProgramUnitName, F.ProgramUnitName) -- ^ (uniqName, srcName)
@@ -149,9 +170,12 @@ getLabelsModFileData = M.keys . mfOtherData
149170
alterModFileData :: (Maybe LB.ByteString -> Maybe LB.ByteString) -> String -> ModFile -> ModFile
150171
alterModFileData f k mf = mf { mfOtherData = M.alter f k . mfOtherData $ mf }
151172

152-
-- For when stackage gets containers-0.5.8.1:
153-
-- alterModFileDataF :: Functor f => (Maybe B.ByteString -> f (Maybe B.ByteString)) -> String -> ModFile -> f ModFile
154-
-- alterModFileDataF f k mf = (\ od -> mf { mfOtherData = od }) <$> M.alterF f k (mfOtherData mf)
173+
alterModFileDataF
174+
:: Functor f
175+
=> (Maybe LB.ByteString -> f (Maybe LB.ByteString)) -> String -> ModFile
176+
-> f ModFile
177+
alterModFileDataF f k mf =
178+
(\od -> mf { mfOtherData = od }) <$> M.alterF f k (mfOtherData mf)
155179

156180
-- | Convert ModFiles to a strict ByteString for writing to file.
157181
encodeModFile :: [ModFile] -> LB.ByteString
@@ -171,6 +195,25 @@ decodeModFile bs = case decodeOrFail bs of
171195
each mf = (revertStringMap sm mf { mfStringMap = M.empty }) { mfStringMap = sm }
172196
where sm = mfStringMap mf
173197

198+
decodeModFiles :: [FilePath] -> IO [(FilePath, ModFile)]
199+
decodeModFiles = foldM (\ modFiles d -> do
200+
-- Figure out the camfort mod files and parse them.
201+
modFileNames <- filter isModFile `fmap` getDirContents d
202+
addedModFiles <- fmap concat . forM modFileNames $ \ modFileName -> do
203+
contents <- LB.readFile (d </> modFileName)
204+
case decodeModFile contents of
205+
Left msg -> do
206+
hPutStrLn stderr $ modFileName ++ ": Error: " ++ msg
207+
return [(modFileName, emptyModFile)]
208+
Right mods -> do
209+
hPutStrLn stderr $ modFileName ++ ": successfully parsed precompiled file."
210+
return $ map (modFileName,) mods
211+
return $ addedModFiles ++ modFiles
212+
) [] -- can't use emptyModFiles
213+
214+
decodeModFiles' :: [FilePath] -> IO ModFiles
215+
decodeModFiles' = fmap (map snd) . decodeModFiles
216+
174217
-- | Extract the combined module map from a set of ModFiles. Useful
175218
-- for parsing a Fortran file in a large context of other modules.
176219
combinedModuleMap :: ModFiles -> FAR.ModuleMap

0 commit comments

Comments
 (0)