[project @ 2000-06-13 14:37:46 by keithw]
[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,
13         mkSrcUnqual, mkSrcQual, 
14         mkSysUnqual, mkSysQual,
15         mkPreludeQual, qualifyRdrName, mkRdrNameWkr,
16         dummyRdrVarName, dummyRdrTcName,
17
18         -- Destruction
19         rdrNameModule, rdrNameOcc, setRdrNameOcc,
20         isRdrDataCon, isRdrTyVar, isQual, isUnqual,
21
22         -- Environment
23         RdrNameEnv, 
24         emptyRdrEnv, lookupRdrEnv, addListToRdrEnv, rdrEnvElts, 
25         extendRdrEnv, rdrEnvToList,
26
27         -- Printing;    instance Outputable RdrName
28         pprUnqualRdrName 
29   ) where 
30
31 #include "HsVersions.h"
32
33 import OccName  ( NameSpace, tcName,
34                   OccName,
35                   mkSysOccFS,
36                   mkSrcOccFS, mkSrcVarOcc,
37                   isDataOcc, isTvOcc, mkWorkerOcc
38                 )
39 import Module   ( ModuleName, pprModuleName,
40                   mkSysModuleFS, mkSrcModuleFS
41                 )
42 import FiniteMap
43 import Outputable
44 import Util     ( thenCmp )
45 \end{code}
46
47
48 %************************************************************************
49 %*                                                                      *
50 \subsection{The main data type}
51 %*                                                                      *
52 %************************************************************************
53
54 \begin{code}
55 data RdrName = RdrName Qual OccName
56
57 data Qual = Unqual
58           | Qual ModuleName     -- The (encoded) module name
59 \end{code}
60
61
62 %************************************************************************
63 %*                                                                      *
64 \subsection{Simple functions}
65 %*                                                                      *
66 %************************************************************************
67
68 \begin{code}
69 rdrNameModule :: RdrName -> ModuleName
70 rdrNameModule (RdrName (Qual m) _) = m
71
72 rdrNameOcc :: RdrName -> OccName
73 rdrNameOcc (RdrName _ occ) = occ
74
75 setRdrNameOcc :: RdrName -> OccName -> RdrName
76 setRdrNameOcc (RdrName q _) occ = RdrName q occ
77 \end{code}
78
79 \begin{code}
80         -- These two are the basic constructors
81 mkRdrUnqual :: OccName -> RdrName
82 mkRdrUnqual occ = RdrName Unqual occ
83
84 mkRdrQual :: ModuleName -> OccName -> RdrName
85 mkRdrQual mod occ = RdrName (Qual mod) occ
86
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)
91
92 mkSrcQual :: NameSpace -> FAST_STRING -> FAST_STRING -> RdrName
93 mkSrcQual sp m n = RdrName (Qual (mkSrcModuleFS m)) (mkSrcOccFS sp n)
94
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)
99
100 mkSysQual :: NameSpace -> (FAST_STRING, FAST_STRING) -> RdrName
101 mkSysQual sp (m,n) = RdrName (Qual (mkSysModuleFS m)) (mkSysOccFS sp n)
102
103 mkPreludeQual :: NameSpace -> ModuleName -> FAST_STRING -> RdrName
104 mkPreludeQual sp mod n = RdrName (Qual mod) (mkSrcOccFS sp n)
105
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
109
110 mkRdrNameWkr :: RdrName -> RdrName      -- Worker-ify it
111 mkRdrNameWkr (RdrName qual occ) = RdrName qual (mkWorkerOcc occ)
112 \end{code}
113
114 \begin{code}
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
119         -- before renaming
120 dummyRdrVarName = RdrName Unqual (mkSrcVarOcc SLIT("V-DUMMY"))
121 dummyRdrTcName  = RdrName Unqual (mkSrcOccFS tcName SLIT("TC-DUMMY"))
122 \end{code}
123
124
125 \begin{code}
126 isRdrDataCon (RdrName _ occ) = isDataOcc occ
127 isRdrTyVar   (RdrName _ occ) = isTvOcc occ
128
129 isUnqual (RdrName Unqual _) = True
130 isUnqual other              = False
131
132 isQual rdr_name = not (isUnqual rdr_name)
133 \end{code}
134
135
136 %************************************************************************
137 %*                                                                      *
138 \subsection{Instances}
139 %*                                                                      *
140 %************************************************************************
141
142 \begin{code}
143 instance Outputable RdrName where
144     ppr (RdrName qual occ) = pp_qual qual <> ppr occ
145                            where
146                              pp_qual Unqual     = empty
147                              pp_qual (Qual mod) = pprModuleName mod <> dot
148
149 pprUnqualRdrName (RdrName qual occ) = ppr occ
150
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 }
154
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  }
160
161     compare (RdrName q1 o1) (RdrName q2 o2)
162         = (o1  `compare` o2) `thenCmp` 
163           (q1  `cmpQual` q2) 
164
165 cmpQual Unqual    Unqual    = EQ
166 cmpQual Unqual    (Qual _)  = LT
167 cmpQual (Qual _)  Unqual    = GT
168 cmpQual (Qual m1) (Qual m2) = m1 `compare` m2
169 \end{code}
170
171
172
173 %************************************************************************
174 %*                                                                      *
175 \subsection{Environment}
176 %*                                                                      *
177 %************************************************************************
178
179 \begin{code}
180 type RdrNameEnv a = FiniteMap RdrName a
181
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]
188
189 emptyRdrEnv  = emptyFM
190 lookupRdrEnv = lookupFM
191 addListToRdrEnv = addListToFM
192 rdrEnvElts      = eltsFM
193 extendRdrEnv    = addToFM
194 rdrEnvToList    = fmToList
195 \end{code}