2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-2002
7 Simply the name of a module, represented as a Z-encoded FastString.
8 These are Uniquable, hence we can build FiniteMaps with ModuleNames as
14 A ModuleName with some additional information, namely whether the
15 module resides in the Home package or in a different package. We need
16 to know this for two reasons:
18 * generating cross-DLL calls is different from intra-DLL calls
20 * we don't record version information in interface files for entities
21 in a different package.
23 The unique of a Module is identical to the unique of a ModuleName, so
24 it is safe to look up in a Module map using a ModuleName and vice
29 When compiling module A, which imports module B, we need to
30 know whether B will be in the same DLL as A.
31 If it's in the same DLL, we refer to B_f_closure
32 If it isn't, we refer to _imp__B_f_closure
33 When compiling A, we record in B's Module value whether it's
34 in a different DLL, by setting the DLL flag.
42 Module, -- Abstract, instance of Eq, Ord, Outputable
44 , PackageName -- = FastString; instance of Outputable, Uniquable
45 , preludePackage -- :: PackageName
48 , pprModuleName -- :: ModuleName -> SDoc
51 , moduleName -- :: Module -> ModuleName
52 , moduleNameString -- :: ModuleName -> EncodedString
53 , moduleNameUserString -- :: ModuleName -> UserString
54 , moduleNameFS -- :: ModuleName -> EncodedFS
56 , moduleString -- :: Module -> EncodedString
57 , moduleUserString -- :: Module -> UserString
59 , mkVanillaModule -- :: ModuleName -> Module
60 , isVanillaModule -- :: Module -> Bool
61 , mkPrelModule -- :: UserString -> Module
62 , mkModule -- :: ModuleName -> PackageName -> Module
63 , mkHomeModule -- :: ModuleName -> Module
64 , isHomeModule -- :: Module -> Bool
65 , mkPackageModule -- :: ModuleName -> Module
67 , mkModuleName -- :: UserString -> ModuleName
68 , mkModuleNameFS -- :: UserFS -> ModuleName
69 , mkSysModuleNameFS -- :: EncodedFS -> ModuleName
73 -- Where to find a .hi file
77 , elemModuleEnv, extendModuleEnv, extendModuleEnvList, plusModuleEnv_C
78 , delModuleEnvList, delModuleEnv, plusModuleEnv, lookupModuleEnv
79 , lookupWithDefaultModuleEnv, mapModuleEnv, mkModuleEnv, emptyModuleEnv
80 , moduleEnvElts, unitModuleEnv, isEmptyModuleEnv, foldModuleEnv
81 , lookupModuleEnvByName, extendModuleEnv_C
83 , ModuleSet, emptyModuleSet, mkModuleSet, moduleSetElts, extendModuleSet, elemModuleSet
87 #include "HsVersions.h"
90 import CmdLineOpts ( opt_InPackage )
91 import FastString ( FastString )
92 import Unique ( Uniquable(..) )
100 %************************************************************************
102 \subsection{Interface file flavour}
104 %************************************************************************
106 A further twist to the tale is the support for dynamically linked
107 libraries under Win32. Here, dealing with the use of global variables
108 that's residing in a DLL requires special handling at the point of use
109 (there's an extra level of indirection, i.e., (**v) to get at v's
110 value, rather than just (*v) .) When slurping in an interface file we
111 then record whether it's coming from a .hi corresponding to a module
112 that's packaged up in a DLL or not, so that we later can emit the
115 The logic for how an interface file is marked as corresponding to a
116 module that's hiding in a DLL is explained elsewhere (ToDo: give
120 data Module = Module ModuleName !PackageInfo
122 instance Binary Module where
123 put_ bh (Module m p) = put_ bh m
124 get bh = do m <- get bh; return (Module m DunnoYet)
127 = ThisPackage -- A module from the same package
128 -- as the one being compiled
129 | AnotherPackage -- A module from a different package
131 | DunnoYet -- This is used when we don't yet know
132 -- Main case: we've come across Foo.x in an interface file
133 -- but we havn't yet opened Foo.hi. We need a Name for Foo.x
134 -- Later on (in RnEnv.newTopBinder) we'll update the cache
135 -- to have the right PackageName
137 type PackageName = FastString -- No encoding at all
139 preludePackage :: PackageName
140 preludePackage = FSLIT("base")
142 packageInfoPackage :: PackageInfo -> PackageName
143 packageInfoPackage ThisPackage = opt_InPackage
144 packageInfoPackage DunnoYet = FSLIT("<?>")
145 packageInfoPackage AnotherPackage = FSLIT("<pkg>")
147 instance Outputable PackageInfo where
148 -- Just used in debug prints of lex tokens and in debug modde
149 ppr pkg_info = ppr (packageInfoPackage pkg_info)
153 %************************************************************************
155 \subsection{Where from}
157 %************************************************************************
159 The @WhereFrom@ type controls where the renamer looks for an interface file
162 data WhereFrom = ImportByUser -- Ordinary user import: look for M.hi
163 | ImportByUserSource -- User {- SOURCE -}: look for M.hi-boot
164 | ImportBySystem -- Non user import. Look for M.hi if M is in
165 -- the module this module depends on, or is a system-ish module;
166 -- M.hi-boot otherwise
167 | ImportByCmdLine -- The user typed a qualified name at
168 -- the GHCi prompt, try to demand-load
171 instance Outputable WhereFrom where
172 ppr ImportByUser = empty
173 ppr ImportByUserSource = ptext SLIT("{- SOURCE -}")
174 ppr ImportBySystem = ptext SLIT("{- SYSTEM IMPORT -}")
178 %************************************************************************
180 \subsection{The name of a module}
182 %************************************************************************
185 newtype ModuleName = ModuleName EncodedFS
186 -- Haskell module names can include the quote character ',
187 -- so the module names have the z-encoding applied to them
189 instance Binary ModuleName where
190 put_ bh (ModuleName m) = put_ bh m
191 get bh = do m <- get bh; return (ModuleName m)
193 instance Uniquable ModuleName where
194 getUnique (ModuleName nm) = getUnique nm
196 instance Eq ModuleName where
197 nm1 == nm2 = getUnique nm1 == getUnique nm2
199 -- Warning: gives an ordering relation based on the uniques of the
200 -- FastStrings which are the (encoded) module names. This is _not_
201 -- a lexicographical ordering.
202 instance Ord ModuleName where
203 nm1 `compare` nm2 = getUnique nm1 `compare` getUnique nm2
205 instance Outputable ModuleName where
209 pprModuleName :: ModuleName -> SDoc
210 pprModuleName (ModuleName nm) = pprEncodedFS nm
212 moduleNameFS :: ModuleName -> EncodedFS
213 moduleNameFS (ModuleName mod) = mod
215 moduleNameString :: ModuleName -> EncodedString
216 moduleNameString (ModuleName mod) = unpackFS mod
218 moduleNameUserString :: ModuleName -> UserString
219 moduleNameUserString (ModuleName mod) = decode (unpackFS mod)
221 -- used to be called mkSrcModule
222 mkModuleName :: UserString -> ModuleName
223 mkModuleName s = ModuleName (mkFastString (encode s))
225 -- used to be called mkSrcModuleFS
226 mkModuleNameFS :: UserFS -> ModuleName
227 mkModuleNameFS s = ModuleName (encodeFS s)
229 -- used to be called mkSysModuleFS
230 mkSysModuleNameFS :: EncodedFS -> ModuleName
231 mkSysModuleNameFS s = ModuleName s
235 instance Outputable Module where
238 instance Uniquable Module where
239 getUnique (Module nm _) = getUnique nm
241 -- Same if they have the same name.
242 instance Eq Module where
243 m1 == m2 = getUnique m1 == getUnique m2
245 -- Warning: gives an ordering relation based on the uniques of the
246 -- FastStrings which are the (encoded) module names. This is _not_
247 -- a lexicographical ordering.
248 instance Ord Module where
249 m1 `compare` m2 = getUnique m1 `compare` getUnique m2
254 pprModule :: Module -> SDoc
255 pprModule (Module mod p) = getPprStyle $ \ sty ->
256 if debugStyle sty then
257 -- Print the package too
258 ppr p <> dot <> pprModuleName mod
265 mkModule :: ModuleName -- Name of the module
268 mkModule mod_nm pack_name
269 = Module mod_nm pack_info
271 pack_info | pack_name == opt_InPackage = ThisPackage
272 | otherwise = AnotherPackage
274 mkHomeModule :: ModuleName -> Module
275 mkHomeModule mod_nm = Module mod_nm ThisPackage
277 isHomeModule :: Module -> Bool
278 isHomeModule (Module nm ThisPackage) = True
279 isHomeModule _ = False
281 mkPackageModule :: ModuleName -> Module
282 mkPackageModule mod_nm = Module mod_nm AnotherPackage
284 -- Used temporarily when we first come across Foo.x in an interface
285 -- file, but before we've opened Foo.hi.
286 -- (Until we've opened Foo.hi we don't know what the Package is.)
287 mkVanillaModule :: ModuleName -> Module
288 mkVanillaModule name = Module name DunnoYet
290 isVanillaModule :: Module -> Bool
291 isVanillaModule (Module nm DunnoYet) = True
292 isVanillaModule _ = False
294 mkPrelModule :: ModuleName -> Module
295 mkPrelModule name = mkModule name preludePackage
297 moduleString :: Module -> EncodedString
298 moduleString (Module (ModuleName fs) _) = unpackFS fs
300 moduleName :: Module -> ModuleName
301 moduleName (Module mod pkg_info) = mod
303 moduleUserString :: Module -> UserString
304 moduleUserString (Module mod _) = moduleNameUserString mod
306 printModulePrefix :: Module -> Bool
307 -- When printing, say M.x
308 printModulePrefix (Module nm ThisPackage) = False
309 printModulePrefix _ = True
313 %************************************************************************
315 \subsection{@ModuleEnv@s}
317 %************************************************************************
320 type ModuleEnv elt = UniqFM elt
322 emptyModuleEnv :: ModuleEnv a
323 mkModuleEnv :: [(Module, a)] -> ModuleEnv a
324 unitModuleEnv :: Module -> a -> ModuleEnv a
325 extendModuleEnv :: ModuleEnv a -> Module -> a -> ModuleEnv a
326 extendModuleEnv_C :: (a->a->a) -> ModuleEnv a -> Module -> a -> ModuleEnv a
327 plusModuleEnv :: ModuleEnv a -> ModuleEnv a -> ModuleEnv a
328 extendModuleEnvList :: ModuleEnv a -> [(Module, a)] -> ModuleEnv a
330 delModuleEnvList :: ModuleEnv a -> [Module] -> ModuleEnv a
331 delModuleEnv :: ModuleEnv a -> Module -> ModuleEnv a
332 plusModuleEnv_C :: (a -> a -> a) -> ModuleEnv a -> ModuleEnv a -> ModuleEnv a
333 mapModuleEnv :: (a -> b) -> ModuleEnv a -> ModuleEnv b
334 moduleEnvElts :: ModuleEnv a -> [a]
336 isEmptyModuleEnv :: ModuleEnv a -> Bool
337 lookupModuleEnv :: ModuleEnv a -> Module -> Maybe a
338 lookupModuleEnvByName:: ModuleEnv a -> ModuleName -> Maybe a
339 lookupWithDefaultModuleEnv :: ModuleEnv a -> a -> Module -> a
340 elemModuleEnv :: Module -> ModuleEnv a -> Bool
341 foldModuleEnv :: (a -> b -> b) -> b -> ModuleEnv a -> b
343 elemModuleEnv = elemUFM
344 extendModuleEnv = addToUFM
345 extendModuleEnv_C = addToUFM_C
346 extendModuleEnvList = addListToUFM
347 plusModuleEnv_C = plusUFM_C
348 delModuleEnvList = delListFromUFM
349 delModuleEnv = delFromUFM
350 plusModuleEnv = plusUFM
351 lookupModuleEnv = lookupUFM
352 lookupModuleEnvByName = lookupUFM
353 lookupWithDefaultModuleEnv = lookupWithDefaultUFM
354 mapModuleEnv = mapUFM
355 mkModuleEnv = listToUFM
356 emptyModuleEnv = emptyUFM
357 moduleEnvElts = eltsUFM
358 unitModuleEnv = unitUFM
359 isEmptyModuleEnv = isNullUFM
360 foldModuleEnv = foldUFM
365 type ModuleSet = UniqSet Module
366 mkModuleSet :: [Module] -> ModuleSet
367 extendModuleSet :: ModuleSet -> Module -> ModuleSet
368 emptyModuleSet :: ModuleSet
369 moduleSetElts :: ModuleSet -> [Module]
370 elemModuleSet :: Module -> ModuleSet -> Bool
372 emptyModuleSet = emptyUniqSet
373 mkModuleSet = mkUniqSet
374 extendModuleSet = addOneToUniqSet
375 moduleSetElts = uniqSetToList
376 elemModuleSet = elementOfUniqSet