2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1996
4 \section[RnIfaces]{Cacheing and Renaming of Interfaces}
7 #include "HsVersions.h"
20 import PreludeGlaST ( returnPrimIO, thenPrimIO,
21 readVar, writeVar, MutableVar(..) )
30 import RnUtils ( RnEnv(..) )
32 import Bag ( emptyBag )
33 import ErrUtils ( Error(..), Warning(..) )
34 import FiniteMap ( emptyFM, lookupFM, addToFM )
36 import Maybes ( MaybeErr(..) )
43 type IfaceCache = MutableVar _RealWorld (FiniteMap Module ParsedIface,
44 FiniteMap Module String)
46 data ParsedIface = ParsedIface
49 *********************************************************
51 \subsection{Looking for interface files}
53 *********************************************************
56 findHiFiles :: [String] -> PrimIO (FiniteMap Module String)
57 findHiFiles dirs = returnPrimIO emptyFM
60 *********************************************************
62 \subsection{Reading interface files}
64 *********************************************************
67 cacheInterface :: IfaceCache -> Module
68 -> PrimIO (MaybeErr ParsedIface Error)
70 cacheInterface iface_var mod
71 = readVar iface_var `thenPrimIO` \ (iface_fm, file_fm) ->
72 case lookupFM iface_fm mod of
73 Just iface -> returnPrimIO (Succeeded iface)
75 case lookupFM file_fm mod of
76 Nothing -> returnPrimIO (Failed (noIfaceErr mod))
78 readInterface file mod `thenPrimIO` \ read_iface ->
80 Failed err -> returnPrimIO (Failed err)
83 iface_fm' = addToFM iface_fm mod iface
85 writeVar iface_var (iface_fm', file_fm) `thenPrimIO` \ _ ->
86 returnPrimIO (Succeeded iface)
89 readInterface :: String -> Module
90 -> PrimIO (MaybeErr ParsedIface Error)
92 readInterface file mod = panic "readInterface"
98 IfaceCache -- iface cache
99 -> RnEnv -- original name env
101 -> RenamedHsModule -- module to extend with iface decls
102 -> [RnName] -- imported names required
103 -> PrimIO (RenamedHsModule, -- extended module
104 ImplicitEnv, -- implicit names required
108 rnInterfaces iface_var occ_env us rn_module todo
109 = returnPrimIO (rn_module, (emptyFM, emptyFM), emptyBag, emptyBag)
115 IfaceCache -- iface cache
116 -> [RnName] -- all imported names required
117 -> [Module] -- directly imported modules
118 -> PrimIO (VersionInfo, -- info about version numbers
119 [Module]) -- special instance modules
121 type VersionInfo = [(Module, Version, [(FAST_STRING, Version)])]
123 finalIfaceInfo iface_var imps_reqd imp_mods
124 = returnPrimIO ([], [])
130 = ppCat [ppStr "Could not find interface for", ppPStr mod]