2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
5 \section[RdrName]{@RdrName@}
12 mkRdrUnqual, mkRdrQual,
13 mkSrcUnqual, mkSrcQual,
14 mkSysUnqual, mkSysQual,
15 mkPreludeQual, qualifyRdrName, mkRdrNameWkr,
16 dummyRdrVarName, dummyRdrTcName,
19 rdrNameModule, rdrNameOcc, setRdrNameOcc,
20 isRdrDataCon, isRdrTyVar, isQual, isUnqual,
24 emptyRdrEnv, lookupRdrEnv, addListToRdrEnv, rdrEnvElts,
25 extendRdrEnv, rdrEnvToList,
27 -- Printing; instance Outputable RdrName
31 #include "HsVersions.h"
33 import OccName ( NameSpace, tcName,
36 mkSrcOccFS, mkSrcVarOcc,
37 isDataOcc, isTvOcc, mkWorkerOcc
39 import Module ( ModuleName, pprModuleName,
40 mkSysModuleFS, mkSrcModuleFS
44 import Util ( thenCmp )
48 %************************************************************************
50 \subsection{The main data type}
52 %************************************************************************
55 data RdrName = RdrName Qual OccName
58 | Qual ModuleName -- The (encoded) module name
62 %************************************************************************
64 \subsection{Simple functions}
66 %************************************************************************
69 rdrNameModule :: RdrName -> ModuleName
70 rdrNameModule (RdrName (Qual m) _) = m
72 rdrNameOcc :: RdrName -> OccName
73 rdrNameOcc (RdrName _ occ) = occ
75 setRdrNameOcc :: RdrName -> OccName -> RdrName
76 setRdrNameOcc (RdrName q _) occ = RdrName q occ
80 -- These two are the basic constructors
81 mkRdrUnqual :: OccName -> RdrName
82 mkRdrUnqual occ = RdrName Unqual occ
84 mkRdrQual :: ModuleName -> OccName -> RdrName
85 mkRdrQual mod occ = RdrName (Qual mod) occ
87 -- These two are used when parsing source files
88 -- They do encode the module and occurrence names
89 mkSrcUnqual :: NameSpace -> FAST_STRING -> RdrName
90 mkSrcUnqual sp n = RdrName Unqual (mkSrcOccFS sp n)
92 mkSrcQual :: NameSpace -> (UserFS, UserFS) -> RdrName
93 mkSrcQual sp (m, n) = RdrName (Qual (mkSrcModuleFS m)) (mkSrcOccFS sp n)
95 -- These two are used when parsing interface files
96 -- They do not encode the module and occurrence name
97 mkSysUnqual :: NameSpace -> FAST_STRING -> RdrName
98 mkSysUnqual sp n = RdrName Unqual (mkSysOccFS sp n)
100 mkSysQual :: NameSpace -> (FAST_STRING, FAST_STRING) -> RdrName
101 mkSysQual sp (m,n) = RdrName (Qual (mkSysModuleFS m)) (mkSysOccFS sp n)
103 mkPreludeQual :: NameSpace -> ModuleName -> FAST_STRING -> RdrName
104 mkPreludeQual sp mod n = RdrName (Qual mod) (mkSrcOccFS sp n)
106 qualifyRdrName :: ModuleName -> RdrName -> RdrName
107 -- Sets the module name of a RdrName, even if it has one already
108 qualifyRdrName mod (RdrName _ occ) = RdrName (Qual mod) occ
110 mkRdrNameWkr :: RdrName -> RdrName -- Worker-ify it
111 mkRdrNameWkr (RdrName qual occ) = RdrName qual (mkWorkerOcc occ)
115 -- This guy is used by the reader when HsSyn has a slot for
116 -- an implicit name that's going to be filled in by
117 -- the renamer. We can't just put "error..." because
118 -- we sometimes want to print out stuff after reading but
120 dummyRdrVarName = RdrName Unqual (mkSrcVarOcc SLIT("V-DUMMY"))
121 dummyRdrTcName = RdrName Unqual (mkSrcOccFS tcName SLIT("TC-DUMMY"))
126 isRdrDataCon (RdrName _ occ) = isDataOcc occ
127 isRdrTyVar (RdrName _ occ) = isTvOcc occ
129 isUnqual (RdrName Unqual _) = True
130 isUnqual other = False
132 isQual rdr_name = not (isUnqual rdr_name)
136 %************************************************************************
138 \subsection{Instances}
140 %************************************************************************
143 instance Outputable RdrName where
144 ppr (RdrName qual occ) = pp_qual qual <> ppr occ
146 pp_qual Unqual = empty
147 pp_qual (Qual mod) = pprModuleName mod <> dot
149 pprUnqualRdrName (RdrName qual occ) = ppr occ
151 instance Eq RdrName where
152 a == b = case (a `compare` b) of { EQ -> True; _ -> False }
153 a /= b = case (a `compare` b) of { EQ -> False; _ -> True }
155 instance Ord RdrName where
156 a <= b = case (a `compare` b) of { LT -> True; EQ -> True; GT -> False }
157 a < b = case (a `compare` b) of { LT -> True; EQ -> False; GT -> False }
158 a >= b = case (a `compare` b) of { LT -> False; EQ -> True; GT -> True }
159 a > b = case (a `compare` b) of { LT -> False; EQ -> False; GT -> True }
161 compare (RdrName q1 o1) (RdrName q2 o2)
162 = (o1 `compare` o2) `thenCmp`
165 cmpQual Unqual Unqual = EQ
166 cmpQual Unqual (Qual _) = LT
167 cmpQual (Qual _) Unqual = GT
168 cmpQual (Qual m1) (Qual m2) = m1 `compare` m2
173 %************************************************************************
175 \subsection{Environment}
177 %************************************************************************
180 type RdrNameEnv a = FiniteMap RdrName a
182 emptyRdrEnv :: RdrNameEnv a
183 lookupRdrEnv :: RdrNameEnv a -> RdrName -> Maybe a
184 addListToRdrEnv :: RdrNameEnv a -> [(RdrName,a)] -> RdrNameEnv a
185 extendRdrEnv :: RdrNameEnv a -> RdrName -> a -> RdrNameEnv a
186 rdrEnvToList :: RdrNameEnv a -> [(RdrName, a)]
187 rdrEnvElts :: RdrNameEnv a -> [a]
189 emptyRdrEnv = emptyFM
190 lookupRdrEnv = lookupFM
191 addListToRdrEnv = addListToFM
193 extendRdrEnv = addToFM
194 rdrEnvToList = fmToList