[project @ 2000-10-31 17:30:16 by simonpj]
[ghc-hetmet.git] / ghc / compiler / basicTypes / RdrName.lhs
1 %
2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
3 %
4
5 \section[RdrName]{@RdrName@}
6
7 \begin{code}
8 module RdrName (
9         RdrName,
10
11         -- Construction
12         mkRdrUnqual, mkRdrQual, mkRdrOrig, mkRdrIfaceUnqual,
13         mkUnqual, mkQual, mkIfaceOrig, mkOrig,
14         qualifyRdrName, mkRdrNameWkr,
15         dummyRdrVarName, dummyRdrTcName,
16
17         -- Destruction
18         rdrNameModule, rdrNameOcc, setRdrNameOcc,
19         isRdrDataCon, isRdrTyVar, isQual, isSourceQual, isUnqual, isIface,
20
21         -- Environment
22         RdrNameEnv, 
23         emptyRdrEnv, lookupRdrEnv, addListToRdrEnv, rdrEnvElts, 
24         extendRdrEnv, rdrEnvToList, elemRdrEnv,
25
26         -- Printing;    instance Outputable RdrName
27         pprUnqualRdrName 
28   ) where 
29
30 #include "HsVersions.h"
31
32 import OccName  ( NameSpace, tcName,
33                   OccName, UserFS, EncodedFS,
34                   mkSysOccFS,
35                   mkOccFS, mkVarOcc,
36                   isDataOcc, isTvOcc, mkWorkerOcc
37                 )
38 import Module   ( ModuleName,
39                   mkSysModuleNameFS, mkModuleNameFS
40                 )
41 import FiniteMap
42 import Outputable
43 import Util     ( thenCmp )
44 \end{code}
45
46
47 %************************************************************************
48 %*                                                                      *
49 \subsection{The main data type}
50 %*                                                                      *
51 %************************************************************************
52
53 \begin{code}
54 data RdrName = RdrName Qual OccName
55
56 data Qual = Unqual
57
58           | IfaceUnqual         -- An unqualified name from an interface file;
59                                 -- implicitly its module is that of the enclosing
60                                 -- interface file; don't look it up in the environment
61
62           | Qual ModuleName     -- A qualified name written by the user in source code
63                                 -- The module isn't necessarily the module where
64                                 -- the thing is defined; just the one from which it
65                                 -- is imported
66
67           | Orig ModuleName     -- This is an *original* name; the module is the place
68                                 -- where the thing was defined
69 \end{code}
70
71
72 %************************************************************************
73 %*                                                                      *
74 \subsection{Simple functions}
75 %*                                                                      *
76 %************************************************************************
77
78 \begin{code}
79 rdrNameModule :: RdrName -> ModuleName
80 rdrNameModule (RdrName (Qual m) _) = m
81 rdrNameModule (RdrName (Orig m) _) = m
82
83 rdrNameOcc :: RdrName -> OccName
84 rdrNameOcc (RdrName _ occ) = occ
85
86 setRdrNameOcc :: RdrName -> OccName -> RdrName
87 setRdrNameOcc (RdrName q _) occ = RdrName q occ
88 \end{code}
89
90 \begin{code}
91         -- These two are the basic constructors
92 mkRdrUnqual :: OccName -> RdrName
93 mkRdrUnqual occ = RdrName Unqual occ
94
95 mkRdrIfaceUnqual :: OccName -> RdrName
96 mkRdrIfaceUnqual occ = RdrName IfaceUnqual occ
97
98 mkRdrQual :: ModuleName -> OccName -> RdrName
99 mkRdrQual mod occ = RdrName (Qual mod) occ
100
101 mkRdrOrig :: ModuleName -> OccName -> RdrName
102 mkRdrOrig mod occ = RdrName (Orig mod) occ
103
104 mkIfaceOrig :: NameSpace -> (EncodedFS, EncodedFS) -> RdrName
105 mkIfaceOrig ns (m,n) = RdrName (Orig (mkSysModuleNameFS m)) (mkSysOccFS ns n)
106
107
108         -- These two are used when parsing source files
109         -- They do encode the module and occurrence names
110 mkUnqual :: NameSpace -> FAST_STRING -> RdrName
111 mkUnqual sp n = RdrName Unqual (mkOccFS sp n)
112
113 mkQual :: NameSpace -> (UserFS, UserFS) -> RdrName
114 mkQual sp (m, n) = RdrName (Qual (mkModuleNameFS m)) (mkOccFS sp n)
115
116 mkOrig :: NameSpace -> ModuleName -> UserFS -> RdrName
117 mkOrig sp mod n = RdrName (Orig mod) (mkOccFS sp n)
118
119 qualifyRdrName :: ModuleName -> RdrName -> RdrName
120         -- Sets the module name of a RdrName, even if it has one already
121 qualifyRdrName mod (RdrName _ occ) = RdrName (Qual mod) occ
122
123 mkRdrNameWkr :: RdrName -> RdrName      -- Worker-ify it
124 mkRdrNameWkr (RdrName qual occ) = RdrName qual (mkWorkerOcc occ)
125 \end{code}
126
127 \begin{code}
128         -- This guy is used by the reader when HsSyn has a slot for
129         -- an implicit name that's going to be filled in by
130         -- the renamer.  We can't just put "error..." because
131         -- we sometimes want to print out stuff after reading but
132         -- before renaming
133 dummyRdrVarName = RdrName Unqual (mkVarOcc SLIT("V-DUMMY"))
134 dummyRdrTcName  = RdrName Unqual (mkOccFS tcName SLIT("TC-DUMMY"))
135 \end{code}
136
137
138 \begin{code}
139 isRdrDataCon (RdrName _ occ) = isDataOcc occ
140 isRdrTyVar   (RdrName _ occ) = isTvOcc occ
141
142 isUnqual (RdrName Unqual _)      = True
143 isUnqual (RdrName IfaceUnqual _) = True
144 isUnqual other                   = False
145
146 isQual rdr_name = not (isUnqual rdr_name)
147
148 isSourceQual (RdrName (Qual _) _) = True
149 isSourceQual _                    = False
150
151 isIface (RdrName (Orig _)    _) = True
152 isIface (RdrName IfaceUnqual _) = True
153 isIface other                   = False
154 \end{code}
155
156
157 %************************************************************************
158 %*                                                                      *
159 \subsection{Instances}
160 %*                                                                      *
161 %************************************************************************
162
163 \begin{code}
164 instance Outputable RdrName where
165     ppr (RdrName qual occ) = pp_qual qual <> ppr occ
166                            where
167                              pp_qual Unqual      = empty
168                              pp_qual IfaceUnqual = empty
169                              pp_qual (Qual mod)  = ppr mod <> dot
170                              pp_qual (Orig mod)  = ppr mod <> dot
171
172 pprUnqualRdrName (RdrName qual occ) = ppr occ
173
174 instance Eq RdrName where
175     a == b = case (a `compare` b) of { EQ -> True;  _ -> False }
176     a /= b = case (a `compare` b) of { EQ -> False; _ -> True }
177
178 instance Ord RdrName where
179     a <= b = case (a `compare` b) of { LT -> True;  EQ -> True;  GT -> False }
180     a <  b = case (a `compare` b) of { LT -> True;  EQ -> False; GT -> False }
181     a >= b = case (a `compare` b) of { LT -> False; EQ -> True;  GT -> True  }
182     a >  b = case (a `compare` b) of { LT -> False; EQ -> False; GT -> True  }
183
184     compare (RdrName q1 o1) (RdrName q2 o2)
185         = (o1  `compare` o2) `thenCmp` 
186           (q1  `cmpQual` q2) 
187
188 cmpQual Unqual      Unqual      = EQ
189 cmpQual IfaceUnqual IfaceUnqual = EQ
190 cmpQual (Qual m1)   (Qual m2)   = m1 `compare` m2
191 cmpQual (Orig m1)   (Orig m2)   = m1 `compare` m2
192 cmpQual Unqual      _           = LT
193 cmpQual IfaceUnqual (Qual _)    = LT
194 cmpQual IfaceUnqual (Orig _)    = LT
195 cmpQual (Qual _)    (Orig _)    = LT
196 cmpQual _           _           = GT
197 \end{code}
198
199
200
201 %************************************************************************
202 %*                                                                      *
203 \subsection{Environment}
204 %*                                                                      *
205 %************************************************************************
206
207 \begin{code}
208 type RdrNameEnv a = FiniteMap RdrName a
209
210 emptyRdrEnv     :: RdrNameEnv a
211 lookupRdrEnv    :: RdrNameEnv a -> RdrName -> Maybe a
212 addListToRdrEnv :: RdrNameEnv a -> [(RdrName,a)] -> RdrNameEnv a
213 extendRdrEnv    :: RdrNameEnv a -> RdrName -> a -> RdrNameEnv a
214 rdrEnvToList    :: RdrNameEnv a -> [(RdrName, a)]
215 rdrEnvElts      :: RdrNameEnv a -> [a]
216 elemRdrEnv      :: RdrName -> RdrNameEnv a -> Bool
217
218 emptyRdrEnv  = emptyFM
219 lookupRdrEnv = lookupFM
220 addListToRdrEnv = addListToFM
221 rdrEnvElts      = eltsFM
222 extendRdrEnv    = addToFM
223 rdrEnvToList    = fmToList
224 elemRdrEnv      = elemFM
225 \end{code}