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, mod_name, mod_kind
25 -- abstract, instance of Eq, Ord, Outputable
30 , moduleNameString -- :: ModuleName -> EncodedString
31 , moduleNameUserString -- :: ModuleName -> UserString
32 , moduleNameFS -- :: ModuleName -> EncodedFS
34 , moduleString -- :: Module -> EncodedString
35 , moduleUserString -- :: Module -> UserString
36 , moduleName -- :: Module -> ModuleName
38 , mkVanillaModule -- :: ModuleName -> Module
39 -- , mkThisModule -- :: ModuleName -> Module
40 , mkPrelModule -- :: UserString -> Module
41 , mkModule -- :: ModuleName -> ModuleKind -> Module
42 , isLocalModule -- :: Module -> Bool
46 , mkModuleName -- :: UserString -> ModuleName
47 , mkModuleNameFS -- :: UserFS -> ModuleName
48 , mkSysModuleNameFS -- :: EncodedFS -> ModuleName
54 -- Where to find a .hi file
58 , elemModuleEnv, extendModuleEnv, extendModuleEnvList, plusModuleEnv_C
59 , delModuleEnvList, delModuleEnv, plusModuleEnv, lookupModuleEnv
60 , lookupWithDefaultModuleEnv, mapModuleEnv, mkModuleEnv, emptyModuleEnv
61 , rngModuleEnv, unitModuleEnv, isEmptyModuleEnv, foldModuleEnv
65 #include "HsVersions.h"
68 import CmdLineOpts ( opt_InPackage )
69 import FastString ( FastString, uniqueOfFS )
70 import Unique ( Uniquable(..), mkUniqueGrimily )
75 %************************************************************************
77 \subsection{Interface file flavour}
79 %************************************************************************
81 A further twist to the tale is the support for dynamically linked libraries under
82 Win32. Here, dealing with the use of global variables that's residing in a DLL
83 requires special handling at the point of use (there's an extra level of indirection,
84 i.e., (**v) to get at v's value, rather than just (*v) .) When slurping in an
85 interface file we then record whether it's coming from a .hi corresponding to a
86 module that's packaged up in a DLL or not, so that we later can emit the
89 The logic for how an interface file is marked as corresponding to a module that's
90 hiding in a DLL is explained elsewhere (ToDo: give renamer href here.)
92 @SourceOnly@ and @ObjectCode@ indicate a module from the same package
93 as the one being compiled, i.e. a home module. @InPackage@ means one
94 from a different package.
98 = SourceOnly FilePath -- .hs
99 | ObjectCode FilePath FilePath -- .o, .hi
100 | InPackage PackageName
102 isLocalModuleKind (InPackage _) = False
103 isLocalModuleKind _ = True
105 type PackageName = FastString -- No encoding at all
107 preludePackage :: ModuleKind
108 preludePackage = InPackage SLIT("std")
110 instance Outputable ModuleKind where
111 ppr (SourceOnly path_hs)
112 = text "SourceOnly" <+> text (show path_hs)
113 ppr (ObjectCode path_o path_hi)
114 = text "ObjectCode" <+> text (show path_o) <+> text (show path_hi)
115 ppr (InPackage pkgname)
116 = text "InPackage" <+> text (show pkgname)
120 %************************************************************************
122 \subsection{Where from}
124 %************************************************************************
126 The @WhereFrom@ type controls where the renamer looks for an interface file
129 data WhereFrom = ImportByUser -- Ordinary user import: look for M.hi
130 | ImportByUserSource -- User {- SOURCE -}: look for M.hi-boot
131 | ImportBySystem -- Non user import. Look for M.hi if M is in
132 -- the module this module depends on, or is a system-ish module;
133 -- M.hi-boot otherwise
135 instance Outputable WhereFrom where
136 ppr ImportByUser = empty
137 ppr ImportByUserSource = ptext SLIT("{- SOURCE -}")
138 ppr ImportBySystem = ptext SLIT("{- SYSTEM IMPORT -}")
142 %************************************************************************
144 \subsection{The name of a module}
146 %************************************************************************
149 newtype ModuleName = ModuleName EncodedFS
150 -- Haskell module names can include the quote character ',
151 -- so the module names have the z-encoding applied to them
153 instance Uniquable ModuleName where
154 getUnique (ModuleName nm) = mkUniqueGrimily (uniqueOfFS nm)
156 instance Eq ModuleName where
157 nm1 == nm2 = getUnique nm1 == getUnique nm2
159 -- Warning: gives an ordering relation based on the uniques of the
160 -- FastStrings which are the (encoded) module names. This is _not_
161 -- a lexicographical ordering.
162 instance Ord ModuleName where
163 nm1 `compare` nm2 = getUnique nm1 `compare` getUnique nm2
165 instance Outputable ModuleName where
169 pprModuleName :: ModuleName -> SDoc
170 pprModuleName (ModuleName nm) = pprEncodedFS nm
172 moduleNameFS :: ModuleName -> EncodedFS
173 moduleNameFS (ModuleName mod) = mod
175 moduleNameString :: ModuleName -> EncodedString
176 moduleNameString (ModuleName mod) = _UNPK_ mod
178 moduleNameUserString :: ModuleName -> UserString
179 moduleNameUserString (ModuleName mod) = decode (_UNPK_ mod)
181 -- used to be called mkSrcModule
182 mkModuleName :: UserString -> ModuleName
183 mkModuleName s = ModuleName (_PK_ (encode s))
185 -- used to be called mkSrcModuleFS
186 mkModuleNameFS :: UserFS -> ModuleName
187 mkModuleNameFS s = ModuleName (encodeFS s)
189 -- used to be called mkSysModuleFS
190 mkSysModuleNameFS :: EncodedFS -> ModuleName
191 mkSysModuleNameFS s = ModuleName s
195 data Module = Module ModuleName ModuleKind
197 mod_name (Module nm kind) = nm
198 mod_kind (Module nm kind) = kind
202 instance Outputable Module where
205 instance Uniquable Module where
206 getUnique (Module nm _) = getUnique nm
208 -- Same if they have the same name.
209 instance Eq Module where
210 m1 == m2 = getUnique m1 == getUnique m2
212 -- Warning: gives an ordering relation based on the uniques of the
213 -- FastStrings which are the (encoded) module names. This is _not_
214 -- a lexicographical ordering.
215 instance Ord Module where
216 m1 `compare` m2 = getUnique m1 `compare` getUnique m2
221 pprModule :: Module -> SDoc
222 pprModule (Module mod p) = getPprStyle $ \ sty ->
223 if debugStyle sty then
224 -- Print the package too
225 ppr p <> dot <> pprModuleName mod
232 mkModule :: ModuleName -> ModuleKind -> Module
234 -- I don't think anybody except the Finder should ever try to create a
235 -- Module now, so this lot commented out pro tem (JRS)
236 --mkModule :: ModuleName -- Name of the module
239 --mkModule mod_nm pack_name
240 -- = Module mod_nm pack_info
242 -- pack_info | pack_name == opt_InPackage = ThisPackage
243 -- | otherwise = AnotherPackage pack_name
246 -- Used temporarily when we first come across Foo.x in an interface
247 -- file, but before we've opened Foo.hi.
248 -- (Until we've opened Foo.hi we don't know what the PackageInfo is.)
249 mkVanillaModule :: ModuleName -> Module
250 mkVanillaModule name = Module name (panic "mkVanillaModule:unknown mod_kind field")
252 --mkThisModule :: ModuleName -> Module -- The module being compiled
253 --mkThisModule name = Module name ThisPackage
255 mkPrelModule :: ModuleName -> Module
256 mkPrelModule name = Module name preludePackage
258 moduleString :: Module -> EncodedString
259 moduleString (Module (ModuleName fs) _) = _UNPK_ fs
261 moduleName :: Module -> ModuleName
262 moduleName (Module mod _) = mod
264 moduleUserString :: Module -> UserString
265 moduleUserString (Module mod _) = moduleNameUserString mod
267 isLocalModule :: Module -> Bool
268 isLocalModule (Module nm kind) = isLocalModuleKind kind
271 %************************************************************************
273 \subsection{@ModuleEnv@s}
275 %************************************************************************
278 type ModuleEnv elt = UniqFM elt
280 emptyModuleEnv :: ModuleEnv a
281 mkModuleEnv :: [(Module, a)] -> ModuleEnv a
282 unitModuleEnv :: Module -> a -> ModuleEnv a
283 extendModuleEnv :: ModuleEnv a -> Module -> a -> ModuleEnv a
284 plusModuleEnv :: ModuleEnv a -> ModuleEnv a -> ModuleEnv a
285 extendModuleEnvList :: ModuleEnv a -> [(Module, a)] -> ModuleEnv a
287 delModuleEnvList :: ModuleEnv a -> [Module] -> ModuleEnv a
288 delModuleEnv :: ModuleEnv a -> Module -> ModuleEnv a
289 plusModuleEnv_C :: (a -> a -> a) -> ModuleEnv a -> ModuleEnv a -> ModuleEnv a
290 mapModuleEnv :: (a -> b) -> ModuleEnv a -> ModuleEnv b
291 rngModuleEnv :: ModuleEnv a -> [a]
293 isEmptyModuleEnv :: ModuleEnv a -> Bool
294 lookupModuleEnv :: ModuleEnv a -> Module -> Maybe a
295 lookupWithDefaultModuleEnv :: ModuleEnv a -> a -> Module -> a
296 elemModuleEnv :: Module -> ModuleEnv a -> Bool
297 foldModuleEnv :: (a -> b -> b) -> b -> ModuleEnv a -> b
299 elemModuleEnv = elemUFM
300 extendModuleEnv = addToUFM
301 extendModuleEnvList = addListToUFM
302 plusModuleEnv_C = plusUFM_C
303 delModuleEnvList = delListFromUFM
304 delModuleEnv = delFromUFM
305 plusModuleEnv = plusUFM
306 lookupModuleEnv = lookupUFM
307 lookupWithDefaultModuleEnv = lookupWithDefaultUFM
308 mapModuleEnv = mapUFM
309 mkModuleEnv = listToUFM
310 emptyModuleEnv = emptyUFM
311 rngModuleEnv = eltsUFM
312 unitModuleEnv = unitUFM
313 isEmptyModuleEnv = isNullUFM
314 foldModuleEnv = foldUFM