[project @ 2001-07-12 14:51:28 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, mkRdrUnqual,
13         mkUnqual, mkQual, mkIfaceOrig, mkOrig,
14         qualifyRdrName, unqualifyRdrName, mkRdrNameWkr,
15         dummyRdrVarName, dummyRdrTcName,
16
17         -- Destruction
18         rdrNameModule, rdrNameOcc, setRdrNameOcc,
19         isRdrDataCon, isRdrTyVar, isQual, isUnqual, isOrig,
20
21         -- Environment
22         RdrNameEnv, 
23         emptyRdrEnv, lookupRdrEnv, addListToRdrEnv, rdrEnvElts, 
24         extendRdrEnv, rdrEnvToList, elemRdrEnv, foldRdrEnv, 
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           | Qual ModuleName     -- A qualified name written by the user in source code
59                                 -- The module isn't necessarily the module where
60                                 -- the thing is defined; just the one from which it
61                                 -- is imported
62
63           | Orig ModuleName     -- This is an *original* name; the module is the place
64                                 -- where the thing was defined
65 \end{code}
66
67
68 %************************************************************************
69 %*                                                                      *
70 \subsection{Simple functions}
71 %*                                                                      *
72 %************************************************************************
73
74 \begin{code}
75 rdrNameModule :: RdrName -> ModuleName
76 rdrNameModule (RdrName (Qual m) _) = m
77 rdrNameModule (RdrName (Orig m) _) = m
78
79 rdrNameOcc :: RdrName -> OccName
80 rdrNameOcc (RdrName _ occ) = occ
81
82 setRdrNameOcc :: RdrName -> OccName -> RdrName
83 setRdrNameOcc (RdrName q _) occ = RdrName q occ
84 \end{code}
85
86 \begin{code}
87         -- These two are the basic constructors
88 mkRdrUnqual :: OccName -> RdrName
89 mkRdrUnqual occ = RdrName Unqual occ
90
91 mkRdrQual :: ModuleName -> OccName -> RdrName
92 mkRdrQual mod occ = RdrName (Qual mod) occ
93
94 mkRdrOrig :: ModuleName -> OccName -> RdrName
95 mkRdrOrig mod occ = RdrName (Orig mod) occ
96
97 mkIfaceOrig :: NameSpace -> (EncodedFS, EncodedFS) -> RdrName
98 mkIfaceOrig ns (m,n) = RdrName (Orig (mkSysModuleNameFS m)) (mkSysOccFS ns n)
99
100
101         -- These two are used when parsing source files
102         -- They do encode the module and occurrence names
103 mkUnqual :: NameSpace -> UserFS -> RdrName
104 mkUnqual sp n = RdrName Unqual (mkOccFS sp n)
105
106 mkQual :: NameSpace -> (UserFS, UserFS) -> RdrName
107 mkQual sp (m, n) = RdrName (Qual (mkModuleNameFS m)) (mkOccFS sp n)
108
109 mkOrig :: NameSpace -> ModuleName -> UserFS -> RdrName
110 mkOrig sp mod n = RdrName (Orig mod) (mkOccFS sp n)
111
112 qualifyRdrName :: ModuleName -> RdrName -> RdrName
113         -- Sets the module name of a RdrName, even if it has one already
114 qualifyRdrName mod (RdrName _ occ) = RdrName (Qual mod) occ
115
116 unqualifyRdrName :: RdrName -> RdrName
117 unqualifyRdrName (RdrName _ occ) = RdrName Unqual occ
118
119 mkRdrNameWkr :: RdrName -> RdrName      -- Worker-ify it
120 mkRdrNameWkr (RdrName qual occ) = RdrName qual (mkWorkerOcc occ)
121 \end{code}
122
123 \begin{code}
124         -- This guy is used by the reader when HsSyn has a slot for
125         -- an implicit name that's going to be filled in by
126         -- the renamer.  We can't just put "error..." because
127         -- we sometimes want to print out stuff after reading but
128         -- before renaming
129 dummyRdrVarName = RdrName Unqual (mkVarOcc SLIT("V-DUMMY"))
130 dummyRdrTcName  = RdrName Unqual (mkOccFS tcName SLIT("TC-DUMMY"))
131 \end{code}
132
133
134 \begin{code}
135 isRdrDataCon (RdrName _ occ) = isDataOcc occ
136 isRdrTyVar   (RdrName _ occ) = isTvOcc occ
137
138 isUnqual (RdrName Unqual _) = True
139 isUnqual other              = False
140
141 isQual (RdrName (Qual _) _) = True
142 isQual _                    = False
143
144 isOrig (RdrName (Orig _)    _) = True
145 isOrig other                   = False
146 \end{code}
147
148
149 %************************************************************************
150 %*                                                                      *
151 \subsection{Instances}
152 %*                                                                      *
153 %************************************************************************
154
155 \begin{code}
156 instance Outputable RdrName where
157     ppr (RdrName qual occ) = pp_qual qual <> ppr occ
158                            where
159                              pp_qual Unqual      = empty
160                              pp_qual (Qual mod)  = ppr mod <> dot
161                              pp_qual (Orig mod)  = ppr mod <> dot
162
163 pprUnqualRdrName (RdrName qual occ) = ppr occ
164
165 instance Eq RdrName where
166     a == b = case (a `compare` b) of { EQ -> True;  _ -> False }
167     a /= b = case (a `compare` b) of { EQ -> False; _ -> True }
168
169 instance Ord RdrName where
170     a <= b = case (a `compare` b) of { LT -> True;  EQ -> True;  GT -> False }
171     a <  b = case (a `compare` b) of { LT -> True;  EQ -> False; GT -> False }
172     a >= b = case (a `compare` b) of { LT -> False; EQ -> True;  GT -> True  }
173     a >  b = case (a `compare` b) of { LT -> False; EQ -> False; GT -> True  }
174
175     compare (RdrName q1 o1) (RdrName q2 o2)
176         = (o1  `compare` o2) `thenCmp` 
177           (q1  `cmpQual` q2) 
178
179 cmpQual Unqual      Unqual      = EQ
180 cmpQual (Qual m1)   (Qual m2)   = m1 `compare` m2
181 cmpQual (Orig m1)   (Orig m2)   = m1 `compare` m2
182 cmpQual Unqual      _           = LT
183 cmpQual (Qual _)    (Orig _)    = LT
184 cmpQual _           _           = GT
185 \end{code}
186
187
188
189 %************************************************************************
190 %*                                                                      *
191 \subsection{Environment}
192 %*                                                                      *
193 %************************************************************************
194
195 \begin{code}
196 type RdrNameEnv a = FiniteMap RdrName a
197
198 emptyRdrEnv     :: RdrNameEnv a
199 lookupRdrEnv    :: RdrNameEnv a -> RdrName -> Maybe a
200 addListToRdrEnv :: RdrNameEnv a -> [(RdrName,a)] -> RdrNameEnv a
201 extendRdrEnv    :: RdrNameEnv a -> RdrName -> a -> RdrNameEnv a
202 rdrEnvToList    :: RdrNameEnv a -> [(RdrName, a)]
203 rdrEnvElts      :: RdrNameEnv a -> [a]
204 elemRdrEnv      :: RdrName -> RdrNameEnv a -> Bool
205 foldRdrEnv      :: (RdrName -> a -> b -> b) -> b -> RdrNameEnv a -> b
206
207 emptyRdrEnv     = emptyFM
208 lookupRdrEnv    = lookupFM
209 addListToRdrEnv = addListToFM
210 rdrEnvElts      = eltsFM
211 extendRdrEnv    = addToFM
212 rdrEnvToList    = fmToList
213 elemRdrEnv      = elemFM
214 foldRdrEnv      = foldFM
215 \end{code}