[project @ 2000-11-03 17:10:57 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, 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 -> FAST_STRING -> 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 mkRdrNameWkr :: RdrName -> RdrName      -- Worker-ify it
117 mkRdrNameWkr (RdrName qual occ) = RdrName qual (mkWorkerOcc occ)
118 \end{code}
119
120 \begin{code}
121         -- This guy is used by the reader when HsSyn has a slot for
122         -- an implicit name that's going to be filled in by
123         -- the renamer.  We can't just put "error..." because
124         -- we sometimes want to print out stuff after reading but
125         -- before renaming
126 dummyRdrVarName = RdrName Unqual (mkVarOcc SLIT("V-DUMMY"))
127 dummyRdrTcName  = RdrName Unqual (mkOccFS tcName SLIT("TC-DUMMY"))
128 \end{code}
129
130
131 \begin{code}
132 isRdrDataCon (RdrName _ occ) = isDataOcc occ
133 isRdrTyVar   (RdrName _ occ) = isTvOcc occ
134
135 isUnqual (RdrName Unqual _) = True
136 isUnqual other              = False
137
138 isQual (RdrName (Qual _) _) = True
139 isQual _                    = False
140
141 isOrig (RdrName (Orig _)    _) = True
142 isOrig other                   = False
143 \end{code}
144
145
146 %************************************************************************
147 %*                                                                      *
148 \subsection{Instances}
149 %*                                                                      *
150 %************************************************************************
151
152 \begin{code}
153 instance Outputable RdrName where
154     ppr (RdrName qual occ) = pp_qual qual <> ppr occ
155                            where
156                              pp_qual Unqual      = empty
157                              pp_qual (Qual mod)  = ppr mod <> dot
158                              pp_qual (Orig mod)  = ppr mod <> dot
159
160 pprUnqualRdrName (RdrName qual occ) = ppr occ
161
162 instance Eq RdrName where
163     a == b = case (a `compare` b) of { EQ -> True;  _ -> False }
164     a /= b = case (a `compare` b) of { EQ -> False; _ -> True }
165
166 instance Ord RdrName where
167     a <= b = case (a `compare` b) of { LT -> True;  EQ -> True;  GT -> False }
168     a <  b = case (a `compare` b) of { LT -> True;  EQ -> False; GT -> False }
169     a >= b = case (a `compare` b) of { LT -> False; EQ -> True;  GT -> True  }
170     a >  b = case (a `compare` b) of { LT -> False; EQ -> False; GT -> True  }
171
172     compare (RdrName q1 o1) (RdrName q2 o2)
173         = (o1  `compare` o2) `thenCmp` 
174           (q1  `cmpQual` q2) 
175
176 cmpQual Unqual      Unqual      = EQ
177 cmpQual (Qual m1)   (Qual m2)   = m1 `compare` m2
178 cmpQual (Orig m1)   (Orig m2)   = m1 `compare` m2
179 cmpQual Unqual      _           = LT
180 cmpQual (Qual _)    (Orig _)    = LT
181 cmpQual _           _           = GT
182 \end{code}
183
184
185
186 %************************************************************************
187 %*                                                                      *
188 \subsection{Environment}
189 %*                                                                      *
190 %************************************************************************
191
192 \begin{code}
193 type RdrNameEnv a = FiniteMap RdrName a
194
195 emptyRdrEnv     :: RdrNameEnv a
196 lookupRdrEnv    :: RdrNameEnv a -> RdrName -> Maybe a
197 addListToRdrEnv :: RdrNameEnv a -> [(RdrName,a)] -> RdrNameEnv a
198 extendRdrEnv    :: RdrNameEnv a -> RdrName -> a -> RdrNameEnv a
199 rdrEnvToList    :: RdrNameEnv a -> [(RdrName, a)]
200 rdrEnvElts      :: RdrNameEnv a -> [a]
201 elemRdrEnv      :: RdrName -> RdrNameEnv a -> Bool
202 foldRdrEnv      :: (RdrName -> a -> b -> b) -> b -> RdrNameEnv a -> b
203
204 emptyRdrEnv  = emptyFM
205 lookupRdrEnv = lookupFM
206 addListToRdrEnv = addListToFM
207 rdrEnvElts      = eltsFM
208 extendRdrEnv    = addToFM
209 rdrEnvToList    = fmToList
210 elemRdrEnv      = elemFM
211 foldRdrEnv      = foldFM
212 \end{code}