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,
63 import PrelMods ( pRELUDE )
64 import Name ( ExportFlag(..), Module(..), pprModule,
65 OccName(..), pprOccName )
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 RdrNameQual = Qualifier Fake Fake RdrName RdrNamePat
96 type RdrNameSig = Sig RdrName
97 type RdrNameSpecInstSig = SpecInstSig RdrName
98 type RdrNameStmt = Stmt Fake Fake RdrName RdrNamePat
99 type RdrNameTyDecl = TyDecl RdrName
101 type RdrNameClassOpPragmas = ClassOpPragmas RdrName
102 type RdrNameClassPragmas = ClassPragmas RdrName
103 type RdrNameDataPragmas = DataPragmas RdrName
104 type RdrNameGenPragmas = GenPragmas RdrName
105 type RdrNameInstancePragmas = InstancePragmas RdrName
106 type RdrNameCoreExpr = GenCoreExpr RdrName RdrName RdrName RdrName
109 @extractHsTyVars@ looks just for things that could be type variables.
110 It's used when making the for-alls explicit.
113 extractHsTyVars :: HsType RdrName -> [RdrName]
117 get (MonoTyApp con tys) acc = foldr get (insert con acc) tys
118 get (MonoListTy tc ty) acc = get ty acc
119 get (MonoTupleTy tc tys) acc = foldr get acc tys
120 get (MonoFunTy ty1 ty2) acc = get ty1 (get ty2 acc)
121 get (MonoDictTy cls ty) acc = get ty acc
122 get (MonoTyVar tv) acc = insert tv acc
123 get (HsPreForAllTy ctxt ty) acc = foldr (get . snd) (get ty acc) ctxt
124 get (HsForAllTy tvs ctxt ty) acc = filter (`notElem` locals) $
125 foldr (get . snd) (get ty acc) ctxt
127 locals = map getTyVarName tvs
129 insert (Qual _ _) acc = acc
130 insert (Unqual (TCOcc _)) acc = acc
131 insert other acc | other `elem` acc = acc
132 | otherwise = other : acc
136 %************************************************************************
138 \subsection[RdrName]{The @RdrName@ datatype; names read from files}
140 %************************************************************************
145 | Qual Module OccName
147 qual (m,n) = Qual m n
148 tcQual (m,n) = Qual m (TCOcc n)
149 varQual (m,n) = Qual m (VarOcc n)
151 -- This guy is used by the reader when HsSyn has a slot for
152 -- an implicit name that's going to be filled in by
153 -- the renamer. We can't just put "error..." because
154 -- we sometimes want to print out stuff after reading but
156 dummyRdrVarName = Unqual (VarOcc SLIT("V-DUMMY"))
157 dummyRdrTcName = Unqual (VarOcc SLIT("TC-DUMMY"))
159 varUnqual n = Unqual (VarOcc n)
161 isUnqual (Unqual _) = True
162 isUnqual (Qual _ _) = False
164 isQual (Unqual _) = False
165 isQual (Qual _ _) = True
167 cmpRdr (Unqual n1) (Unqual n2) = n1 `cmp` n2
168 cmpRdr (Unqual n1) (Qual m2 n2) = LT_
169 cmpRdr (Qual m1 n1) (Unqual n2) = GT_
170 cmpRdr (Qual m1 n1) (Qual m2 n2) = (n1 `cmp` n2) `thenCmp` (_CMP_STRING_ m1 m2)
171 -- always compare module-names *second*
173 rdrNameOcc :: RdrName -> OccName
174 rdrNameOcc (Unqual occ) = occ
175 rdrNameOcc (Qual _ occ) = occ
177 instance Text RdrName where -- debugging
178 showsPrec _ rn = showString (ppShow 80 (ppr PprDebug rn))
180 instance Eq RdrName where
181 a == b = case (a `cmp` b) of { EQ_ -> True; _ -> False }
182 a /= b = case (a `cmp` b) of { EQ_ -> False; _ -> True }
184 instance Ord RdrName where
185 a <= b = case (a `cmp` b) of { LT_ -> True; EQ_ -> True; GT__ -> False }
186 a < b = case (a `cmp` b) of { LT_ -> True; EQ_ -> False; GT__ -> False }
187 a >= b = case (a `cmp` b) of { LT_ -> False; EQ_ -> True; GT__ -> True }
188 a > b = case (a `cmp` b) of { LT_ -> False; EQ_ -> False; GT__ -> True }
190 instance Ord3 RdrName where
193 instance Outputable RdrName where
194 ppr sty (Unqual n) = pprOccName sty n
195 ppr sty (Qual m n) = ppBesides [pprModule sty m, ppStr ".", pprOccName sty n]
197 instance NamedThing RdrName where -- Just so that pretty-printing of expressions works
198 getOccName = rdrNameOcc
199 getName = panic "no getName for RdrNames"
201 showRdr sty rdr = ppShow 100 (ppr sty rdr)