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 -- abstract, instance of Eq, Ord, Outputable
27 , moduleNameString -- :: ModuleName -> EncodedString
28 , moduleNameUserString -- :: ModuleName -> UserString
30 , moduleString -- :: Module -> EncodedString
31 , moduleUserString -- :: Module -> UserString
32 , moduleName -- :: Module -> ModuleName
34 , mkVanillaModule -- :: ModuleName -> Module
35 , mkThisModule -- :: ModuleName -> Module
36 , mkPrelModule -- :: UserString -> Module
37 , mkModule -- :: ModuleName -> PackageName -> Module
39 , isLocalModule -- :: Module -> Bool
43 , mkSrcModuleFS -- :: UserFS -> ModuleName
44 , mkSysModuleFS -- :: EncodedFS -> ModuleName
46 , pprModule, pprModuleName
50 -- Where to find a .hi file
55 #include "HsVersions.h"
58 import CmdLineOpts ( opt_InPackage )
59 import FastString ( FastString )
63 %************************************************************************
65 \subsection{Interface file flavour}
67 %************************************************************************
69 A further twist to the tale is the support for dynamically linked libraries under
70 Win32. Here, dealing with the use of global variables that's residing in a DLL
71 requires special handling at the point of use (there's an extra level of indirection,
72 i.e., (**v) to get at v's value, rather than just (*v) .) When slurping in an
73 interface file we then record whether it's coming from a .hi corresponding to a
74 module that's packaged up in a DLL or not, so that we later can emit the
77 The logic for how an interface file is marked as corresponding to a module that's
78 hiding in a DLL is explained elsewhere (ToDo: give renamer href here.)
81 data PackageInfo = ThisPackage -- A module from the same package
82 -- as the one being compiled
83 | AnotherPackage PackageName -- A module from a different package
85 type PackageName = FastString -- No encoding at all
87 preludePackage :: PackageName
88 preludePackage = SLIT("std")
90 instance Show PackageInfo where -- Just used in debug prints of lex tokens
92 showsPrec n ThisPackage s = "<THIS>" ++ s
93 showsPrec n (AnotherPackage p) s = (_UNPK_ p) ++ s
97 %************************************************************************
99 \subsection{Where from}
101 %************************************************************************
103 The @WhereFrom@ type controls where the renamer looks for an interface file
106 data WhereFrom = ImportByUser -- Ordinary user import: look for M.hi
107 | ImportByUserSource -- User {- SOURCE -}: look for M.hi-boot
108 | ImportBySystem -- Non user import. Look for M.hi if M is in
109 -- the module this module depends on, or is a system-ish module;
110 -- M.hi-boot otherwise
112 instance Outputable WhereFrom where
113 ppr ImportByUser = empty
114 ppr ImportByUserSource = ptext SLIT("{- SOURCE -}")
115 ppr ImportBySystem = ptext SLIT("{- SYSTEM IMPORT -}")
119 %************************************************************************
121 \subsection{The name of a module}
123 %************************************************************************
126 type ModuleName = EncodedFS
127 -- Haskell module names can include the quote character ',
128 -- so the module names have the z-encoding applied to them
130 pprModuleName :: ModuleName -> SDoc
131 pprModuleName nm = pprEncodedFS nm
133 moduleNameString :: ModuleName -> EncodedString
134 moduleNameString mod = _UNPK_ mod
136 moduleNameUserString :: ModuleName -> UserString
137 moduleNameUserString mod = decode (_UNPK_ mod)
139 mkSrcModule :: UserString -> ModuleName
140 mkSrcModule s = _PK_ (encode s)
142 mkSrcModuleFS :: UserFS -> ModuleName
143 mkSrcModuleFS s = encodeFS s
145 mkSysModuleFS :: EncodedFS -> ModuleName
150 data Module = Module ModuleName PackageInfo
154 instance Outputable Module where
157 instance Eq Module where
158 (Module m1 _) == (Module m2 _) = m1 == m2
160 instance Ord Module where
161 (Module m1 _) `compare` (Module m2 _) = m1 `compare` m2
166 pprModule :: Module -> SDoc
167 pprModule (Module mod p) = getPprStyle $ \ sty ->
168 if debugStyle sty then
169 -- Print the package too
170 text (show p) <> dot <> pprModuleName mod
177 mkModule :: ModuleName -- Name of the module
180 mkModule mod_nm pack_name
181 = Module mod_nm pack_info
183 pack_info | pack_name == opt_InPackage = ThisPackage
184 | otherwise = AnotherPackage pack_name
187 mkVanillaModule :: ModuleName -> Module
188 mkVanillaModule name = Module name ThisPackage
189 -- Used temporarily when we first come across Foo.x in an interface
190 -- file, but before we've opened Foo.hi.
191 -- (Until we've opened Foo.hi we don't know what the PackageInfo is.)
193 mkThisModule :: ModuleName -> Module -- The module being compiled
194 mkThisModule name = Module name ThisPackage
196 mkPrelModule :: ModuleName -> Module
197 mkPrelModule name = mkModule name preludePackage
199 moduleString :: Module -> EncodedString
200 moduleString (Module mod _) = _UNPK_ mod
202 moduleName :: Module -> ModuleName
203 moduleName (Module mod _) = mod
205 moduleUserString :: Module -> UserString
206 moduleUserString (Module mod _) = moduleNameUserString mod
210 isLocalModule :: Module -> Bool
211 isLocalModule (Module _ ThisPackage) = True
212 isLocalModule _ = False