#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(..),
hsDeclName
)
-import HsPragmas ( noGenPragmas )
import BasicTypes ( Version, NewOrData(..), IfaceFlavour(..) )
import RdrHsSyn ( RdrNameHsDecl, RdrNameInstDecl, RdrNameTyDecl,
RdrName(..), rdrNameOcc
)
-import RnEnv ( newImportedGlobalName, addImplicitOccsRn, ifaceFlavour,
- availName, availNames, addAvailToNameSet, pprAvail
+import RnEnv ( newImportedGlobalName, addImplicitOccsRn,
+ ifaceFlavour, availName, availNames, addAvailToNameSet
)
import RnSource ( rnHsSigType )
import RnMonad
import RnHsSyn ( RenamedHsDecl )
import ParseIface ( parseIface, IfaceStuff(..) )
-import FiniteMap ( FiniteMap, sizeFM, emptyFM, unitFM, delFromFM,
+import FiniteMap ( FiniteMap, sizeFM, emptyFM, delFromFM,
lookupFM, addToFM, addToFM_C, addListToFM,
- fmToList, eltsFM
+ fmToList
)
import Name ( Name {-instance NamedThing-}, Provenance, OccName(..),
- nameModule, occNameString, moduleString, pprModule, isLocallyDefined,
+ nameModule, moduleString, pprModule, isLocallyDefined,
NameSet(..), emptyNameSet, unionNameSets, nameSetToList,
minusNameSet, mkNameSet, elemNameSet, nameUnique, addOneToNameSet,
isWiredInName, maybeWiredInTyConName, maybeWiredInIdName,
import PrelMods ( pREL_GHC )
import PrelInfo ( cCallishTyKeys )
import Bag
-import Maybes ( MaybeErr(..), expectJust, maybeToBool )
+import Maybes ( MaybeErr(..), maybeToBool )
import ListSetOps ( unionLists )
import Outputable
import Unique ( Unique )
-import StringBuffer ( StringBuffer, hGetStringBuffer, freeStringBuffer )
+import StringBuffer ( StringBuffer, hGetStringBuffer )
import FastString ( mkFastString )
import Outputable
\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
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: