#include "HsVersions.h"
import CmdLineOpts ( opt_PruneTyDecls, opt_PruneInstDecls,
- opt_IgnoreIfacePragmas
+ opt_D_show_rn_imports, opt_IgnoreIfacePragmas
)
import HsSyn ( HsDecl(..), TyDecl(..), ClassDecl(..), InstDecl(..), IfaceSig(..),
HsType(..), ConDecl(..), IE(..), ConDetails(..), Sig(..),
)
import Name ( Name {-instance NamedThing-}, Provenance, OccName(..),
nameModule, moduleString, pprModule, isLocallyDefined,
- NameSet(..), emptyNameSet, unionNameSets, nameSetToList,
+ NameSet, emptyNameSet, unionNameSets, nameSetToList,
minusNameSet, mkNameSet, elemNameSet, nameUnique, addOneToNameSet,
isWiredInName, maybeWiredInTyConName, maybeWiredInIdName,
NamedThing(..)
)
-import Id ( GenId, Id(..), idType, dataConTyCon, isAlgCon )
+import Id ( GenId, Id, idType, dataConTyCon, isAlgCon )
import TyCon ( TyCon, tyConDataCons, isSynTyCon, getSynTyConDefn )
import Type ( namesOfType )
import TyVar ( GenTyVar )
\begin{code}
loadInterface :: SDoc -> Module -> IfaceFlavour -> RnMG Ifaces
loadInterface doc_str load_mod as_source
- = getIfacesRn `thenRn` \ ifaces ->
- let
+ = getIfacesRn `thenRn` \ ifaces ->
+ let
Ifaces this_mod mod_map decls
all_names imp_names (insts, tycls_names)
deferred_data_decls inst_mods = ifaces
- in
+ in
-- CHECK WHETHER WE HAVE IT ALREADY
- case lookupFM mod_map load_mod of {
+ case lookupFM mod_map load_mod of {
Just (hif, _, _, _) | hif `as_good_as` as_source
-> -- Already in the cache; don't re-read it
returnRn ifaces ;
other ->
-- READ THE MODULE IN
- findAndReadIface doc_str load_mod as_source `thenRn` \ read_result ->
- case read_result of {
+ findAndReadIface doc_str load_mod as_source `thenRn` \ read_result ->
+ case read_result of {
-- Check for not found
Nothing -> -- Not found, so add an empty export env to the Ifaces map
-- so that we don't look again
-- Just x <=> successfully found and parsed
findAndReadIface doc_str mod_name as_source
= traceRn trace_msg `thenRn_`
+ getModuleHiMap `thenRn` \ himap ->
+ case (lookupFM himap real_mod_name) of
+ Nothing ->
+ traceRn (ptext SLIT("...failed")) `thenRn_`
+ returnRn Nothing
+ Just fpath ->
+ readIface fpath
+{-
getSearchPathRn `thenRn` \ dirs ->
- try dirs dirs
+ try dirs
+-}
where
+ real_mod_name =
+ case as_source of
+ HiBootFile -> 'b':moduleString mod_name
+ HiFile -> moduleString mod_name
+
trace_msg = sep [hsep [ptext SLIT("Reading"),
case as_source of { HiBootFile -> ptext SLIT("[boot]"); other -> empty},
ptext SLIT("interface for"),
ptext mod_name <> semi],
nest 4 (ptext SLIT("reason:") <+> doc_str)]
+{-
-- For import {-# SOURCE #-} Foo, "as_source" will be True
-- and we read Foo.hi-boot, not Foo.hi. This is used to break
-- loops among modules.
HiBootFile -> ".hi-boot" -- Ignore `ways' for boot files.
HiFile -> hi
- try all_dirs [] = traceRn (ptext SLIT("...failed")) `thenRn_`
- returnRn Nothing
+ try [] = traceRn (ptext SLIT("...failed")) `thenRn_`
+ returnRn Nothing
- try all_dirs ((dir,hisuf):dirs)
+ try ((dir,hisuf):dirs)
= readIface file_path `thenRn` \ read_result ->
case read_result of
- Nothing -> try all_dirs dirs
+ Nothing -> try dirs
Just iface -> traceRn (ptext SLIT("...done")) `thenRn_`
returnRn (Just iface)
where
file_path = dir ++ '/' : moduleString mod_name ++ (mod_suffix hisuf)
+-}
\end{code}
-@readIface@ trys just one file.
+@readIface@ tries just the one file.
\begin{code}
readIface :: String -> RnMG (Maybe ParsedIface)
-- Nothing <=> file not found, or unreadable, or illegible
-- Just x <=> successfully found and parsed
readIface file_path
- = ioToRnMG (hGetStringBuffer file_path) `thenRn` \ read_result ->
- --traceRn (hcat[ptext SLIT("Opening...."), text file_path]) `thenRn_`
+ = ioToRnMG (hGetStringBuffer file_path) `thenRn` \ read_result ->
case read_result of
Right contents ->
case parseIface contents (mkSrcLoc (mkFastString file_path) 1) of
- Failed err ->
- failWithRn Nothing err
+ Failed err -> failWithRn Nothing err
Succeeded (PIface iface) ->
- returnRn (Just iface)
+ if opt_D_show_rn_imports then
+ putDocRn (hcat[ptext SLIT("Read "), text file_path]) `thenRn_`
+ returnRn (Just iface)
+ else
+ returnRn (Just iface)
Left err ->
if isDoesNotExistError err then
failWithRn Nothing (cannaeReadFile file_path err)
\end{code}
-mkSearchPath takes a string consisting of a colon-separated list
+%*********************************************************
+%* *
+\subsection{Utils}
+%* *
+%*********************************************************
+
+@mkSearchPath@ takes a string consisting of a colon-separated list
of directories and corresponding suffixes, and turns it into a list
of (directory, suffix) pairs. For example: