[project @ 2000-03-23 17:45:17 by simonpj]
[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   ) where 
22
23 #include "HsVersions.h"
24
25 import OccName  ( NameSpace, tcName,
26                   OccName,
27                   mkSysOccFS,
28                   mkSrcOccFS, mkSrcVarOcc,
29                   isDataOcc, isTvOcc, mkWorkerOcc
30                 )
31 import Module   ( ModuleName, pprModuleName,
32                   mkSysModuleFS, mkSrcModuleFS
33                 )
34 import Outputable
35 import Util     ( thenCmp )
36 \end{code}
37
38
39 %************************************************************************
40 %*                                                                      *
41 \subsection{The main data type}
42 %*                                                                      *
43 %************************************************************************
44
45 \begin{code}
46 data RdrName = RdrName Qual OccName
47
48 data Qual = Unqual
49           | Qual ModuleName     -- The (encoded) module name
50 \end{code}
51
52
53 %************************************************************************
54 %*                                                                      *
55 \subsection{Simple functions}
56 %*                                                                      *
57 %************************************************************************
58
59 \begin{code}
60 rdrNameModule :: RdrName -> ModuleName
61 rdrNameModule (RdrName (Qual m) _) = m
62
63 rdrNameOcc :: RdrName -> OccName
64 rdrNameOcc (RdrName _ occ) = occ
65
66 setRdrNameOcc :: RdrName -> OccName -> RdrName
67 setRdrNameOcc (RdrName q _) occ = RdrName q occ
68 \end{code}
69
70 \begin{code}
71         -- These two are the basic constructors
72 mkRdrUnqual :: OccName -> RdrName
73 mkRdrUnqual occ = RdrName Unqual occ
74
75 mkRdrQual :: ModuleName -> OccName -> RdrName
76 mkRdrQual mod occ = RdrName (Qual mod) occ
77
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)
82
83 mkSrcQual :: NameSpace -> FAST_STRING -> FAST_STRING -> RdrName
84 mkSrcQual sp m n = RdrName (Qual (mkSrcModuleFS m)) (mkSrcOccFS sp n)
85
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)
90
91 mkSysQual :: NameSpace -> (FAST_STRING, FAST_STRING) -> RdrName
92 mkSysQual sp (m,n) = RdrName (Qual (mkSysModuleFS m)) (mkSysOccFS sp n)
93
94 mkPreludeQual :: NameSpace -> ModuleName -> FAST_STRING -> RdrName
95 mkPreludeQual sp mod n = RdrName (Qual mod) (mkSrcOccFS sp n)
96
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
100
101 mkRdrNameWkr :: RdrName -> RdrName      -- Worker-ify it
102 mkRdrNameWkr (RdrName qual occ) = RdrName qual (mkWorkerOcc occ)
103 \end{code}
104
105 \begin{code}
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
110         -- before renaming
111 dummyRdrVarName = RdrName Unqual (mkSrcVarOcc SLIT("V-DUMMY"))
112 dummyRdrTcName  = RdrName Unqual (mkSrcOccFS tcName SLIT("TC-DUMMY"))
113 \end{code}
114
115
116 \begin{code}
117 isRdrDataCon (RdrName _ occ) = isDataOcc occ
118 isRdrTyVar   (RdrName _ occ) = isTvOcc occ
119
120 isUnqual (RdrName Unqual _) = True
121 isUnqual other              = False
122
123 isQual rdr_name = not (isUnqual rdr_name)
124 \end{code}
125
126
127 %************************************************************************
128 %*                                                                      *
129 \subsection{Instances}
130 %*                                                                      *
131 %************************************************************************
132
133 \begin{code}
134 instance Outputable RdrName where
135     ppr (RdrName qual occ) = pp_qual qual <> ppr occ
136                            where
137                                 pp_qual Unqual = empty
138                                 pp_qual (Qual mod) = pprModuleName mod <> dot
139
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 }
143
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  }
149
150     compare (RdrName q1 o1) (RdrName q2 o2)
151         = (o1  `compare` o2) `thenCmp` 
152           (q1  `cmpQual` q2) 
153
154 cmpQual Unqual    Unqual    = EQ
155 cmpQual Unqual    (Qual _)  = LT
156 cmpQual (Qual _)  Unqual    = GT
157 cmpQual (Qual m1) (Qual m2) = m1 `compare` m2
158 \end{code}
159
160
161