2 % (c) The AQUA Project, Glasgow University, 1996
4 \section[RdrHsSyn]{Specialisations of the @HsSyn@ syntax for the reader}
6 (Well, really, for specialisations involving @RdrName@s, even if
7 they are used somewhat later on in the compiler...)
10 #include "HsVersions.h"
13 SYN_IE(RdrNameArithSeqInfo),
14 SYN_IE(RdrNameBangType),
16 SYN_IE(RdrNameClassDecl),
17 SYN_IE(RdrNameClassOpSig),
18 SYN_IE(RdrNameConDecl),
19 SYN_IE(RdrNameContext),
20 SYN_IE(RdrNameSpecDataSig),
21 SYN_IE(RdrNameDefaultDecl),
22 SYN_IE(RdrNameFixityDecl),
24 SYN_IE(RdrNameGRHSsAndBinds),
25 SYN_IE(RdrNameHsBinds),
26 SYN_IE(RdrNameHsDecl),
27 SYN_IE(RdrNameHsExpr),
28 SYN_IE(RdrNameHsModule),
30 SYN_IE(RdrNameImportDecl),
31 SYN_IE(RdrNameInstDecl),
33 SYN_IE(RdrNameMonoBinds),
35 SYN_IE(RdrNameHsType),
37 SYN_IE(RdrNameSpecInstSig),
39 SYN_IE(RdrNameTyDecl),
41 SYN_IE(RdrNameClassOpPragmas),
42 SYN_IE(RdrNameClassPragmas),
43 SYN_IE(RdrNameDataPragmas),
44 SYN_IE(RdrNameGenPragmas),
45 SYN_IE(RdrNameInstancePragmas),
46 SYN_IE(RdrNameCoreExpr),
50 qual, varQual, tcQual, varUnqual,
51 dummyRdrVarName, dummyRdrTcName,
53 showRdr, rdrNameOcc, ieOcc,
54 cmpRdr, prefixRdrName,
63 import PrelMods ( pRELUDE )
64 import Name ( ExportFlag(..), Module(..), pprModule,
65 OccName(..), pprOccName, prefixOccName )
67 import PprStyle ( PprStyle(..) )
68 import Util ( cmpPString, panic, thenCmp )
72 type RdrNameArithSeqInfo = ArithSeqInfo Fake Fake RdrName RdrNamePat
73 type RdrNameBangType = BangType RdrName
74 type RdrNameBind = Bind Fake Fake RdrName RdrNamePat
75 type RdrNameClassDecl = ClassDecl Fake Fake RdrName RdrNamePat
76 type RdrNameClassOpSig = Sig RdrName
77 type RdrNameConDecl = ConDecl RdrName
78 type RdrNameContext = Context RdrName
79 type RdrNameHsDecl = HsDecl Fake Fake RdrName RdrNamePat
80 type RdrNameSpecDataSig = SpecDataSig RdrName
81 type RdrNameDefaultDecl = DefaultDecl RdrName
82 type RdrNameFixityDecl = FixityDecl RdrName
83 type RdrNameGRHS = GRHS Fake Fake RdrName RdrNamePat
84 type RdrNameGRHSsAndBinds = GRHSsAndBinds Fake Fake RdrName RdrNamePat
85 type RdrNameHsBinds = HsBinds Fake Fake RdrName RdrNamePat
86 type RdrNameHsExpr = HsExpr Fake Fake RdrName RdrNamePat
87 type RdrNameHsModule = HsModule Fake Fake RdrName RdrNamePat
88 type RdrNameIE = IE RdrName
89 type RdrNameImportDecl = ImportDecl RdrName
90 type RdrNameInstDecl = InstDecl Fake Fake RdrName RdrNamePat
91 type RdrNameMatch = Match Fake Fake RdrName RdrNamePat
92 type RdrNameMonoBinds = MonoBinds Fake Fake RdrName RdrNamePat
93 type RdrNamePat = InPat RdrName
94 type RdrNameHsType = HsType RdrName
95 type RdrNameSig = Sig RdrName
96 type RdrNameSpecInstSig = SpecInstSig RdrName
97 type RdrNameStmt = Stmt Fake Fake RdrName RdrNamePat
98 type RdrNameTyDecl = TyDecl RdrName
100 type RdrNameClassOpPragmas = ClassOpPragmas RdrName
101 type RdrNameClassPragmas = ClassPragmas RdrName
102 type RdrNameDataPragmas = DataPragmas RdrName
103 type RdrNameGenPragmas = GenPragmas RdrName
104 type RdrNameInstancePragmas = InstancePragmas RdrName
105 type RdrNameCoreExpr = GenCoreExpr RdrName RdrName RdrName RdrName
108 @extractHsTyVars@ looks just for things that could be type variables.
109 It's used when making the for-alls explicit.
112 extractHsTyVars :: HsType RdrName -> [RdrName]
116 get (MonoTyApp ty1 ty2) acc = get ty1 (get ty2 acc)
117 get (MonoListTy tc ty) acc = get ty acc
118 get (MonoTupleTy tc tys) acc = foldr get acc tys
119 get (MonoFunTy ty1 ty2) acc = get ty1 (get ty2 acc)
120 get (MonoDictTy cls ty) acc = get ty acc
121 get (MonoTyVar tv) acc = insert tv acc
122 get (HsPreForAllTy ctxt ty) acc = foldr (get . snd) (get ty acc) ctxt
123 get (HsForAllTy tvs ctxt ty) acc = filter (`notElem` locals) $
124 foldr (get . snd) (get ty acc) ctxt
126 locals = map getTyVarName tvs
128 insert (Qual _ _) acc = acc
129 insert (Unqual (TCOcc _)) acc = acc
130 insert other acc | other `elem` acc = acc
131 | otherwise = other : acc
135 A useful function for building @OpApps@. The operator is always a variable,
136 and we don't know the fixity yet.
139 mkOpApp e1 op e2 = OpApp e1 (HsVar op) (error "mkOpApp:fixity") e2
143 %************************************************************************
145 \subsection[RdrName]{The @RdrName@ datatype; names read from files}
147 %************************************************************************
152 | Qual Module OccName
154 qual (m,n) = Qual m n
155 tcQual (m,n) = Qual m (TCOcc n)
156 varQual (m,n) = Qual m (VarOcc n)
158 -- This guy is used by the reader when HsSyn has a slot for
159 -- an implicit name that's going to be filled in by
160 -- the renamer. We can't just put "error..." because
161 -- we sometimes want to print out stuff after reading but
163 dummyRdrVarName = Unqual (VarOcc SLIT("V-DUMMY"))
164 dummyRdrTcName = Unqual (VarOcc SLIT("TC-DUMMY"))
166 varUnqual n = Unqual (VarOcc n)
168 isUnqual (Unqual _) = True
169 isUnqual (Qual _ _) = False
171 isQual (Unqual _) = False
172 isQual (Qual _ _) = True
174 -- Used for adding a prefix to a RdrName
175 prefixRdrName :: FAST_STRING -> RdrName -> RdrName
176 prefixRdrName prefix (Qual m n) = Qual m (prefixOccName prefix n)
177 prefixRdrName prefix (Unqual n) = Unqual (prefixOccName prefix n)
179 cmpRdr (Unqual n1) (Unqual n2) = n1 `cmp` n2
180 cmpRdr (Unqual n1) (Qual m2 n2) = LT_
181 cmpRdr (Qual m1 n1) (Unqual n2) = GT_
182 cmpRdr (Qual m1 n1) (Qual m2 n2) = (n1 `cmp` n2) `thenCmp` (_CMP_STRING_ m1 m2)
183 -- always compare module-names *second*
185 rdrNameOcc :: RdrName -> OccName
186 rdrNameOcc (Unqual occ) = occ
187 rdrNameOcc (Qual _ occ) = occ
189 ieOcc :: RdrNameIE -> OccName
190 ieOcc ie = rdrNameOcc (ieName ie)
192 instance Text RdrName where -- debugging
193 showsPrec _ rn = showString (ppShow 80 (ppr PprDebug rn))
195 instance Eq RdrName where
196 a == b = case (a `cmp` b) of { EQ_ -> True; _ -> False }
197 a /= b = case (a `cmp` b) of { EQ_ -> False; _ -> True }
199 instance Ord RdrName where
200 a <= b = case (a `cmp` b) of { LT_ -> True; EQ_ -> True; GT__ -> False }
201 a < b = case (a `cmp` b) of { LT_ -> True; EQ_ -> False; GT__ -> False }
202 a >= b = case (a `cmp` b) of { LT_ -> False; EQ_ -> True; GT__ -> True }
203 a > b = case (a `cmp` b) of { LT_ -> False; EQ_ -> False; GT__ -> True }
205 instance Ord3 RdrName where
208 instance Outputable RdrName where
209 ppr sty (Unqual n) = pprOccName sty n
210 ppr sty (Qual m n) = ppBesides [pprModule sty m, ppChar '.', pprOccName sty n]
212 instance NamedThing RdrName where -- Just so that pretty-printing of expressions works
213 getOccName = rdrNameOcc
214 getName = panic "no getName for RdrNames"
216 showRdr sty rdr = ppShow 100 (ppr sty rdr)