[project @ 2004-11-26 16:19:45 by simonmar]
[ghc-hetmet.git] / ghc / compiler / basicTypes / Module.lhs
1 %
2 % (c) The University of Glasgow, 2004
3 %
4
5 Module
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 \begin{code}
12 module Module 
13     (
14       Module,                   -- Abstract, instance of Eq, Ord, Outputable
15     , pprModule                 -- :: ModuleName -> SDoc
16
17     , ModLocation(..),
18     , showModMsg
19
20     , moduleString              -- :: ModuleName -> EncodedString
21     , moduleUserString          -- :: ModuleName -> UserString
22     , moduleFS                  -- :: ModuleName -> EncodedFS
23
24     , mkModule                  -- :: UserString -> ModuleName
25     , mkModuleFS                -- :: UserFS    -> ModuleName
26     , mkSysModuleFS             -- :: EncodedFS -> ModuleName
27  
28     , ModuleEnv,
29     , elemModuleEnv, extendModuleEnv, extendModuleEnvList, plusModuleEnv_C
30     , delModuleEnvList, delModuleEnv, plusModuleEnv, lookupModuleEnv
31     , lookupWithDefaultModuleEnv, mapModuleEnv, mkModuleEnv, emptyModuleEnv
32     , moduleEnvElts, unitModuleEnv, isEmptyModuleEnv, foldModuleEnv
33     , extendModuleEnv_C
34
35     , ModuleSet, emptyModuleSet, mkModuleSet, moduleSetElts, extendModuleSet, elemModuleSet
36
37     ) where
38
39 #include "HsVersions.h"
40 import OccName
41 import Outputable
42 import Unique           ( Uniquable(..) )
43 import Maybes           ( expectJust )
44 import UniqFM
45 import UniqSet
46 import Binary
47 import FastString
48 \end{code}
49
50 %************************************************************************
51 %*                                                                      *
52 \subsection{Module locations}
53 %*                                                                      *
54 %************************************************************************
55
56 \begin{code}
57 data ModLocation
58    = ModLocation {
59         ml_hs_file   :: Maybe FilePath,
60
61         ml_hspp_file :: Maybe FilePath, -- Path of preprocessed source
62
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)
66
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)
71      }
72      deriving Show
73
74 instance Outputable ModLocation where
75    ppr = text . show
76
77 -- Rather a gruesome function to have in Module
78
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) ++ ", "
83     ++ (if use_object
84           then ml_obj_file location
85           else "interpreted")
86     ++ " )"
87  where mod_str = moduleUserString mod
88 \end{code}
89
90 For a module in another package, the hs_file and obj_file
91 components of ModLocation are undefined.  
92
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.
97
98
99 %************************************************************************
100 %*                                                                      *
101 \subsection{The name of a module}
102 %*                                                                      *
103 %************************************************************************
104
105 \begin{code}
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
109
110 instance Binary Module where
111    put_ bh (Module m) = put_ bh m
112    get bh = do m <- get bh; return (Module m)
113
114 instance Uniquable Module where
115   getUnique (Module nm) = getUnique nm
116
117 instance Eq Module where
118   nm1 == nm2 = getUnique nm1 == getUnique nm2
119
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
125
126 instance Outputable Module where
127   ppr = pprModule
128
129
130 pprModule :: Module -> SDoc
131 pprModule (Module nm) = pprEncodedFS nm
132
133 moduleFS :: Module -> EncodedFS
134 moduleFS (Module mod) = mod
135
136 moduleString :: Module -> EncodedString
137 moduleString (Module mod) = unpackFS mod
138
139 moduleUserString :: Module -> UserString
140 moduleUserString (Module mod) = decode (unpackFS mod)
141
142 -- used to be called mkSrcModule
143 mkModule :: UserString -> Module
144 mkModule s = Module (mkFastString (encode s))
145
146 -- used to be called mkSrcModuleFS
147 mkModuleFS :: UserFS -> Module
148 mkModuleFS s = Module (encodeFS s)
149
150 -- used to be called mkSysModuleFS
151 mkSysModuleFS :: EncodedFS -> Module
152 mkSysModuleFS s = Module s 
153 \end{code}
154
155 %************************************************************************
156 %*                                                                      *
157 \subsection{@ModuleEnv@s}
158 %*                                                                      *
159 %************************************************************************
160
161 \begin{code}
162 type ModuleEnv elt = UniqFM elt
163
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
171                   
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]
177                   
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
183
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
201 \end{code}
202
203 \begin{code}
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
210
211 emptyModuleSet  = emptyUniqSet
212 mkModuleSet     = mkUniqSet
213 extendModuleSet = addOneToUniqSet
214 moduleSetElts   = uniqSetToList
215 elemModuleSet   = elementOfUniqSet
216 \end{code}