2 % (c) The University of Glasgow, 2004
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
14 Module, -- Abstract, instance of Eq, Ord, Outputable
15 , pprModule -- :: ModuleName -> SDoc
20 , moduleString -- :: ModuleName -> EncodedString
21 , moduleUserString -- :: ModuleName -> UserString
22 , moduleFS -- :: ModuleName -> EncodedFS
24 , mkModule -- :: UserString -> ModuleName
25 , mkModuleFS -- :: UserFS -> ModuleName
26 , mkSysModuleFS -- :: EncodedFS -> ModuleName
29 , elemModuleEnv, extendModuleEnv, extendModuleEnvList, plusModuleEnv_C
30 , delModuleEnvList, delModuleEnv, plusModuleEnv, lookupModuleEnv
31 , lookupWithDefaultModuleEnv, mapModuleEnv, mkModuleEnv, emptyModuleEnv
32 , moduleEnvElts, unitModuleEnv, isEmptyModuleEnv, foldModuleEnv
35 , ModuleSet, emptyModuleSet, mkModuleSet, moduleSetElts, extendModuleSet, elemModuleSet
39 #include "HsVersions.h"
42 import Unique ( Uniquable(..) )
43 import Maybes ( expectJust )
50 %************************************************************************
52 \subsection{Module locations}
54 %************************************************************************
59 ml_hs_file :: Maybe FilePath,
61 ml_hspp_file :: Maybe FilePath, -- Path of preprocessed source
63 ml_hi_file :: FilePath, -- Where the .hi file is, whether or not it exists
64 -- Always of form foo.hi, even if there is an hi-boot
65 -- file (we add the -boot suffix later)
67 ml_obj_file :: FilePath -- Where the .o file is, whether or not it exists
68 -- (might not exist either because the module
69 -- hasn't been compiled yet, or because
70 -- it is part of a package with a .a file)
74 instance Outputable ModLocation where
77 -- Rather a gruesome function to have in Module
79 showModMsg :: Bool -> Module -> ModLocation -> String
80 showModMsg use_object mod location =
81 mod_str ++ replicate (max 0 (16 - length mod_str)) ' '
82 ++" ( " ++ expectJust "showModMsg" (ml_hs_file location) ++ ", "
84 then ml_obj_file location
87 where mod_str = moduleUserString mod
90 For a module in another package, the hs_file and obj_file
91 components of ModLocation are undefined.
93 The locations specified by a ModLocation may or may not
94 correspond to actual files yet: for example, even if the object
95 file doesn't exist, the ModLocation still contains the path to
96 where the object file will reside if/when it is created.
99 %************************************************************************
101 \subsection{The name of a module}
103 %************************************************************************
106 newtype Module = Module EncodedFS
107 -- Haskell module names can include the quote character ',
108 -- so the module names have the z-encoding applied to them
110 instance Binary Module where
111 put_ bh (Module m) = put_ bh m
112 get bh = do m <- get bh; return (Module m)
114 instance Uniquable Module where
115 getUnique (Module nm) = getUnique nm
117 instance Eq Module where
118 nm1 == nm2 = getUnique nm1 == getUnique nm2
120 -- Warning: gives an ordering relation based on the uniques of the
121 -- FastStrings which are the (encoded) module names. This is _not_
122 -- a lexicographical ordering.
123 instance Ord Module where
124 nm1 `compare` nm2 = getUnique nm1 `compare` getUnique nm2
126 instance Outputable Module where
130 pprModule :: Module -> SDoc
131 pprModule (Module nm) = pprEncodedFS nm
133 moduleFS :: Module -> EncodedFS
134 moduleFS (Module mod) = mod
136 moduleString :: Module -> EncodedString
137 moduleString (Module mod) = unpackFS mod
139 moduleUserString :: Module -> UserString
140 moduleUserString (Module mod) = decode (unpackFS mod)
142 -- used to be called mkSrcModule
143 mkModule :: UserString -> Module
144 mkModule s = Module (mkFastString (encode s))
146 -- used to be called mkSrcModuleFS
147 mkModuleFS :: UserFS -> Module
148 mkModuleFS s = Module (encodeFS s)
150 -- used to be called mkSysModuleFS
151 mkSysModuleFS :: EncodedFS -> Module
152 mkSysModuleFS s = Module s
155 %************************************************************************
157 \subsection{@ModuleEnv@s}
159 %************************************************************************
162 type ModuleEnv elt = UniqFM elt
164 emptyModuleEnv :: ModuleEnv a
165 mkModuleEnv :: [(Module, a)] -> ModuleEnv a
166 unitModuleEnv :: Module -> a -> ModuleEnv a
167 extendModuleEnv :: ModuleEnv a -> Module -> a -> ModuleEnv a
168 extendModuleEnv_C :: (a->a->a) -> ModuleEnv a -> Module -> a -> ModuleEnv a
169 plusModuleEnv :: ModuleEnv a -> ModuleEnv a -> ModuleEnv a
170 extendModuleEnvList :: ModuleEnv a -> [(Module, a)] -> ModuleEnv a
172 delModuleEnvList :: ModuleEnv a -> [Module] -> ModuleEnv a
173 delModuleEnv :: ModuleEnv a -> Module -> ModuleEnv a
174 plusModuleEnv_C :: (a -> a -> a) -> ModuleEnv a -> ModuleEnv a -> ModuleEnv a
175 mapModuleEnv :: (a -> b) -> ModuleEnv a -> ModuleEnv b
176 moduleEnvElts :: ModuleEnv a -> [a]
178 isEmptyModuleEnv :: ModuleEnv a -> Bool
179 lookupModuleEnv :: ModuleEnv a -> Module -> Maybe a
180 lookupWithDefaultModuleEnv :: ModuleEnv a -> a -> Module -> a
181 elemModuleEnv :: Module -> ModuleEnv a -> Bool
182 foldModuleEnv :: (a -> b -> b) -> b -> ModuleEnv a -> b
184 elemModuleEnv = elemUFM
185 extendModuleEnv = addToUFM
186 extendModuleEnv_C = addToUFM_C
187 extendModuleEnvList = addListToUFM
188 plusModuleEnv_C = plusUFM_C
189 delModuleEnvList = delListFromUFM
190 delModuleEnv = delFromUFM
191 plusModuleEnv = plusUFM
192 lookupModuleEnv = lookupUFM
193 lookupWithDefaultModuleEnv = lookupWithDefaultUFM
194 mapModuleEnv = mapUFM
195 mkModuleEnv = listToUFM
196 emptyModuleEnv = emptyUFM
197 moduleEnvElts = eltsUFM
198 unitModuleEnv = unitUFM
199 isEmptyModuleEnv = isNullUFM
200 foldModuleEnv = foldUFM
204 type ModuleSet = UniqSet Module
205 mkModuleSet :: [Module] -> ModuleSet
206 extendModuleSet :: ModuleSet -> Module -> ModuleSet
207 emptyModuleSet :: ModuleSet
208 moduleSetElts :: ModuleSet -> [Module]
209 elemModuleSet :: Module -> ModuleSet -> Bool
211 emptyModuleSet = emptyUniqSet
212 mkModuleSet = mkUniqSet
213 extendModuleSet = addOneToUniqSet
214 moduleSetElts = uniqSetToList
215 elemModuleSet = elementOfUniqSet