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),
38 SYN_IE(RdrNameSpecInstSig),
40 SYN_IE(RdrNameTyDecl),
42 SYN_IE(RdrNameClassOpPragmas),
43 SYN_IE(RdrNameClassPragmas),
44 SYN_IE(RdrNameDataPragmas),
45 SYN_IE(RdrNameGenPragmas),
46 SYN_IE(RdrNameInstancePragmas),
47 SYN_IE(RdrNameCoreExpr),
51 qual, varQual, tcQual, varUnqual,
52 dummyRdrVarName, dummyRdrTcName,
64 import PrelMods ( pRELUDE )
65 import Name ( ExportFlag(..), Module(..), pprModule,
66 OccName(..), pprOccName )
68 import PprStyle ( PprStyle(..) )
69 import Util ( cmpPString, panic, thenCmp )
73 type RdrNameArithSeqInfo = ArithSeqInfo Fake Fake RdrName RdrNamePat
74 type RdrNameBangType = BangType RdrName
75 type RdrNameBind = Bind Fake Fake RdrName RdrNamePat
76 type RdrNameClassDecl = ClassDecl Fake Fake RdrName RdrNamePat
77 type RdrNameClassOpSig = Sig RdrName
78 type RdrNameConDecl = ConDecl RdrName
79 type RdrNameContext = Context RdrName
80 type RdrNameHsDecl = HsDecl Fake Fake RdrName RdrNamePat
81 type RdrNameSpecDataSig = SpecDataSig RdrName
82 type RdrNameDefaultDecl = DefaultDecl RdrName
83 type RdrNameFixityDecl = FixityDecl RdrName
84 type RdrNameGRHS = GRHS Fake Fake RdrName RdrNamePat
85 type RdrNameGRHSsAndBinds = GRHSsAndBinds Fake Fake RdrName RdrNamePat
86 type RdrNameHsBinds = HsBinds Fake Fake RdrName RdrNamePat
87 type RdrNameHsExpr = HsExpr Fake Fake RdrName RdrNamePat
88 type RdrNameHsModule = HsModule Fake Fake RdrName RdrNamePat
89 type RdrNameIE = IE RdrName
90 type RdrNameImportDecl = ImportDecl RdrName
91 type RdrNameInstDecl = InstDecl Fake Fake RdrName RdrNamePat
92 type RdrNameMatch = Match Fake Fake RdrName RdrNamePat
93 type RdrNameMonoBinds = MonoBinds Fake Fake RdrName RdrNamePat
94 type RdrNamePat = InPat RdrName
95 type RdrNameHsType = HsType RdrName
96 type RdrNameQual = Qualifier Fake Fake RdrName RdrNamePat
97 type RdrNameSig = Sig RdrName
98 type RdrNameSpecInstSig = SpecInstSig RdrName
99 type RdrNameStmt = Stmt Fake Fake RdrName RdrNamePat
100 type RdrNameTyDecl = TyDecl RdrName
102 type RdrNameClassOpPragmas = ClassOpPragmas RdrName
103 type RdrNameClassPragmas = ClassPragmas RdrName
104 type RdrNameDataPragmas = DataPragmas RdrName
105 type RdrNameGenPragmas = GenPragmas RdrName
106 type RdrNameInstancePragmas = InstancePragmas RdrName
107 type RdrNameCoreExpr = GenCoreExpr RdrName RdrName RdrName RdrName
110 @extractHsTyVars@ looks just for things that could be type variables.
111 It's used when making the for-alls explicit.
114 extractHsTyVars :: HsType RdrName -> [RdrName]
118 get (MonoTyApp ty1 ty2) acc = get ty1 (get ty2 acc)
119 get (MonoListTy tc ty) acc = get ty acc
120 get (MonoTupleTy tc tys) acc = foldr get acc tys
121 get (MonoFunTy ty1 ty2) acc = get ty1 (get ty2 acc)
122 get (MonoDictTy cls ty) acc = get ty acc
123 get (MonoTyVar tv) acc = insert tv acc
124 get (HsPreForAllTy ctxt ty) acc = foldr (get . snd) (get ty acc) ctxt
125 get (HsForAllTy tvs ctxt ty) acc = filter (`notElem` locals) $
126 foldr (get . snd) (get ty acc) ctxt
128 locals = map getTyVarName tvs
130 insert (Qual _ _) acc = acc
131 insert (Unqual (TCOcc _)) acc = acc
132 insert other acc | other `elem` acc = acc
133 | otherwise = other : acc
137 A useful function for building @OpApps@. The operator is always a variable,
138 and we don't know the fixity yet.
141 mkOpApp e1 op e2 = OpApp e1 (HsVar op) (error "mkOpApp:fixity") e2
145 %************************************************************************
147 \subsection[RdrName]{The @RdrName@ datatype; names read from files}
149 %************************************************************************
154 | Qual Module OccName
156 qual (m,n) = Qual m n
157 tcQual (m,n) = Qual m (TCOcc n)
158 varQual (m,n) = Qual m (VarOcc n)
160 -- This guy is used by the reader when HsSyn has a slot for
161 -- an implicit name that's going to be filled in by
162 -- the renamer. We can't just put "error..." because
163 -- we sometimes want to print out stuff after reading but
165 dummyRdrVarName = Unqual (VarOcc SLIT("V-DUMMY"))
166 dummyRdrTcName = Unqual (VarOcc SLIT("TC-DUMMY"))
168 varUnqual n = Unqual (VarOcc n)
170 isUnqual (Unqual _) = True
171 isUnqual (Qual _ _) = False
173 isQual (Unqual _) = False
174 isQual (Qual _ _) = True
176 cmpRdr (Unqual n1) (Unqual n2) = n1 `cmp` n2
177 cmpRdr (Unqual n1) (Qual m2 n2) = LT_
178 cmpRdr (Qual m1 n1) (Unqual n2) = GT_
179 cmpRdr (Qual m1 n1) (Qual m2 n2) = (n1 `cmp` n2) `thenCmp` (_CMP_STRING_ m1 m2)
180 -- always compare module-names *second*
182 rdrNameOcc :: RdrName -> OccName
183 rdrNameOcc (Unqual occ) = occ
184 rdrNameOcc (Qual _ occ) = occ
186 instance Text RdrName where -- debugging
187 showsPrec _ rn = showString (ppShow 80 (ppr PprDebug rn))
189 instance Eq RdrName where
190 a == b = case (a `cmp` b) of { EQ_ -> True; _ -> False }
191 a /= b = case (a `cmp` b) of { EQ_ -> False; _ -> True }
193 instance Ord RdrName where
194 a <= b = case (a `cmp` b) of { LT_ -> True; EQ_ -> True; GT__ -> False }
195 a < b = case (a `cmp` b) of { LT_ -> True; EQ_ -> False; GT__ -> False }
196 a >= b = case (a `cmp` b) of { LT_ -> False; EQ_ -> True; GT__ -> True }
197 a > b = case (a `cmp` b) of { LT_ -> False; EQ_ -> False; GT__ -> True }
199 instance Ord3 RdrName where
202 instance Outputable RdrName where
203 ppr sty (Unqual n) = pprOccName sty n
204 ppr sty (Qual m n) = ppBesides [pprModule sty m, ppStr ".", pprOccName sty n]
206 instance NamedThing RdrName where -- Just so that pretty-printing of expressions works
207 getOccName = rdrNameOcc
208 getName = panic "no getName for RdrNames"
210 showRdr sty rdr = ppShow 100 (ppr sty rdr)