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.
25 -- abstract, instance of Eq, Ord, Outputable
27 , isModuleInThisPackage, mkModuleInThisPackage
29 , moduleNameString -- :: ModuleName -> EncodedString
30 , moduleNameUserString -- :: ModuleName -> UserString
31 , moduleNameFS -- :: ModuleName -> EncodedFS
33 , moduleString -- :: Module -> EncodedString
34 , moduleUserString -- :: Module -> UserString
35 , moduleName -- :: Module -> ModuleName
37 , mkVanillaModule -- :: ModuleName -> Module
38 , mkPrelModule -- :: UserString -> Module
39 , mkModule -- :: ModuleName -> PackageName -> Module
40 , mkHomeModule -- :: ModuleName -> Module
44 , mkModuleName -- :: UserString -> ModuleName
45 , mkModuleNameFS -- :: UserFS -> ModuleName
46 , mkSysModuleNameFS -- :: EncodedFS -> ModuleName
52 -- Where to find a .hi file
56 , elemModuleEnv, extendModuleEnv, extendModuleEnvList, plusModuleEnv_C
57 , delModuleEnvList, delModuleEnv, plusModuleEnv, lookupModuleEnv
58 , lookupWithDefaultModuleEnv, mapModuleEnv, mkModuleEnv, emptyModuleEnv
59 , rngModuleEnv, unitModuleEnv, isEmptyModuleEnv, foldModuleEnv, lookupModuleEnvByName
63 #include "HsVersions.h"
66 import CmdLineOpts ( opt_InPackage )
67 import FastString ( FastString, uniqueOfFS )
68 import Unique ( Uniquable(..), mkUniqueGrimily )
73 %************************************************************************
75 \subsection{Interface file flavour}
77 %************************************************************************
79 A further twist to the tale is the support for dynamically linked
80 libraries under Win32. Here, dealing with the use of global variables
81 that's residing in a DLL requires special handling at the point of use
82 (there's an extra level of indirection, i.e., (**v) to get at v's
83 value, rather than just (*v) .) When slurping in an interface file we
84 then record whether it's coming from a .hi corresponding to a module
85 that's packaged up in a DLL or not, so that we later can emit the
88 The logic for how an interface file is marked as corresponding to a
89 module that's hiding in a DLL is explained elsewhere (ToDo: give
93 data Module = Module ModuleName PackageInfo
96 = ThisPackage -- A module from the same package
97 -- as the one being compiled
98 | AnotherPackage PackageName -- A module from a different package
100 type PackageName = FastString -- No encoding at all
102 preludePackage :: PackageName
103 preludePackage = SLIT("std")
105 instance Outputable PackageInfo where
106 -- Just used in debug prints of lex tokens and in debug modde
107 ppr ThisPackage = ptext SLIT("<THIS>")
108 ppr (AnotherPackage p) = ptext p
112 %************************************************************************
114 \subsection{Where from}
116 %************************************************************************
118 The @WhereFrom@ type controls where the renamer looks for an interface file
121 data WhereFrom = ImportByUser -- Ordinary user import: look for M.hi
122 | ImportByUserSource -- User {- SOURCE -}: look for M.hi-boot
123 | ImportBySystem -- Non user import. Look for M.hi if M is in
124 -- the module this module depends on, or is a system-ish module;
125 -- M.hi-boot otherwise
127 instance Outputable WhereFrom where
128 ppr ImportByUser = empty
129 ppr ImportByUserSource = ptext SLIT("{- SOURCE -}")
130 ppr ImportBySystem = ptext SLIT("{- SYSTEM IMPORT -}")
134 %************************************************************************
136 \subsection{The name of a module}
138 %************************************************************************
141 newtype ModuleName = ModuleName EncodedFS
142 -- Haskell module names can include the quote character ',
143 -- so the module names have the z-encoding applied to them
145 instance Uniquable ModuleName where
146 getUnique (ModuleName nm) = mkUniqueGrimily (uniqueOfFS nm)
148 instance Eq ModuleName where
149 nm1 == nm2 = getUnique nm1 == getUnique nm2
151 -- Warning: gives an ordering relation based on the uniques of the
152 -- FastStrings which are the (encoded) module names. This is _not_
153 -- a lexicographical ordering.
154 instance Ord ModuleName where
155 nm1 `compare` nm2 = getUnique nm1 `compare` getUnique nm2
157 instance Outputable ModuleName where
161 pprModuleName :: ModuleName -> SDoc
162 pprModuleName (ModuleName nm) = pprEncodedFS nm
164 moduleNameFS :: ModuleName -> EncodedFS
165 moduleNameFS (ModuleName mod) = mod
167 moduleNameString :: ModuleName -> EncodedString
168 moduleNameString (ModuleName mod) = _UNPK_ mod
170 moduleNameUserString :: ModuleName -> UserString
171 moduleNameUserString (ModuleName mod) = decode (_UNPK_ mod)
173 -- used to be called mkSrcModule
174 mkModuleName :: UserString -> ModuleName
175 mkModuleName s = ModuleName (_PK_ (encode s))
177 -- used to be called mkSrcModuleFS
178 mkModuleNameFS :: UserFS -> ModuleName
179 mkModuleNameFS s = ModuleName (encodeFS s)
181 -- used to be called mkSysModuleFS
182 mkSysModuleNameFS :: EncodedFS -> ModuleName
183 mkSysModuleNameFS s = ModuleName s
185 -- Make a module in this package
186 mkModuleInThisPackage :: ModuleName -> Module
187 mkModuleInThisPackage nm = Module nm ThisPackage
191 instance Outputable Module where
194 instance Uniquable Module where
195 getUnique (Module nm _) = getUnique nm
197 -- Same if they have the same name.
198 instance Eq Module where
199 m1 == m2 = getUnique m1 == getUnique m2
201 -- Warning: gives an ordering relation based on the uniques of the
202 -- FastStrings which are the (encoded) module names. This is _not_
203 -- a lexicographical ordering.
204 instance Ord Module where
205 m1 `compare` m2 = getUnique m1 `compare` getUnique m2
210 pprModule :: Module -> SDoc
211 pprModule (Module mod p) = getPprStyle $ \ sty ->
212 if debugStyle sty then
213 -- Print the package too
214 ppr p <> dot <> pprModuleName mod
221 mkModule :: ModuleName -- Name of the module
224 mkModule mod_nm pack_name
225 = Module mod_nm pack_info
227 pack_info | pack_name == opt_InPackage = ThisPackage
228 | otherwise = AnotherPackage pack_name
230 mkHomeModule :: ModuleName -> Module
231 mkHomeModule mod_nm = Module mod_nm ThisPackage
233 -- Used temporarily when we first come across Foo.x in an interface
234 -- file, but before we've opened Foo.hi.
235 -- (Until we've opened Foo.hi we don't know what the PackageInfo is.)
236 mkVanillaModule :: ModuleName -> Module
237 mkVanillaModule name = mkModule name (panic "mkVanillaModule:unknown mod_kind field")
239 mkPrelModule :: ModuleName -> Module
240 mkPrelModule name = mkModule name preludePackage
242 moduleString :: Module -> EncodedString
243 moduleString (Module (ModuleName fs) _) = _UNPK_ fs
245 moduleName :: Module -> ModuleName
246 moduleName (Module mod _) = mod
248 moduleUserString :: Module -> UserString
249 moduleUserString (Module mod _) = moduleNameUserString mod
251 isModuleInThisPackage :: Module -> Bool
252 isModuleInThisPackage (Module nm ThisPackage) = True
253 isModuleInThisPackage _ = False
256 %************************************************************************
258 \subsection{@ModuleEnv@s}
260 %************************************************************************
263 type ModuleEnv elt = UniqFM elt
265 emptyModuleEnv :: ModuleEnv a
266 mkModuleEnv :: [(Module, a)] -> ModuleEnv a
267 unitModuleEnv :: Module -> a -> ModuleEnv a
268 extendModuleEnv :: ModuleEnv a -> Module -> a -> ModuleEnv a
269 plusModuleEnv :: ModuleEnv a -> ModuleEnv a -> ModuleEnv a
270 extendModuleEnvList :: ModuleEnv a -> [(Module, a)] -> ModuleEnv a
272 delModuleEnvList :: ModuleEnv a -> [Module] -> ModuleEnv a
273 delModuleEnv :: ModuleEnv a -> Module -> ModuleEnv a
274 plusModuleEnv_C :: (a -> a -> a) -> ModuleEnv a -> ModuleEnv a -> ModuleEnv a
275 mapModuleEnv :: (a -> b) -> ModuleEnv a -> ModuleEnv b
276 rngModuleEnv :: ModuleEnv a -> [a]
278 isEmptyModuleEnv :: ModuleEnv a -> Bool
279 lookupModuleEnv :: ModuleEnv a -> Module -> Maybe a
280 lookupModuleEnvByName:: ModuleEnv a -> ModuleName -> Maybe a
281 lookupWithDefaultModuleEnv :: ModuleEnv a -> a -> Module -> a
282 elemModuleEnv :: Module -> ModuleEnv a -> Bool
283 foldModuleEnv :: (a -> b -> b) -> b -> ModuleEnv a -> b
285 elemModuleEnv = elemUFM
286 extendModuleEnv = addToUFM
287 extendModuleEnvList = addListToUFM
288 plusModuleEnv_C = plusUFM_C
289 delModuleEnvList = delListFromUFM
290 delModuleEnv = delFromUFM
291 plusModuleEnv = plusUFM
292 lookupModuleEnv = lookupUFM
293 lookupModuleEnvByName = lookupUFM
294 lookupWithDefaultModuleEnv = lookupWithDefaultUFM
295 mapModuleEnv = mapUFM
296 mkModuleEnv = listToUFM
297 emptyModuleEnv = emptyUFM
298 rngModuleEnv = eltsUFM
299 unitModuleEnv = unitUFM
300 isEmptyModuleEnv = isNullUFM
301 foldModuleEnv = foldUFM