[project @ 2002-10-24 14:17:46 by simonpj]
[ghc-hetmet.git] / ghc / compiler / basicTypes / Module.lhs
1 %
2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-2002
3 %
4
5 ModuleName
6 ~~~~~~~~~~
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
9 the keys.
10
11 Module
12 ~~~~~~
13
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: 
17   
18   * generating cross-DLL calls is different from intra-DLL calls 
19     (see below).
20   * we don't record version information in interface files for entities
21     in a different package.
22
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
25 versa.
26
27 Notes on DLLs
28 ~~~~~~~~~~~~~
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.
35
36
37
38
39 \begin{code}
40 module Module 
41     (
42       Module,                   -- Abstract, instance of Eq, Ord, Outputable
43
44     , ModLocation(..),
45     , showModMsg
46
47     , ModuleName
48     , pprModuleName             -- :: ModuleName -> SDoc
49     , printModulePrefix
50
51     , moduleName                -- :: Module -> ModuleName 
52     , moduleNameString          -- :: ModuleName -> EncodedString
53     , moduleNameUserString      -- :: ModuleName -> UserString
54     , moduleNameFS              -- :: ModuleName -> EncodedFS
55
56     , moduleString              -- :: Module -> EncodedString
57     , moduleUserString          -- :: Module -> UserString
58
59     , mkBasePkgModule           -- :: UserString -> Module
60     , mkThPkgModule             -- :: UserString -> Module
61     , mkHomeModule              -- :: ModuleName -> Module
62     , isHomeModule              -- :: Module -> Bool
63     , mkPackageModule           -- :: ModuleName -> Module
64
65     , mkModuleName              -- :: UserString -> ModuleName
66     , mkModuleNameFS            -- :: UserFS    -> ModuleName
67     , mkSysModuleNameFS         -- :: EncodedFS -> ModuleName
68
69     , pprModule,
70  
71     , ModuleEnv,
72     , elemModuleEnv, extendModuleEnv, extendModuleEnvList, plusModuleEnv_C
73     , delModuleEnvList, delModuleEnv, plusModuleEnv, lookupModuleEnv
74     , lookupWithDefaultModuleEnv, mapModuleEnv, mkModuleEnv, emptyModuleEnv
75     , moduleEnvElts, unitModuleEnv, isEmptyModuleEnv, foldModuleEnv
76     , extendModuleEnv_C
77     , lookupModuleEnvByName, extendModuleEnvByName, unitModuleEnvByName
78
79     , ModuleSet, emptyModuleSet, mkModuleSet, moduleSetElts, extendModuleSet, elemModuleSet
80
81     ) where
82
83 #include "HsVersions.h"
84 import OccName
85 import Outputable
86 import Packages         ( PackageName, basePackage, thPackage )
87 import CmdLineOpts      ( opt_InPackage )
88 import FastString       ( FastString )
89 import Unique           ( Uniquable(..) )
90 import Maybes           ( expectJust )
91 import UniqFM
92 import UniqSet
93 import Binary
94 import FastString
95 \end{code}
96
97
98 %************************************************************************
99 %*                                                                      *
100 \subsection{Interface file flavour}
101 %*                                                                      *
102 %************************************************************************
103
104 A further twist to the tale is the support for dynamically linked
105 libraries under Win32. Here, dealing with the use of global variables
106 that's residing in a DLL requires special handling at the point of use
107 (there's an extra level of indirection, i.e., (**v) to get at v's
108 value, rather than just (*v) .) When slurping in an interface file we
109 then record whether it's coming from a .hi corresponding to a module
110 that's packaged up in a DLL or not, so that we later can emit the
111 appropriate code.
112
113 The logic for how an interface file is marked as corresponding to a
114 module that's hiding in a DLL is explained elsewhere (ToDo: give
115 renamer href here.)
116
117 \begin{code}
118 data Module = Module ModuleName !PackageInfo
119
120 data PackageInfo
121   = ThisPackage                         -- A module from the same package 
122                                         -- as the one being compiled
123   | AnotherPackage                      -- A module from a different package
124
125 packageInfoPackage :: PackageInfo -> PackageName
126 packageInfoPackage ThisPackage        = opt_InPackage
127 packageInfoPackage AnotherPackage     = FSLIT("<pkg>")
128
129 instance Outputable PackageInfo where
130         -- Just used in debug prints of lex tokens and in debug modde
131    ppr pkg_info = ppr (packageInfoPackage pkg_info)
132 \end{code}
133
134
135 %************************************************************************
136 %*                                                                      *
137 \subsection{Module locations}
138 %*                                                                      *
139 %************************************************************************
140
141 \begin{code}
142 data ModLocation
143    = ModLocation {
144         ml_hs_file   :: Maybe FilePath,
145         ml_hspp_file :: Maybe FilePath,  -- path of preprocessed source
146         ml_hi_file   :: FilePath,
147         ml_obj_file  :: Maybe FilePath
148      }
149      deriving Show
150
151 instance Outputable ModLocation where
152    ppr = text . show
153
154 -- Rather a gruesome function to have in Module
155
156 showModMsg :: Bool -> Module -> ModLocation -> String
157 showModMsg use_object mod location =
158     mod_str ++ replicate (max 0 (16 - length mod_str)) ' '
159     ++" ( " ++ expectJust "showModMsg" (ml_hs_file location) ++ ", "
160     ++ (if use_object
161           then expectJust "showModMsg" (ml_obj_file location)
162           else "interpreted")
163     ++ " )"
164  where mod_str = moduleUserString mod
165 \end{code}
166
167 For a module in another package, the hs_file and obj_file
168 components of ModLocation are undefined.  
169
170 The locations specified by a ModLocation may or may not
171 correspond to actual files yet: for example, even if the object
172 file doesn't exist, the ModLocation still contains the path to
173 where the object file will reside if/when it is created.
174
175
176 %************************************************************************
177 %*                                                                      *
178 \subsection{The name of a module}
179 %*                                                                      *
180 %************************************************************************
181
182 \begin{code}
183 newtype ModuleName = ModuleName EncodedFS
184         -- Haskell module names can include the quote character ',
185         -- so the module names have the z-encoding applied to them
186
187 instance Binary ModuleName where
188    put_ bh (ModuleName m) = put_ bh m
189    get bh = do m <- get bh; return (ModuleName m)
190
191 instance Uniquable ModuleName where
192   getUnique (ModuleName nm) = getUnique nm
193
194 instance Eq ModuleName where
195   nm1 == nm2 = getUnique nm1 == getUnique nm2
196
197 -- Warning: gives an ordering relation based on the uniques of the
198 -- FastStrings which are the (encoded) module names.  This is _not_
199 -- a lexicographical ordering.
200 instance Ord ModuleName where
201   nm1 `compare` nm2 = getUnique nm1 `compare` getUnique nm2
202
203 instance Outputable ModuleName where
204   ppr = pprModuleName
205
206
207 pprModuleName :: ModuleName -> SDoc
208 pprModuleName (ModuleName nm) = pprEncodedFS nm
209
210 moduleNameFS :: ModuleName -> EncodedFS
211 moduleNameFS (ModuleName mod) = mod
212
213 moduleNameString :: ModuleName -> EncodedString
214 moduleNameString (ModuleName mod) = unpackFS mod
215
216 moduleNameUserString :: ModuleName -> UserString
217 moduleNameUserString (ModuleName mod) = decode (unpackFS mod)
218
219 -- used to be called mkSrcModule
220 mkModuleName :: UserString -> ModuleName
221 mkModuleName s = ModuleName (mkFastString (encode s))
222
223 -- used to be called mkSrcModuleFS
224 mkModuleNameFS :: UserFS -> ModuleName
225 mkModuleNameFS s = ModuleName (encodeFS s)
226
227 -- used to be called mkSysModuleFS
228 mkSysModuleNameFS :: EncodedFS -> ModuleName
229 mkSysModuleNameFS s = ModuleName s 
230 \end{code}
231
232 \begin{code}
233 instance Outputable Module where
234   ppr = pprModule
235
236 instance Uniquable Module where
237   getUnique (Module nm _) = getUnique nm
238
239 -- Same if they have the same name.
240 instance Eq Module where
241   m1 == m2 = getUnique m1 == getUnique m2
242
243 -- Warning: gives an ordering relation based on the uniques of the
244 -- FastStrings which are the (encoded) module names.  This is _not_
245 -- a lexicographical ordering.
246 instance Ord Module where
247   m1 `compare` m2 = getUnique m1 `compare` getUnique m2
248 \end{code}
249
250
251 \begin{code}
252 pprModule :: Module -> SDoc
253 pprModule (Module mod p) = getPprStyle $ \ sty ->
254                            if debugStyle sty then
255                                 -- Print the package too
256                                 -- Don't use '.' because it gets confused
257                                 --      with module names
258                                 brackets (ppr p) <> pprModuleName mod
259                            else
260                                 pprModuleName mod
261 \end{code}
262
263
264 \begin{code}
265 mkBasePkgModule :: ModuleName -> Module
266 mkBasePkgModule mod_nm
267   = Module mod_nm pack_info
268   where
269     pack_info
270       | opt_InPackage == basePackage = ThisPackage
271       | otherwise                    = AnotherPackage
272
273 mkThPkgModule :: ModuleName -> Module
274 mkThPkgModule mod_nm
275   = Module mod_nm pack_info
276   where
277     pack_info
278       | opt_InPackage == thPackage = ThisPackage
279       | otherwise                  = AnotherPackage
280
281 mkHomeModule :: ModuleName -> Module
282 mkHomeModule mod_nm = Module mod_nm ThisPackage
283
284 isHomeModule :: Module -> Bool
285 isHomeModule (Module nm ThisPackage) = True
286 isHomeModule _                       = False
287
288 mkPackageModule :: ModuleName -> Module
289 mkPackageModule mod_nm = Module mod_nm AnotherPackage
290
291 moduleString :: Module -> EncodedString
292 moduleString (Module (ModuleName fs) _) = unpackFS fs
293
294 moduleName :: Module -> ModuleName
295 moduleName (Module mod pkg_info) = mod
296
297 moduleUserString :: Module -> UserString
298 moduleUserString (Module mod _) = moduleNameUserString mod
299
300 printModulePrefix :: Module -> Bool
301   -- When printing, say M.x
302 printModulePrefix (Module nm ThisPackage) = False
303 printModulePrefix _                       = True
304 \end{code}
305
306
307 %************************************************************************
308 %*                                                                      *
309 \subsection{@ModuleEnv@s}
310 %*                                                                      *
311 %************************************************************************
312
313 \begin{code}
314 type ModuleEnv elt = UniqFM elt
315 -- A ModuleName and Module have the same Unique,
316 -- so both will work as keys.  
317 -- The 'ByName' variants work on ModuleNames
318
319 emptyModuleEnv       :: ModuleEnv a
320 mkModuleEnv          :: [(Module, a)] -> ModuleEnv a
321 unitModuleEnv        :: Module -> a -> ModuleEnv a
322 extendModuleEnv      :: ModuleEnv a -> Module -> a -> ModuleEnv a
323 extendModuleEnv_C    :: (a->a->a) -> ModuleEnv a -> Module -> a -> ModuleEnv a
324 plusModuleEnv        :: ModuleEnv a -> ModuleEnv a -> ModuleEnv a
325 extendModuleEnvList  :: ModuleEnv a -> [(Module, a)] -> ModuleEnv a
326                   
327 delModuleEnvList     :: ModuleEnv a -> [Module] -> ModuleEnv a
328 delModuleEnv         :: ModuleEnv a -> Module -> ModuleEnv a
329 plusModuleEnv_C      :: (a -> a -> a) -> ModuleEnv a -> ModuleEnv a -> ModuleEnv a
330 mapModuleEnv         :: (a -> b) -> ModuleEnv a -> ModuleEnv b
331 moduleEnvElts        :: ModuleEnv a -> [a]
332                   
333 isEmptyModuleEnv     :: ModuleEnv a -> Bool
334 lookupModuleEnv      :: ModuleEnv a -> Module     -> Maybe a
335 lookupWithDefaultModuleEnv :: ModuleEnv a -> a -> Module -> a
336 elemModuleEnv        :: Module -> ModuleEnv a -> Bool
337 foldModuleEnv        :: (a -> b -> b) -> b -> ModuleEnv a -> b
338
339 -- The ByName variants
340 lookupModuleEnvByName :: ModuleEnv a -> ModuleName -> Maybe a
341 unitModuleEnvByName   :: ModuleName -> a -> ModuleEnv a
342 extendModuleEnvByName :: ModuleEnv a -> ModuleName -> a -> ModuleEnv a
343
344 elemModuleEnv       = elemUFM
345 extendModuleEnv     = addToUFM
346 extendModuleEnvByName = addToUFM
347 extendModuleEnv_C   = addToUFM_C
348 extendModuleEnvList = addListToUFM
349 plusModuleEnv_C     = plusUFM_C
350 delModuleEnvList    = delListFromUFM
351 delModuleEnv        = delFromUFM
352 plusModuleEnv       = plusUFM
353 lookupModuleEnv     = lookupUFM
354 lookupModuleEnvByName = lookupUFM
355 lookupWithDefaultModuleEnv = lookupWithDefaultUFM
356 mapModuleEnv        = mapUFM
357 mkModuleEnv         = listToUFM
358 emptyModuleEnv      = emptyUFM
359 moduleEnvElts       = eltsUFM
360 unitModuleEnv       = unitUFM
361 unitModuleEnvByName = unitUFM
362 isEmptyModuleEnv    = isNullUFM
363 foldModuleEnv       = foldUFM
364 \end{code}
365
366 \begin{code}
367
368 type ModuleSet = UniqSet Module
369 mkModuleSet     :: [Module] -> ModuleSet
370 extendModuleSet :: ModuleSet -> Module -> ModuleSet
371 emptyModuleSet  :: ModuleSet
372 moduleSetElts   :: ModuleSet -> [Module]
373 elemModuleSet   :: Module -> ModuleSet -> Bool
374
375 emptyModuleSet  = emptyUniqSet
376 mkModuleSet     = mkUniqSet
377 extendModuleSet = addOneToUniqSet
378 moduleSetElts   = uniqSetToList
379 elemModuleSet   = elementOfUniqSet
380 \end{code}