2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
5 \section[RdrName]{@RdrName@}
12 mkRdrUnqual, mkRdrQual, mkRdrOrig, mkRdrUnqual,
13 mkUnqual, mkQual, mkIfaceOrig, mkOrig,
14 qualifyRdrName, unqualifyRdrName, mkRdrNameWkr,
15 dummyRdrVarName, dummyRdrTcName,
18 rdrNameModule, rdrNameOcc, setRdrNameOcc,
19 isRdrDataCon, isRdrTyVar, isRdrTc, isQual, isUnqual, isOrig,
23 emptyRdrEnv, lookupRdrEnv, addListToRdrEnv, rdrEnvElts,
24 extendRdrEnv, rdrEnvToList, elemRdrEnv, foldRdrEnv,
26 -- Printing; instance Outputable RdrName
30 #include "HsVersions.h"
32 import OccName ( NameSpace, tcName,
33 OccName, UserFS, EncodedFS,
36 isDataOcc, isTvOcc, isTcOcc, mkWorkerOcc
38 import Module ( ModuleName,
39 mkSysModuleNameFS, mkModuleNameFS
43 import Util ( thenCmp )
47 %************************************************************************
49 \subsection{The main data type}
51 %************************************************************************
54 data RdrName = RdrName Qual OccName
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
63 | Orig ModuleName -- This is an *original* name; the module is the place
64 -- where the thing was defined
68 %************************************************************************
70 \subsection{Simple functions}
72 %************************************************************************
75 rdrNameModule :: RdrName -> ModuleName
76 rdrNameModule (RdrName (Qual m) _) = m
77 rdrNameModule (RdrName (Orig m) _) = m
79 rdrNameOcc :: RdrName -> OccName
80 rdrNameOcc (RdrName _ occ) = occ
82 setRdrNameOcc :: RdrName -> OccName -> RdrName
83 setRdrNameOcc (RdrName q _) occ = RdrName q occ
87 -- These two are the basic constructors
88 mkRdrUnqual :: OccName -> RdrName
89 mkRdrUnqual occ = RdrName Unqual occ
91 mkRdrQual :: ModuleName -> OccName -> RdrName
92 mkRdrQual mod occ = RdrName (Qual mod) occ
94 mkRdrOrig :: ModuleName -> OccName -> RdrName
95 mkRdrOrig mod occ = RdrName (Orig mod) occ
97 mkIfaceOrig :: NameSpace -> (EncodedFS, EncodedFS) -> RdrName
98 mkIfaceOrig ns (m,n) = RdrName (Orig (mkSysModuleNameFS m)) (mkSysOccFS ns n)
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)
106 mkQual :: NameSpace -> (UserFS, UserFS) -> RdrName
107 mkQual sp (m, n) = RdrName (Qual (mkModuleNameFS m)) (mkOccFS sp n)
109 mkOrig :: NameSpace -> ModuleName -> UserFS -> RdrName
110 mkOrig sp mod n = RdrName (Orig mod) (mkOccFS sp n)
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
116 unqualifyRdrName :: RdrName -> RdrName
117 unqualifyRdrName (RdrName _ occ) = RdrName Unqual occ
119 mkRdrNameWkr :: RdrName -> RdrName -- Worker-ify it
120 mkRdrNameWkr (RdrName qual occ) = RdrName qual (mkWorkerOcc occ)
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
129 dummyRdrVarName = RdrName Unqual (mkVarOcc SLIT("V-DUMMY"))
130 dummyRdrTcName = RdrName Unqual (mkOccFS tcName SLIT("TC-DUMMY"))
135 isRdrDataCon (RdrName _ occ) = isDataOcc occ
136 isRdrTyVar (RdrName _ occ) = isTvOcc occ
137 isRdrTc (RdrName _ occ) = isTcOcc occ
139 isUnqual (RdrName Unqual _) = True
140 isUnqual other = False
142 isQual (RdrName (Qual _) _) = True
145 isOrig (RdrName (Orig _) _) = True
150 %************************************************************************
152 \subsection{Instances}
154 %************************************************************************
157 instance Outputable RdrName where
158 ppr (RdrName qual occ) = pp_qual qual <> ppr occ
160 pp_qual Unqual = empty
161 pp_qual (Qual mod) = ppr mod <> dot
162 pp_qual (Orig mod) = ppr mod <> dot
164 pprUnqualRdrName (RdrName qual occ) = ppr occ
166 instance Eq RdrName where
167 a == b = case (a `compare` b) of { EQ -> True; _ -> False }
168 a /= b = case (a `compare` b) of { EQ -> False; _ -> True }
170 instance Ord RdrName where
171 a <= b = case (a `compare` b) of { LT -> True; EQ -> True; GT -> False }
172 a < b = case (a `compare` b) of { LT -> True; EQ -> False; GT -> False }
173 a >= b = case (a `compare` b) of { LT -> False; EQ -> True; GT -> True }
174 a > b = case (a `compare` b) of { LT -> False; EQ -> False; GT -> True }
176 compare (RdrName q1 o1) (RdrName q2 o2)
177 = (o1 `compare` o2) `thenCmp`
180 cmpQual Unqual Unqual = EQ
181 cmpQual (Qual m1) (Qual m2) = m1 `compare` m2
182 cmpQual (Orig m1) (Orig m2) = m1 `compare` m2
183 cmpQual Unqual _ = LT
184 cmpQual (Qual _) (Orig _) = LT
190 %************************************************************************
192 \subsection{Environment}
194 %************************************************************************
197 type RdrNameEnv a = FiniteMap RdrName a
199 emptyRdrEnv :: RdrNameEnv a
200 lookupRdrEnv :: RdrNameEnv a -> RdrName -> Maybe a
201 addListToRdrEnv :: RdrNameEnv a -> [(RdrName,a)] -> RdrNameEnv a
202 extendRdrEnv :: RdrNameEnv a -> RdrName -> a -> RdrNameEnv a
203 rdrEnvToList :: RdrNameEnv a -> [(RdrName, a)]
204 rdrEnvElts :: RdrNameEnv a -> [a]
205 elemRdrEnv :: RdrName -> RdrNameEnv a -> Bool
206 foldRdrEnv :: (RdrName -> a -> b -> b) -> b -> RdrNameEnv a -> b
208 emptyRdrEnv = emptyFM
209 lookupRdrEnv = lookupFM
210 addListToRdrEnv = addListToFM
212 extendRdrEnv = addToFM
213 rdrEnvToList = fmToList