[project @ 2000-11-02 13:58:44 by sewardj]
[ghc-hetmet.git] / ghc / compiler / basicTypes / Module.lhs
1 %
2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
3 %
4 \section[Module]{The @Module@ module.}
5
6 Representing modules and their flavours.
7
8
9 Notes on DLLs
10 ~~~~~~~~~~~~~
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.
17
18
19
20
21 \begin{code}
22 module Module 
23     (
24       Module, moduleName, packageOfModule,
25                             -- abstract, instance of Eq, Ord, Outputable
26     , ModuleName
27     , isModuleInThisPackage, mkModuleInThisPackage,
28     , printModulePrefix
29
30     , moduleNameString          -- :: ModuleName -> EncodedString
31     , moduleNameUserString      -- :: ModuleName -> UserString
32     , moduleNameFS              -- :: ModuleName -> EncodedFS
33
34     , moduleString              -- :: Module -> EncodedString
35     , moduleUserString          -- :: Module -> UserString
36     , moduleName                -- :: Module -> ModuleName
37
38     , mkVanillaModule           -- :: ModuleName -> Module
39     , mkPrelModule              -- :: UserString -> Module
40     , mkModule                  -- :: ModuleName -> PackageName -> Module
41     , mkHomeModule              -- :: ModuleName -> Module
42
43 --    , mkSrcModule
44
45     , mkModuleName              -- :: UserString -> ModuleName
46     , mkModuleNameFS            -- :: UserFS    -> ModuleName
47     , mkSysModuleNameFS         -- :: EncodedFS -> ModuleName
48
49     , pprModule,
50  
51     , PackageName
52
53         -- Where to find a .hi file
54     , WhereFrom(..)
55
56     , ModuleEnv,
57     , elemModuleEnv, extendModuleEnv, extendModuleEnvList, plusModuleEnv_C
58     , delModuleEnvList, delModuleEnv, plusModuleEnv, lookupModuleEnv
59     , lookupWithDefaultModuleEnv, mapModuleEnv, mkModuleEnv, emptyModuleEnv
60     , moduleEnvElts, unitModuleEnv, isEmptyModuleEnv, foldModuleEnv
61     , lookupModuleEnvByName, extendModuleEnv_C
62
63     , ModuleSet, emptyModuleSet, mkModuleSet, moduleSetElts, extendModuleSet, elemModuleSet
64
65     ) where
66
67 #include "HsVersions.h"
68 import OccName
69 import Outputable
70 import CmdLineOpts      ( opt_InPackage )
71 import FastString       ( FastString, uniqueOfFS )
72 import Unique           ( Uniquable(..), mkUniqueGrimily )
73 import UniqFM
74 import UniqSet
75 \end{code}
76
77
78 %************************************************************************
79 %*                                                                      *
80 \subsection{Interface file flavour}
81 %*                                                                      *
82 %************************************************************************
83
84 A further twist to the tale is the support for dynamically linked
85 libraries under Win32. Here, dealing with the use of global variables
86 that's residing in a DLL requires special handling at the point of use
87 (there's an extra level of indirection, i.e., (**v) to get at v's
88 value, rather than just (*v) .) When slurping in an interface file we
89 then record whether it's coming from a .hi corresponding to a module
90 that's packaged up in a DLL or not, so that we later can emit the
91 appropriate code.
92
93 The logic for how an interface file is marked as corresponding to a
94 module that's hiding in a DLL is explained elsewhere (ToDo: give
95 renamer href here.)
96
97 \begin{code}
98 data Module = Module ModuleName PackageInfo
99
100 data PackageInfo 
101   = ThisPackage                         -- A module from the same package 
102                                         -- as the one being compiled
103   | AnotherPackage PackageName          -- A module from a different package
104
105   | DunnoYet    -- This is used when we don't yet know
106                 -- Main case: we've come across Foo.x in an interface file
107                 -- but we havn't yet opened Foo.hi.  We need a Name for Foo.x
108                 -- Later on (in RnEnv.newTopBinder) we'll update the cache
109                 -- to have the right PackageInfo
110
111 type PackageName = FastString           -- No encoding at all
112
113 preludePackage :: PackageName
114 preludePackage = SLIT("std")
115
116 instance Outputable PackageInfo where
117         -- Just used in debug prints of lex tokens and in debug modde
118    ppr ThisPackage        = ptext SLIT("<THIS>")
119    ppr DunnoYet           = ptext SLIT("<?>")
120    ppr (AnotherPackage p) = ptext p
121 \end{code}
122
123
124 %************************************************************************
125 %*                                                                      *
126 \subsection{Where from}
127 %*                                                                      *
128 %************************************************************************
129
130 The @WhereFrom@ type controls where the renamer looks for an interface file
131
132 \begin{code}
133 data WhereFrom = ImportByUser           -- Ordinary user import: look for M.hi
134                | ImportByUserSource     -- User {- SOURCE -}: look for M.hi-boot
135                | ImportBySystem         -- Non user import.  Look for M.hi if M is in
136                                         -- the module this module depends on, or is a system-ish module; 
137                                         -- M.hi-boot otherwise
138
139 instance Outputable WhereFrom where
140   ppr ImportByUser       = empty
141   ppr ImportByUserSource = ptext SLIT("{- SOURCE -}")
142   ppr ImportBySystem     = ptext SLIT("{- SYSTEM IMPORT -}")
143 \end{code}
144
145
146 %************************************************************************
147 %*                                                                      *
148 \subsection{The name of a module}
149 %*                                                                      *
150 %************************************************************************
151
152 \begin{code}
153 newtype ModuleName = ModuleName EncodedFS
154         -- Haskell module names can include the quote character ',
155         -- so the module names have the z-encoding applied to them
156
157 instance Uniquable ModuleName where
158   getUnique (ModuleName nm) = mkUniqueGrimily (uniqueOfFS nm)
159
160 instance Eq ModuleName where
161   nm1 == nm2 = getUnique nm1 == getUnique nm2
162
163 -- Warning: gives an ordering relation based on the uniques of the
164 -- FastStrings which are the (encoded) module names.  This is _not_
165 -- a lexicographical ordering.
166 instance Ord ModuleName where
167   nm1 `compare` nm2 = getUnique nm1 `compare` getUnique nm2
168
169 instance Outputable ModuleName where
170   ppr = pprModuleName
171
172
173 pprModuleName :: ModuleName -> SDoc
174 pprModuleName (ModuleName nm) = pprEncodedFS nm
175
176 moduleNameFS :: ModuleName -> EncodedFS
177 moduleNameFS (ModuleName mod) = mod
178
179 moduleNameString :: ModuleName -> EncodedString
180 moduleNameString (ModuleName mod) = _UNPK_ mod
181
182 moduleNameUserString :: ModuleName -> UserString
183 moduleNameUserString (ModuleName mod) = decode (_UNPK_ mod)
184
185 -- used to be called mkSrcModule
186 mkModuleName :: UserString -> ModuleName
187 mkModuleName s = ModuleName (_PK_ (encode s))
188
189 -- used to be called mkSrcModuleFS
190 mkModuleNameFS :: UserFS -> ModuleName
191 mkModuleNameFS s = ModuleName (encodeFS s)
192
193 -- used to be called mkSysModuleFS
194 mkSysModuleNameFS :: EncodedFS -> ModuleName
195 mkSysModuleNameFS s = ModuleName s 
196
197 -- Make a module in this package
198 mkModuleInThisPackage :: ModuleName -> Module
199 mkModuleInThisPackage nm = Module nm ThisPackage
200 \end{code}
201
202 \begin{code}
203 instance Outputable Module where
204   ppr = pprModule
205
206 instance Uniquable Module where
207   getUnique (Module nm _) = getUnique nm
208
209 -- Same if they have the same name.
210 instance Eq Module where
211   m1 == m2 = getUnique m1 == getUnique m2
212
213 -- Warning: gives an ordering relation based on the uniques of the
214 -- FastStrings which are the (encoded) module names.  This is _not_
215 -- a lexicographical ordering.
216 instance Ord Module where
217   m1 `compare` m2 = getUnique m1 `compare` getUnique m2
218 \end{code}
219
220
221 \begin{code}
222 pprModule :: Module -> SDoc
223 pprModule (Module mod p) = getPprStyle $ \ sty ->
224                            if debugStyle sty then
225                                 -- Print the package too
226                                 ppr p <> dot <> pprModuleName mod
227                            else
228                                 pprModuleName mod
229 \end{code}
230
231
232 \begin{code}
233 mkModule :: ModuleName  -- Name of the module
234          -> PackageName
235          -> Module
236 mkModule mod_nm pack_name
237   = Module mod_nm pack_info
238   where
239     pack_info | pack_name == opt_InPackage = ThisPackage
240               | otherwise                  = AnotherPackage pack_name
241
242 mkHomeModule :: ModuleName -> Module
243 mkHomeModule mod_nm = Module mod_nm ThisPackage
244
245 -- Used temporarily when we first come across Foo.x in an interface
246 -- file, but before we've opened Foo.hi.
247 -- (Until we've opened Foo.hi we don't know what the PackageInfo is.)
248 mkVanillaModule :: ModuleName -> Module
249 mkVanillaModule name = Module name DunnoYet
250
251 mkPrelModule :: ModuleName -> Module
252 mkPrelModule name = mkModule name preludePackage
253
254 moduleString :: Module -> EncodedString
255 moduleString (Module (ModuleName fs) _) = _UNPK_ fs
256
257 moduleName :: Module -> ModuleName
258 moduleName (Module mod pkg_info) = mod
259
260 moduleUserString :: Module -> UserString
261 moduleUserString (Module mod _) = moduleNameUserString mod
262
263 isModuleInThisPackage :: Module -> Bool
264 isModuleInThisPackage (Module nm ThisPackage) = True
265 isModuleInThisPackage _                       = False
266
267 packageOfModule :: Module -> Maybe PackageName
268 packageOfModule (Module nm (AnotherPackage pn)) = Just pn
269 packageOfModule _                               = Nothing
270
271 printModulePrefix :: Module -> Bool
272   -- When printing, say M.x
273 printModulePrefix (Module nm ThisPackage) = False
274 printModulePrefix _                       = True
275 \end{code}
276
277
278 %************************************************************************
279 %*                                                                      *
280 \subsection{@ModuleEnv@s}
281 %*                                                                      *
282 %************************************************************************
283
284 \begin{code}
285 type ModuleEnv elt = UniqFM elt
286
287 emptyModuleEnv       :: ModuleEnv a
288 mkModuleEnv          :: [(Module, a)] -> ModuleEnv a
289 unitModuleEnv        :: Module -> a -> ModuleEnv a
290 extendModuleEnv      :: ModuleEnv a -> Module -> a -> ModuleEnv a
291 extendModuleEnv_C    :: (a->a->a) -> ModuleEnv a -> Module -> a -> ModuleEnv a
292 plusModuleEnv        :: ModuleEnv a -> ModuleEnv a -> ModuleEnv a
293 extendModuleEnvList  :: ModuleEnv a -> [(Module, a)] -> ModuleEnv a
294                   
295 delModuleEnvList     :: ModuleEnv a -> [Module] -> ModuleEnv a
296 delModuleEnv         :: ModuleEnv a -> Module -> ModuleEnv a
297 plusModuleEnv_C      :: (a -> a -> a) -> ModuleEnv a -> ModuleEnv a -> ModuleEnv a
298 mapModuleEnv         :: (a -> b) -> ModuleEnv a -> ModuleEnv b
299 moduleEnvElts        :: ModuleEnv a -> [a]
300                   
301 isEmptyModuleEnv     :: ModuleEnv a -> Bool
302 lookupModuleEnv      :: ModuleEnv a -> Module     -> Maybe a
303 lookupModuleEnvByName:: ModuleEnv a -> ModuleName -> Maybe a
304 lookupWithDefaultModuleEnv :: ModuleEnv a -> a -> Module -> a
305 elemModuleEnv        :: Module -> ModuleEnv a -> Bool
306 foldModuleEnv        :: (a -> b -> b) -> b -> ModuleEnv a -> b
307
308 elemModuleEnv       = elemUFM
309 extendModuleEnv     = addToUFM
310 extendModuleEnv_C   = addToUFM_C
311 extendModuleEnvList = addListToUFM
312 plusModuleEnv_C     = plusUFM_C
313 delModuleEnvList    = delListFromUFM
314 delModuleEnv        = delFromUFM
315 plusModuleEnv       = plusUFM
316 lookupModuleEnv     = lookupUFM
317 lookupModuleEnvByName = lookupUFM
318 lookupWithDefaultModuleEnv = lookupWithDefaultUFM
319 mapModuleEnv        = mapUFM
320 mkModuleEnv         = listToUFM
321 emptyModuleEnv      = emptyUFM
322 moduleEnvElts       = eltsUFM
323 unitModuleEnv       = unitUFM
324 isEmptyModuleEnv    = isNullUFM
325 foldModuleEnv       = foldUFM
326 \end{code}
327
328 \begin{code}
329
330 type ModuleSet = UniqSet Module
331 mkModuleSet     :: [Module] -> ModuleSet
332 extendModuleSet :: ModuleSet -> Module -> ModuleSet
333 emptyModuleSet  :: ModuleSet
334 moduleSetElts   :: ModuleSet -> [Module]
335 elemModuleSet   :: Module -> ModuleSet -> Bool
336
337 emptyModuleSet  = emptyUniqSet
338 mkModuleSet     = mkUniqSet
339 extendModuleSet = addOneToUniqSet
340 moduleSetElts   = uniqSetToList
341 elemModuleSet   = elementOfUniqSet
342 \end{code}