1 {-% DrIFT (Automatic class derivations for Haskell) v1.1 %-}
3 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
6 \section[RdrName]{@RdrName@}
13 mkRdrUnqual, mkRdrQual, mkRdrOrig, mkRdrUnqual,
14 mkUnqual, mkQual, mkIfaceOrig, mkOrig,
15 qualifyRdrName, unqualifyRdrName, mkRdrNameWkr,
16 dummyRdrVarName, dummyRdrTcName,
19 rdrNameModule, rdrNameOcc, setRdrNameOcc,
20 isRdrDataCon, isRdrTyVar, isRdrTc, isQual, isUnqual, isOrig,
24 emptyRdrEnv, lookupRdrEnv, addListToRdrEnv, rdrEnvElts,
25 extendRdrEnv, rdrEnvToList, elemRdrEnv, foldRdrEnv,
27 -- Printing; instance Outputable RdrName
31 #include "HsVersions.h"
33 import OccName ( NameSpace, tcName,
34 OccName, UserFS, EncodedFS,
37 isDataOcc, isTvOcc, isTcOcc, mkWorkerOcc
39 import Module ( ModuleName,
40 mkSysModuleNameFS, mkModuleNameFS
45 import Util ( thenCmp )
49 %************************************************************************
51 \subsection{The main data type}
53 %************************************************************************
56 data RdrName = RdrName Qual OccName
57 {-! derive: Binary !-}
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
67 | Orig ModuleName -- This is an *original* name; the module is the place
68 -- where the thing was defined
69 {-! derive: Binary !-}
74 %************************************************************************
76 \subsection{Simple functions}
78 %************************************************************************
81 rdrNameModule :: RdrName -> ModuleName
82 rdrNameModule (RdrName (Qual m) _) = m
83 rdrNameModule (RdrName (Orig m) _) = m
85 rdrNameOcc :: RdrName -> OccName
86 rdrNameOcc (RdrName _ occ) = occ
88 setRdrNameOcc :: RdrName -> OccName -> RdrName
89 setRdrNameOcc (RdrName q _) occ = RdrName q occ
93 -- These two are the basic constructors
94 mkRdrUnqual :: OccName -> RdrName
95 mkRdrUnqual occ = RdrName Unqual occ
97 mkRdrQual :: ModuleName -> OccName -> RdrName
98 mkRdrQual mod occ = RdrName (Qual mod) occ
100 mkRdrOrig :: ModuleName -> OccName -> RdrName
101 mkRdrOrig mod occ = RdrName (Orig mod) occ
103 mkIfaceOrig :: NameSpace -> (EncodedFS, EncodedFS) -> RdrName
104 mkIfaceOrig ns (m,n) = RdrName (Orig (mkSysModuleNameFS m)) (mkSysOccFS ns n)
107 -- These two are used when parsing source files
108 -- They do encode the module and occurrence names
109 mkUnqual :: NameSpace -> UserFS -> RdrName
110 mkUnqual sp n = RdrName Unqual (mkOccFS sp n)
112 mkQual :: NameSpace -> (UserFS, UserFS) -> RdrName
113 mkQual sp (m, n) = RdrName (Qual (mkModuleNameFS m)) (mkOccFS sp n)
115 mkOrig :: NameSpace -> ModuleName -> UserFS -> RdrName
116 mkOrig sp mod n = RdrName (Orig mod) (mkOccFS sp n)
118 qualifyRdrName :: ModuleName -> RdrName -> RdrName
119 -- Sets the module name of a RdrName, even if it has one already
120 qualifyRdrName mod (RdrName _ occ) = RdrName (Qual mod) occ
122 unqualifyRdrName :: RdrName -> RdrName
123 unqualifyRdrName (RdrName _ occ) = RdrName Unqual occ
125 mkRdrNameWkr :: RdrName -> RdrName -- Worker-ify it
126 mkRdrNameWkr (RdrName qual occ) = RdrName qual (mkWorkerOcc occ)
130 -- This guy is used by the reader when HsSyn has a slot for
131 -- an implicit name that's going to be filled in by
132 -- the renamer. We can't just put "error..." because
133 -- we sometimes want to print out stuff after reading but
135 dummyRdrVarName = RdrName Unqual (mkVarOcc FSLIT("V-DUMMY"))
136 dummyRdrTcName = RdrName Unqual (mkOccFS tcName FSLIT("TC-DUMMY"))
141 isRdrDataCon (RdrName _ occ) = isDataOcc occ
142 isRdrTyVar (RdrName _ occ) = isTvOcc occ
143 isRdrTc (RdrName _ occ) = isTcOcc occ
145 isUnqual (RdrName Unqual _) = True
146 isUnqual other = False
148 isQual (RdrName (Qual _) _) = True
151 isOrig (RdrName (Orig _) _) = True
156 %************************************************************************
158 \subsection{Instances}
160 %************************************************************************
163 instance Outputable RdrName where
164 ppr (RdrName qual occ) = pp_qual qual <> ppr occ
166 pp_qual Unqual = empty
167 pp_qual (Qual mod) = ppr mod <> dot
168 pp_qual (Orig mod) = ppr mod <> dot
170 pprUnqualRdrName (RdrName qual occ) = ppr occ
172 instance Eq RdrName where
173 a == b = case (a `compare` b) of { EQ -> True; _ -> False }
174 a /= b = case (a `compare` b) of { EQ -> False; _ -> True }
176 instance Ord RdrName where
177 a <= b = case (a `compare` b) of { LT -> True; EQ -> True; GT -> False }
178 a < b = case (a `compare` b) of { LT -> True; EQ -> False; GT -> False }
179 a >= b = case (a `compare` b) of { LT -> False; EQ -> True; GT -> True }
180 a > b = case (a `compare` b) of { LT -> False; EQ -> False; GT -> True }
182 compare (RdrName q1 o1) (RdrName q2 o2)
183 = (o1 `compare` o2) `thenCmp`
186 cmpQual Unqual Unqual = EQ
187 cmpQual (Qual m1) (Qual m2) = m1 `compare` m2
188 cmpQual (Orig m1) (Orig m2) = m1 `compare` m2
189 cmpQual Unqual _ = LT
190 cmpQual (Qual _) (Orig _) = LT
196 %************************************************************************
198 \subsection{Environment}
200 %************************************************************************
203 type RdrNameEnv a = FiniteMap RdrName a
205 emptyRdrEnv :: RdrNameEnv a
206 lookupRdrEnv :: RdrNameEnv a -> RdrName -> Maybe a
207 addListToRdrEnv :: RdrNameEnv a -> [(RdrName,a)] -> RdrNameEnv a
208 extendRdrEnv :: RdrNameEnv a -> RdrName -> a -> RdrNameEnv a
209 rdrEnvToList :: RdrNameEnv a -> [(RdrName, a)]
210 rdrEnvElts :: RdrNameEnv a -> [a]
211 elemRdrEnv :: RdrName -> RdrNameEnv a -> Bool
212 foldRdrEnv :: (RdrName -> a -> b -> b) -> b -> RdrNameEnv a -> b
214 emptyRdrEnv = emptyFM
215 lookupRdrEnv = lookupFM
216 addListToRdrEnv = addListToFM
218 extendRdrEnv = addToFM
219 rdrEnvToList = fmToList
224 {-* Generated by DrIFT-v1.0 : Look, but Don't Touch. *-}
225 instance Binary RdrName where
226 put_ bh (RdrName aa ab) = do
232 return (RdrName aa ab)
234 instance Binary Qual where
237 put_ bh (Qual aa) = do
240 put_ bh (Orig ab) = do
246 0 -> do return Unqual
252 -- Imported from other files :-