2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
4 \section[Module]{The @Module@ module.}
6 Representing modules and their flavours.
11 When compiling module A, which imports module B, we need to
12 know whether B will be in the same DLL as A.
13 If it's in the same DLL, we refer to B_f_closure
14 If it isn't, we refer to _imp__B_f_closure
15 When compiling A, we record in B's Module value whether it's
16 in a different DLL, by setting the DLL flag.
24 Module, -- Abstract, instance of Eq, Ord, Outputable
26 , PackageName -- = FastString; instance of Outputable, Uniquable
27 , modulePackage -- :: Module -> PackageName
28 , preludePackage -- :: PackageName name of Standard Prelude package
31 , pprModuleName -- :: ModuleName -> SDoc
34 , moduleName -- :: Module -> ModuleName
35 , moduleNameString -- :: ModuleName -> EncodedString
36 , moduleNameUserString -- :: ModuleName -> UserString
37 , moduleNameFS -- :: ModuleName -> EncodedFS
39 , moduleString -- :: Module -> EncodedString
40 , moduleUserString -- :: Module -> UserString
42 , mkVanillaModule -- :: ModuleName -> Module
43 , isVanillaModule -- :: Module -> Bool
44 , mkPrelModule -- :: UserString -> Module
45 , isPrelModule -- :: Module -> Bool
46 , mkModule -- :: ModuleName -> PackageName -> Module
47 , mkHomeModule -- :: ModuleName -> Module
48 , isHomeModule -- :: Module -> Bool
50 , mkModuleName -- :: UserString -> ModuleName
51 , mkModuleNameFS -- :: UserFS -> ModuleName
52 , mkSysModuleNameFS -- :: EncodedFS -> ModuleName
56 -- Where to find a .hi file
60 , elemModuleEnv, extendModuleEnv, extendModuleEnvList, plusModuleEnv_C
61 , delModuleEnvList, delModuleEnv, plusModuleEnv, lookupModuleEnv
62 , lookupWithDefaultModuleEnv, mapModuleEnv, mkModuleEnv, emptyModuleEnv
63 , moduleEnvElts, unitModuleEnv, isEmptyModuleEnv, foldModuleEnv
64 , lookupModuleEnvByName, extendModuleEnv_C
66 , ModuleSet, emptyModuleSet, mkModuleSet, moduleSetElts, extendModuleSet, elemModuleSet
70 #include "HsVersions.h"
73 import CmdLineOpts ( opt_InPackage )
74 import FastString ( FastString )
75 import Unique ( Uniquable(..) )
81 %************************************************************************
83 \subsection{Interface file flavour}
85 %************************************************************************
87 A further twist to the tale is the support for dynamically linked
88 libraries under Win32. Here, dealing with the use of global variables
89 that's residing in a DLL requires special handling at the point of use
90 (there's an extra level of indirection, i.e., (**v) to get at v's
91 value, rather than just (*v) .) When slurping in an interface file we
92 then record whether it's coming from a .hi corresponding to a module
93 that's packaged up in a DLL or not, so that we later can emit the
96 The logic for how an interface file is marked as corresponding to a
97 module that's hiding in a DLL is explained elsewhere (ToDo: give
101 data Module = Module ModuleName PackageInfo
104 = ThisPackage -- A module from the same package
105 -- as the one being compiled
106 | AnotherPackage PackageName -- A module from a different package
108 | DunnoYet -- This is used when we don't yet know
109 -- Main case: we've come across Foo.x in an interface file
110 -- but we havn't yet opened Foo.hi. We need a Name for Foo.x
111 -- Later on (in RnEnv.newTopBinder) we'll update the cache
112 -- to have the right PackageName
114 type PackageName = FastString -- No encoding at all
116 preludePackage :: PackageName
117 preludePackage = SLIT("std")
119 packageInfoPackage :: PackageInfo -> PackageName
120 packageInfoPackage ThisPackage = SLIT("<THIS>")
121 packageInfoPackage DunnoYet = SLIT("<?>")
122 packageInfoPackage (AnotherPackage p) = p
124 instance Outputable PackageInfo where
125 -- Just used in debug prints of lex tokens and in debug modde
126 ppr pkg_info = ppr (packageInfoPackage pkg_info)
130 %************************************************************************
132 \subsection{Where from}
134 %************************************************************************
136 The @WhereFrom@ type controls where the renamer looks for an interface file
139 data WhereFrom = ImportByUser -- Ordinary user import: look for M.hi
140 | ImportByUserSource -- User {- SOURCE -}: look for M.hi-boot
141 | ImportBySystem -- Non user import. Look for M.hi if M is in
142 -- the module this module depends on, or is a system-ish module;
143 -- M.hi-boot otherwise
145 instance Outputable WhereFrom where
146 ppr ImportByUser = empty
147 ppr ImportByUserSource = ptext SLIT("{- SOURCE -}")
148 ppr ImportBySystem = ptext SLIT("{- SYSTEM IMPORT -}")
152 %************************************************************************
154 \subsection{The name of a module}
156 %************************************************************************
159 newtype ModuleName = ModuleName EncodedFS
160 -- Haskell module names can include the quote character ',
161 -- so the module names have the z-encoding applied to them
163 instance Uniquable ModuleName where
164 getUnique (ModuleName nm) = getUnique nm
166 instance Eq ModuleName where
167 nm1 == nm2 = getUnique nm1 == getUnique nm2
169 -- Warning: gives an ordering relation based on the uniques of the
170 -- FastStrings which are the (encoded) module names. This is _not_
171 -- a lexicographical ordering.
172 instance Ord ModuleName where
173 nm1 `compare` nm2 = getUnique nm1 `compare` getUnique nm2
175 instance Outputable ModuleName where
179 pprModuleName :: ModuleName -> SDoc
180 pprModuleName (ModuleName nm) = pprEncodedFS nm
182 moduleNameFS :: ModuleName -> EncodedFS
183 moduleNameFS (ModuleName mod) = mod
185 moduleNameString :: ModuleName -> EncodedString
186 moduleNameString (ModuleName mod) = _UNPK_ mod
188 moduleNameUserString :: ModuleName -> UserString
189 moduleNameUserString (ModuleName mod) = decode (_UNPK_ mod)
191 -- used to be called mkSrcModule
192 mkModuleName :: UserString -> ModuleName
193 mkModuleName s = ModuleName (_PK_ (encode s))
195 -- used to be called mkSrcModuleFS
196 mkModuleNameFS :: UserFS -> ModuleName
197 mkModuleNameFS s = ModuleName (encodeFS s)
199 -- used to be called mkSysModuleFS
200 mkSysModuleNameFS :: EncodedFS -> ModuleName
201 mkSysModuleNameFS s = ModuleName s
205 instance Outputable Module where
208 instance Uniquable Module where
209 getUnique (Module nm _) = getUnique nm
211 -- Same if they have the same name.
212 instance Eq Module where
213 m1 == m2 = getUnique m1 == getUnique m2
215 -- Warning: gives an ordering relation based on the uniques of the
216 -- FastStrings which are the (encoded) module names. This is _not_
217 -- a lexicographical ordering.
218 instance Ord Module where
219 m1 `compare` m2 = getUnique m1 `compare` getUnique m2
224 pprModule :: Module -> SDoc
225 pprModule (Module mod p) = getPprStyle $ \ sty ->
226 if debugStyle sty then
227 -- Print the package too
228 ppr p <> dot <> pprModuleName mod
235 mkModule :: ModuleName -- Name of the module
238 mkModule mod_nm pack_name
239 = Module mod_nm pack_info
241 pack_info | pack_name == opt_InPackage = ThisPackage
242 | otherwise = AnotherPackage pack_name
244 mkHomeModule :: ModuleName -> Module
245 mkHomeModule mod_nm = Module mod_nm ThisPackage
247 isHomeModule :: Module -> Bool
248 isHomeModule (Module nm ThisPackage) = True
249 isHomeModule _ = False
251 -- Used temporarily when we first come across Foo.x in an interface
252 -- file, but before we've opened Foo.hi.
253 -- (Until we've opened Foo.hi we don't know what the Package is.)
254 mkVanillaModule :: ModuleName -> Module
255 mkVanillaModule name = Module name DunnoYet
257 isVanillaModule :: Module -> Bool
258 isVanillaModule (Module nm DunnoYet) = True
259 isVanillaModule _ = False
261 mkPrelModule :: ModuleName -> Module
262 mkPrelModule name = mkModule name preludePackage
264 isPrelModule :: Module -> Bool
265 isPrelModule (Module nm (AnotherPackage p)) | p == preludePackage = True
266 isPrelModule _ = False
268 moduleString :: Module -> EncodedString
269 moduleString (Module (ModuleName fs) _) = _UNPK_ fs
271 moduleName :: Module -> ModuleName
272 moduleName (Module mod pkg_info) = mod
274 modulePackage :: Module -> PackageName
275 modulePackage (Module mod pkg_info) = packageInfoPackage pkg_info
277 moduleUserString :: Module -> UserString
278 moduleUserString (Module mod _) = moduleNameUserString mod
280 printModulePrefix :: Module -> Bool
281 -- When printing, say M.x
282 printModulePrefix (Module nm ThisPackage) = False
283 printModulePrefix _ = True
287 %************************************************************************
289 \subsection{@ModuleEnv@s}
291 %************************************************************************
294 type ModuleEnv elt = UniqFM elt
296 emptyModuleEnv :: ModuleEnv a
297 mkModuleEnv :: [(Module, a)] -> ModuleEnv a
298 unitModuleEnv :: Module -> a -> ModuleEnv a
299 extendModuleEnv :: ModuleEnv a -> Module -> a -> ModuleEnv a
300 extendModuleEnv_C :: (a->a->a) -> ModuleEnv a -> Module -> a -> ModuleEnv a
301 plusModuleEnv :: ModuleEnv a -> ModuleEnv a -> ModuleEnv a
302 extendModuleEnvList :: ModuleEnv a -> [(Module, a)] -> ModuleEnv a
304 delModuleEnvList :: ModuleEnv a -> [Module] -> ModuleEnv a
305 delModuleEnv :: ModuleEnv a -> Module -> ModuleEnv a
306 plusModuleEnv_C :: (a -> a -> a) -> ModuleEnv a -> ModuleEnv a -> ModuleEnv a
307 mapModuleEnv :: (a -> b) -> ModuleEnv a -> ModuleEnv b
308 moduleEnvElts :: ModuleEnv a -> [a]
310 isEmptyModuleEnv :: ModuleEnv a -> Bool
311 lookupModuleEnv :: ModuleEnv a -> Module -> Maybe a
312 lookupModuleEnvByName:: ModuleEnv a -> ModuleName -> Maybe a
313 lookupWithDefaultModuleEnv :: ModuleEnv a -> a -> Module -> a
314 elemModuleEnv :: Module -> ModuleEnv a -> Bool
315 foldModuleEnv :: (a -> b -> b) -> b -> ModuleEnv a -> b
317 elemModuleEnv = elemUFM
318 extendModuleEnv = addToUFM
319 extendModuleEnv_C = addToUFM_C
320 extendModuleEnvList = addListToUFM
321 plusModuleEnv_C = plusUFM_C
322 delModuleEnvList = delListFromUFM
323 delModuleEnv = delFromUFM
324 plusModuleEnv = plusUFM
325 lookupModuleEnv = lookupUFM
326 lookupModuleEnvByName = lookupUFM
327 lookupWithDefaultModuleEnv = lookupWithDefaultUFM
328 mapModuleEnv = mapUFM
329 mkModuleEnv = listToUFM
330 emptyModuleEnv = emptyUFM
331 moduleEnvElts = eltsUFM
332 unitModuleEnv = unitUFM
333 isEmptyModuleEnv = isNullUFM
334 foldModuleEnv = foldUFM
339 type ModuleSet = UniqSet Module
340 mkModuleSet :: [Module] -> ModuleSet
341 extendModuleSet :: ModuleSet -> Module -> ModuleSet
342 emptyModuleSet :: ModuleSet
343 moduleSetElts :: ModuleSet -> [Module]
344 elemModuleSet :: Module -> ModuleSet -> Bool
346 emptyModuleSet = emptyUniqSet
347 mkModuleSet = mkUniqSet
348 extendModuleSet = addOneToUniqSet
349 moduleSetElts = uniqSetToList
350 elemModuleSet = elementOfUniqSet