[project @ 1999-03-02 14:22:43 by sof]
[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,
16         dummyRdrVarName, dummyRdrTcName,
17
18         -- Destruction
19         rdrNameModule, rdrNameOcc, 
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
30                 )
31 import Module   ( Module, IfaceFlavour, mkSysModuleFS,
32                   mkSrcModuleFS, pprModuleSep
33                 )
34 import PrelMods ( pRELUDE )
35 import Outputable
36 import Util     ( thenCmp )
37 \end{code}
38
39
40 %************************************************************************
41 %*                                                                      *
42 \subsection{The main data type}
43 %*                                                                      *
44 %************************************************************************
45
46 \begin{code}
47 data RdrName = RdrName Qual OccName
48
49 data Qual = Unqual
50           | Qual Module
51 \end{code}
52
53
54 %************************************************************************
55 %*                                                                      *
56 \subsection{Simple functions}
57 %*                                                                      *
58 %************************************************************************
59
60 \begin{code}
61 rdrNameModule :: RdrName -> Module
62 rdrNameModule (RdrName (Qual m) _) = m
63
64 rdrNameOcc :: RdrName -> OccName
65 rdrNameOcc (RdrName _ occ) = occ
66 \end{code}
67
68 \begin{code}
69         -- These two are the basic constructors
70 mkRdrUnqual :: OccName -> RdrName
71 mkRdrUnqual occ = RdrName Unqual occ
72
73 mkRdrQual :: Module -> OccName -> RdrName
74 mkRdrQual mod occ = RdrName (Qual mod) occ
75
76         -- These two are used when parsing source files
77         -- They do encode the module and occurrence names
78 mkSrcUnqual :: NameSpace -> FAST_STRING -> RdrName
79 mkSrcUnqual sp n   = RdrName Unqual (mkSrcOccFS sp n)
80
81 mkSrcQual :: NameSpace -> FAST_STRING -> FAST_STRING -> RdrName
82 mkSrcQual sp m n = RdrName (Qual (mkSrcModuleFS m)) (mkSrcOccFS sp n)
83
84         -- These two are used when parsing interface files
85         -- They do not encode the module and occurrence name
86 mkSysUnqual :: NameSpace -> FAST_STRING -> RdrName
87 mkSysUnqual sp n         = RdrName Unqual (mkSysOccFS sp n)
88
89 mkSysQual :: NameSpace -> (FAST_STRING, FAST_STRING, IfaceFlavour) -> RdrName
90 mkSysQual sp (m,n,hif) = RdrName (Qual (mkSysModuleFS m hif)) (mkSysOccFS sp n)
91
92 mkPreludeQual :: NameSpace -> Module -> FAST_STRING -> RdrName
93 mkPreludeQual sp mod n = RdrName (Qual mod) (mkSrcOccFS sp n)
94
95 qualifyRdrName :: Module -> RdrName -> RdrName
96 qualifyRdrName mod (RdrName Unqual occ) = RdrName (Qual mod) occ
97 qualifyRdrName mod rdr_name             = rdr_name 
98 \end{code}
99
100 \begin{code}
101         -- This guy is used by the reader when HsSyn has a slot for
102         -- an implicit name that's going to be filled in by
103         -- the renamer.  We can't just put "error..." because
104         -- we sometimes want to print out stuff after reading but
105         -- before renaming
106 dummyRdrVarName = RdrName Unqual (mkSrcVarOcc SLIT("V-DUMMY"))
107 dummyRdrTcName  = RdrName Unqual (mkSrcOccFS tcName SLIT("TC-DUMMY"))
108 \end{code}
109
110
111 \begin{code}
112 isRdrDataCon (RdrName _ occ) = isDataOcc occ
113 isRdrTyVar   (RdrName _ occ) = isTvOcc occ
114
115 isUnqual (RdrName Unqual _) = True
116 isUnqual other              = False
117
118 isQual rdr_name = not (isUnqual rdr_name)
119 \end{code}
120
121
122 %************************************************************************
123 %*                                                                      *
124 \subsection{Instances}
125 %*                                                                      *
126 %************************************************************************
127
128 \begin{code}
129 instance Outputable RdrName where
130     ppr (RdrName qual occ) = pp_qual qual <> ppr occ
131                            where
132                                 pp_qual Unqual = empty
133                                 pp_qual (Qual mod) = ppr mod <> pprModuleSep mod
134
135 instance Eq RdrName where
136     a == b = case (a `compare` b) of { EQ -> True;  _ -> False }
137     a /= b = case (a `compare` b) of { EQ -> False; _ -> True }
138
139 instance Ord RdrName where
140     a <= b = case (a `compare` b) of { LT -> True;  EQ -> True;  GT -> False }
141     a <  b = case (a `compare` b) of { LT -> True;  EQ -> False; GT -> False }
142     a >= b = case (a `compare` b) of { LT -> False; EQ -> True;  GT -> True  }
143     a >  b = case (a `compare` b) of { LT -> False; EQ -> False; GT -> True  }
144
145     compare (RdrName q1 o1) (RdrName q2 o2)
146         = (o1  `compare` o2) `thenCmp` 
147           (q1  `cmpQual` q2) 
148
149 cmpQual Unqual    Unqual    = EQ
150 cmpQual Unqual    (Qual _)  = LT
151 cmpQual (Qual _)  Unqual    = GT
152 cmpQual (Qual m1) (Qual m2) = m1 `compare` m2
153 \end{code}
154
155
156