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
23 #include "HsVersions.h"
25 import OccName ( NameSpace, tcName,
28 mkSrcOccFS, mkSrcVarOcc,
29 isDataOcc, isTvOcc, mkWorkerOcc
31 import Module ( ModuleName, pprModuleName,
32 mkSysModuleFS, mkSrcModuleFS
35 import Util ( thenCmp )
39 %************************************************************************
41 \subsection{The main data type}
43 %************************************************************************
46 data RdrName = RdrName Qual OccName
49 | Qual ModuleName -- The (encoded) module name
53 %************************************************************************
55 \subsection{Simple functions}
57 %************************************************************************
60 rdrNameModule :: RdrName -> ModuleName
61 rdrNameModule (RdrName (Qual m) _) = m
63 rdrNameOcc :: RdrName -> OccName
64 rdrNameOcc (RdrName _ occ) = occ
66 setRdrNameOcc :: RdrName -> OccName -> RdrName
67 setRdrNameOcc (RdrName q _) occ = RdrName q occ
71 -- These two are the basic constructors
72 mkRdrUnqual :: OccName -> RdrName
73 mkRdrUnqual occ = RdrName Unqual occ
75 mkRdrQual :: ModuleName -> OccName -> RdrName
76 mkRdrQual mod occ = RdrName (Qual mod) occ
78 -- These two are used when parsing source files
79 -- They do encode the module and occurrence names
80 mkSrcUnqual :: NameSpace -> FAST_STRING -> RdrName
81 mkSrcUnqual sp n = RdrName Unqual (mkSrcOccFS sp n)
83 mkSrcQual :: NameSpace -> FAST_STRING -> FAST_STRING -> RdrName
84 mkSrcQual sp m n = RdrName (Qual (mkSrcModuleFS m)) (mkSrcOccFS sp n)
86 -- These two are used when parsing interface files
87 -- They do not encode the module and occurrence name
88 mkSysUnqual :: NameSpace -> FAST_STRING -> RdrName
89 mkSysUnqual sp n = RdrName Unqual (mkSysOccFS sp n)
91 mkSysQual :: NameSpace -> (FAST_STRING, FAST_STRING) -> RdrName
92 mkSysQual sp (m,n) = RdrName (Qual (mkSysModuleFS m)) (mkSysOccFS sp n)
94 mkPreludeQual :: NameSpace -> ModuleName -> FAST_STRING -> RdrName
95 mkPreludeQual sp mod n = RdrName (Qual mod) (mkSrcOccFS sp n)
97 qualifyRdrName :: ModuleName -> RdrName -> RdrName
98 -- Sets the module name of a RdrName, even if it has one already
99 qualifyRdrName mod (RdrName _ occ) = RdrName (Qual mod) occ
101 mkRdrNameWkr :: RdrName -> RdrName -- Worker-ify it
102 mkRdrNameWkr (RdrName qual occ) = RdrName qual (mkWorkerOcc occ)
106 -- This guy is used by the reader when HsSyn has a slot for
107 -- an implicit name that's going to be filled in by
108 -- the renamer. We can't just put "error..." because
109 -- we sometimes want to print out stuff after reading but
111 dummyRdrVarName = RdrName Unqual (mkSrcVarOcc SLIT("V-DUMMY"))
112 dummyRdrTcName = RdrName Unqual (mkSrcOccFS tcName SLIT("TC-DUMMY"))
117 isRdrDataCon (RdrName _ occ) = isDataOcc occ
118 isRdrTyVar (RdrName _ occ) = isTvOcc occ
120 isUnqual (RdrName Unqual _) = True
121 isUnqual other = False
123 isQual rdr_name = not (isUnqual rdr_name)
127 %************************************************************************
129 \subsection{Instances}
131 %************************************************************************
134 instance Outputable RdrName where
135 ppr (RdrName qual occ) = pp_qual qual <> ppr occ
137 pp_qual Unqual = empty
138 pp_qual (Qual mod) = pprModuleName mod <> dot
140 instance Eq RdrName where
141 a == b = case (a `compare` b) of { EQ -> True; _ -> False }
142 a /= b = case (a `compare` b) of { EQ -> False; _ -> True }
144 instance Ord RdrName where
145 a <= b = case (a `compare` b) of { LT -> True; EQ -> True; GT -> False }
146 a < b = case (a `compare` b) of { LT -> True; EQ -> False; GT -> False }
147 a >= b = case (a `compare` b) of { LT -> False; EQ -> True; GT -> True }
148 a > b = case (a `compare` b) of { LT -> False; EQ -> False; GT -> True }
150 compare (RdrName q1 o1) (RdrName q2 o2)
151 = (o1 `compare` o2) `thenCmp`
154 cmpQual Unqual Unqual = EQ
155 cmpQual Unqual (Qual _) = LT
156 cmpQual (Qual _) Unqual = GT
157 cmpQual (Qual m1) (Qual m2) = m1 `compare` m2