graphtype-0.2.0: src/Parse.hs
-- | Parses specified *.hs files and returns a list of all data declarations from them
module Parse (parseFiles) where
import Language.Haskell.Exts
import Data.Generics.PlateData (universeBi)
import Control.Monad (liftM)
import System.Exit (exitFailure)
parseFiles :: Maybe [Extension] -> [FilePath] -> IO [Decl]
parseFiles exts = liftM concat . mapM parseFile'
where
parser = case exts of
Nothing -> parseFile
Just es -> \f -> parseFileWithMode defaultParseMode{ parseFilename = f, extensions = es} f
parseFile' fname = do
res <- parser fname
case res of
ParseOk m -> return $ collectDeclarations m
ParseFailed srcLoc message -> do
putStrLn $ unlines [ prettyPrint srcLoc
, message
]
exitFailure
collectDeclarations moduleDesc =
[ x | x <- universeBi moduleDesc, isDeclaration x]
where
isDeclaration (DataDecl _ _ _ _ _ _ _) = True
isDeclaration (TypeDecl _ _ _ _) = True
isDeclaration _ = False