------------------------------------------------------------------------- -- A library to get the import structures of a program. ------------------------------------------------------------------------- module Imports ( getImportedInterfaces, moduleImports, readFlatCurryFileInLoadPath , InterfaceOrFlatProg(..), ifOrProg, progOfIFFP ) where import FlatCurry.Types ( Prog(..) ) import FlatCurry.Files ( flatCurryFileName, readFlatCurry, readFlatCurryFile ) import FlatCurry.Goodies ( progName ) import FlatCurry.Read ( readFlatCurryIntWithImports ) import System.CurryPath ( getLoadPathForModule ) import System.Directory ( findFileWithSuffix, getFileSize ) --- Get all interfaces (i.e., main and all indirectly imported modules) --- of a program: getImportedInterfaces :: String -> IO [(String,InterfaceOrFlatProg)] getImportedInterfaces mod = do imps <- readFlatCurryIntWithImports mod return (map (\prog -> (progName prog, IF prog)) imps) -- Extract a module and its imports moduleImports :: Prog -> (String, [String]) moduleImports (Prog m is _ _ _) = (m, is) ----------------------------------------------------------------------------- -- Unione type to distinguish between interface and FlatCurry program: data InterfaceOrFlatProg = IF Prog | FP Prog ifOrProg :: (Prog->a) -> (Prog->a) -> InterfaceOrFlatProg -> a ifOrProg iffun _ (IF prog) = iffun prog ifOrProg _ fpfun (FP prog) = fpfun prog progOfIFFP :: InterfaceOrFlatProg -> Prog progOfIFFP (IF prog) = prog progOfIFFP (FP prog) = prog -------------------------------------------------------------------------- -- Read a FlatCurry file w.r.t. a given load path. -- If the FlatCurry file does not exist, the FlatCurry file will be generated -- by the front end. readFlatCurryFileInLoadPath :: (String -> IO _) -> String -> [String] -> IO Prog readFlatCurryFileInLoadPath prt mname loadpath = do mbfcyfile <- findFileWithSuffix (flatCurryFileName mname) [""] loadpath let genmsg = "FlatCurry file of module '" ++ mname ++ "' not found, generate it..." maybe (prt genmsg >> readFlatCurry mname) (readFlatCurryFileAndReport prt mname) mbfcyfile readFlatCurryFileAndReport :: (String -> IO _) -> String -> String -> IO Prog readFlatCurryFileAndReport prt mname filename = do size <- getFileSize filename prt $ "Reading FlatCurry file of module '" ++ mname ++ "' (" ++ show size ++ " bytes)..." prog <- readFlatCurryFile filename seq (prog==prog) (return prog) --------------------------------------------------------------------------