packages feed

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