Close files eagerly after analysing their imports.
summariseFile :: FilePath -> IO ModSummary
summariseFile file
= do hspp_fn <- preprocess file
- modsrc <- readFile hspp_fn
+ (srcimps,imps,mod_name) <- getImportsFromFile hspp_fn
- let (srcimps,imps,mod_name) = getImports modsrc
- (path, basename, ext) = splitFilename3 file
+ let (path, basename, ext) = splitFilename3 file
Just (mod, location)
<- mkHomeModuleLocn mod_name (path ++ '/':basename) file
-
+
src_timestamp
<- case ml_hs_file location of
Nothing -> noHsFileErr mod_name
_ -> do
hspp_fn <- preprocess hs_fn
- modsrc <- readFile hspp_fn
- let (srcimps,imps,mod_name) = getImports modsrc
+ (srcimps,imps,mod_name) <- getImportsFromFile hspp_fn
when (mod_name /= moduleName mod) $
throwDyn (ProgramError
- (showSDoc (text modsrc
+ (showSDoc (text hs_fn
<> text ": file name does not match module name"
<+> quotes (ppr (moduleName mod)))))
-----------------------------------------------------------------------------
--- $Id: DriverPipeline.hs,v 1.64 2001/04/05 09:17:15 simonmar Exp $
+-- $Id: DriverPipeline.hs,v 1.65 2001/05/01 16:01:06 simonmar Exp $
--
-- GHC Driver
--
else return False
-- build a ModuleLocation to pass to hscMain.
- modsrc <- readFile input_fn
- let (srcimps,imps,mod_name) = getImports modsrc
+ (srcimps,imps,mod_name) <- getImportsFromFile input_fn
Just (mod, location)
<- mkHomeModuleLocn mod_name basename (basename ++ '.':suff)
-----------------------------------------------------------------------------
--- $Id: GetImports.hs,v 1.5 2001/04/20 10:42:46 sewardj Exp $
+-- $Id: GetImports.hs,v 1.6 2001/05/01 16:01:06 simonmar Exp $
--
-- GHC Driver program
--
--
-----------------------------------------------------------------------------
-module GetImports ( getImports ) where
+module GetImports ( getImportsFromFile, getImports ) where
import Module
+
+import IO
import List
import Char
+-- getImportsFromFile is careful to close the file afterwards, otherwise
+-- we can end up with a large number of open handles before the garbage
+-- collector gets around to closing them.
+getImportsFromFile :: String -> IO ([ModuleName], [ModuleName], ModuleName)
+getImportsFromFile filename
+ = do hdl <- openFile filename ReadMode
+ modsrc <- hGetContents hdl
+ let (srcimps,imps,mod_name) = getImports modsrc
+ length srcimps `seq` length imps `seq` return ()
+ hClose hdl
+ return (srcimps,imps,mod_name)
getImports :: String -> ([ModuleName], [ModuleName], ModuleName)
getImports s