2 % (c) The AQUA Project, Glasgow University, 1996-1998
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...)
47 RdrNameClassOpPragmas,
51 RdrNameInstancePragmas,
53 extractHsTyRdrTyVars, extractHsTysRdrTyVars,
55 extractRuleBndrsTyVars,
56 extractHsCtxtRdrTyVars,
58 mkOpApp, mkClassDecl, mkClassOpSig, mkConDecl,
63 cvValSig, cvClassOpSig, cvInstDeclSig
66 #include "HsVersions.h"
69 import Name ( mkClassTyConOcc, mkClassDataConOcc )
70 import OccName ( mkClassTyConOcc, mkClassDataConOcc, mkWorkerOcc,
71 mkSuperDictSelOcc, mkDefaultMethodOcc
73 import RdrName ( RdrName, isRdrTyVar, mkRdrUnqual, rdrNameOcc )
74 import Util ( thenCmp )
77 import BasicTypes ( RecFlag(..) )
82 %************************************************************************
84 \subsection{Type synonyms}
86 %************************************************************************
89 type RdrNameArithSeqInfo = ArithSeqInfo RdrName RdrNamePat
90 type RdrNameBangType = BangType RdrName
91 type RdrNameClassOpSig = Sig RdrName
92 type RdrNameConDecl = ConDecl RdrName
93 type RdrNameConDetails = ConDetails RdrName
94 type RdrNameContext = HsContext RdrName
95 type RdrNameHsDecl = HsDecl RdrName RdrNamePat
96 type RdrNameSpecDataSig = SpecDataSig RdrName
97 type RdrNameDefaultDecl = DefaultDecl RdrName
98 type RdrNameForeignDecl = ForeignDecl RdrName
99 type RdrNameGRHS = GRHS RdrName RdrNamePat
100 type RdrNameGRHSs = GRHSs RdrName RdrNamePat
101 type RdrNameHsBinds = HsBinds RdrName RdrNamePat
102 type RdrNameHsExpr = HsExpr RdrName RdrNamePat
103 type RdrNameHsModule = HsModule RdrName RdrNamePat
104 type RdrNameIE = IE RdrName
105 type RdrNameImportDecl = ImportDecl RdrName
106 type RdrNameInstDecl = InstDecl RdrName RdrNamePat
107 type RdrNameMatch = Match RdrName RdrNamePat
108 type RdrNameMonoBinds = MonoBinds RdrName RdrNamePat
109 type RdrNamePat = InPat RdrName
110 type RdrNameHsType = HsType RdrName
111 type RdrNameHsTyVar = HsTyVarBndr RdrName
112 type RdrNameSig = Sig RdrName
113 type RdrNameStmt = Stmt RdrName RdrNamePat
114 type RdrNameTyClDecl = TyClDecl RdrName RdrNamePat
115 type RdrNameRuleBndr = RuleBndr RdrName
116 type RdrNameRuleDecl = RuleDecl RdrName RdrNamePat
117 type RdrNameDeprecation = DeprecDecl RdrName
118 type RdrNameFixitySig = FixitySig RdrName
120 type RdrNameHsRecordBinds = HsRecordBinds RdrName RdrNamePat
122 type RdrNameClassOpPragmas = ClassOpPragmas RdrName
123 type RdrNameClassPragmas = ClassPragmas RdrName
124 type RdrNameDataPragmas = DataPragmas RdrName
125 type RdrNameGenPragmas = GenPragmas RdrName
126 type RdrNameInstancePragmas = InstancePragmas RdrName
130 %************************************************************************
132 \subsection{A few functions over HsSyn at RdrName}
134 %************************************************************************
136 @extractHsTyRdrNames@ finds the free variables of a HsType
137 It's used when making the for-alls explicit.
140 extractHsTyRdrNames :: HsType RdrName -> [RdrName]
141 extractHsTyRdrNames ty = nub (extract_ty ty [])
143 extractHsTyRdrTyVars :: RdrNameHsType -> [RdrName]
144 extractHsTyRdrTyVars ty = filter isRdrTyVar (extractHsTyRdrNames ty)
146 extractHsTysRdrTyVars :: [RdrNameHsType] -> [RdrName]
147 extractHsTysRdrTyVars tys = filter isRdrTyVar (nub (extract_tys tys []))
149 extractRuleBndrsTyVars :: [RuleBndr RdrName] -> [RdrName]
150 extractRuleBndrsTyVars bndrs = filter isRdrTyVar (nub (foldr go [] bndrs))
152 go (RuleBndr _) acc = acc
153 go (RuleBndrSig _ ty) acc = extract_ty ty acc
155 extractHsCtxtRdrNames :: HsContext RdrName -> [RdrName]
156 extractHsCtxtRdrNames ty = nub (extract_ctxt ty [])
157 extractHsCtxtRdrTyVars :: HsContext RdrName -> [RdrName]
158 extractHsCtxtRdrTyVars ty = filter isRdrTyVar (extractHsCtxtRdrNames ty)
160 extract_ctxt ctxt acc = foldr extract_pred acc ctxt
162 extract_pred (HsPClass cls tys) acc = foldr extract_ty (cls : acc) tys
163 extract_pred (HsPIParam n ty) acc = extract_ty ty acc
165 extract_tys tys acc = foldr extract_ty acc tys
167 extract_ty (HsAppTy ty1 ty2) acc = extract_ty ty1 (extract_ty ty2 acc)
168 extract_ty (HsListTy ty) acc = extract_ty ty acc
169 extract_ty (HsTupleTy _ tys) acc = foldr extract_ty acc tys
170 extract_ty (HsFunTy ty1 ty2) acc = extract_ty ty1 (extract_ty ty2 acc)
171 extract_ty (HsPredTy p) acc = extract_pred p acc
172 extract_ty (HsUsgTy usg ty) acc = extract_ty ty acc
173 extract_ty (HsUsgForAllTy uv ty) acc = extract_ty ty acc
174 extract_ty (HsTyVar tv) acc = tv : acc
175 extract_ty (HsForAllTy Nothing ctxt ty) acc = extract_ctxt ctxt (extract_ty ty acc)
176 extract_ty (HsForAllTy (Just tvs) ctxt ty)
178 (filter (`notElem` locals) $
179 extract_ctxt ctxt (extract_ty ty []))
181 locals = map getTyVarName tvs
184 extractPatsTyVars :: [RdrNamePat] -> [RdrName]
185 extractPatsTyVars pats = filter isRdrTyVar (nub (foldr extract_pat [] pats))
187 extract_pat (SigPatIn pat ty) acc = extract_ty ty acc
188 extract_pat WildPatIn acc = acc
189 extract_pat (VarPatIn var) acc = acc
190 extract_pat (LitPatIn _) acc = acc
191 extract_pat (LazyPatIn pat) acc = extract_pat pat acc
192 extract_pat (AsPatIn a pat) acc = extract_pat pat acc
193 extract_pat (NPlusKPatIn n _) acc = acc
194 extract_pat (ConPatIn c pats) acc = foldr extract_pat acc pats
195 extract_pat (ConOpPatIn p1 c f p2) acc = extract_pat p1 (extract_pat p2 acc)
196 extract_pat (NegPatIn pat) acc = extract_pat pat acc
197 extract_pat (ParPatIn pat) acc = extract_pat pat acc
198 extract_pat (ListPatIn pats) acc = foldr extract_pat acc pats
199 extract_pat (TuplePatIn pats _) acc = foldr extract_pat acc pats
200 extract_pat (RecPatIn c fields) acc = foldr (\ (f,pat,_) acc -> extract_pat pat acc) acc fields
203 mkClassDecl builds a RdrClassDecl, filling in the names for tycon and datacon
204 by deriving them from the name of the class. We fill in the names for the
205 tycon and datacon corresponding to the class, by deriving them from the
206 name of the class itself. This saves recording the names in the interface
207 file (which would be equally good).
209 Similarly for mkConDecl, mkClassOpSig and default-method names.
212 mkClassDecl cxt cname tyvars fds sigs mbinds prags loc
213 = ClassDecl cxt cname tyvars fds sigs mbinds prags tname dname dwname sc_sel_names loc
215 cls_occ = rdrNameOcc cname
216 data_occ = mkClassDataConOcc cls_occ
217 dname = mkRdrUnqual data_occ
218 dwname = mkRdrUnqual (mkWorkerOcc data_occ)
219 tname = mkRdrUnqual (mkClassTyConOcc cls_occ)
220 sc_sel_names = [ mkRdrUnqual (mkSuperDictSelOcc n cls_occ)
221 | n <- [1..length cxt]]
222 -- We number off the superclass selectors, 1, 2, 3 etc so that we
223 -- can construct names for the selectors. Thus
224 -- class (C a, C b) => D a b where ...
225 -- gives superclass selectors
227 -- (We used to call them D_C, but now we can have two different
228 -- superclasses both called C!)
230 mkClassOpSig has_default_method op ty loc
231 = ClassOpSig op dm_rn has_default_method ty loc
233 dm_rn = mkRdrUnqual (mkDefaultMethodOcc (rdrNameOcc op))
235 mkConDecl cname ex_vars cxt details loc
236 = ConDecl cname wkr_name ex_vars cxt details loc
238 wkr_name = mkRdrUnqual (mkWorkerOcc (rdrNameOcc cname))
241 A useful function for building @OpApps@. The operator is always a variable,
242 and we don't know the fixity yet.
245 mkOpApp e1 op e2 = OpApp e1 (HsVar op) (error "mkOpApp:fixity") e2
248 %************************************************************************
250 \subsection[rdrBinding]{Bindings straight out of the parser}
252 %************************************************************************
256 = -- On input we use the Empty/And form rather than a list
258 | RdrAndBindings RdrBinding RdrBinding
260 -- Value bindings havn't been united with their
262 | RdrValBinding RdrNameMonoBinds
264 -- Signatures are mysterious; we can't
265 -- tell if its a Sig or a ClassOpSig,
266 -- so we just save the pieces:
269 -- The remainder all fit into the main HsDecl form
270 | RdrHsDecl RdrNameHsDecl
272 type SigConverter = RdrNameSig -> RdrNameSig
279 (Maybe RdrNameHsType)
283 %************************************************************************
285 \subsection[cvDecls]{Convert various top-level declarations}
287 %************************************************************************
289 We make a point not to throw any user-pragma ``sigs'' at
290 these conversion functions:
293 cvValSig, cvClassOpSig, cvInstDeclSig :: SigConverter
297 cvInstDeclSig sig = sig
299 cvClassOpSig (Sig var poly_ty src_loc) = ClassOpSig var (panic "cvClassOpSig:dm_name")
302 cvClassOpSig sig = sig
306 %************************************************************************
308 \subsection[cvBinds-etc]{Converting to @HsBinds@, @MonoBinds@, etc.}
310 %************************************************************************
312 Function definitions are restructured here. Each is assumed to be recursive
313 initially, and non recursive definitions are discovered by the dependency
317 cvBinds :: SigConverter -> RdrBinding -> RdrNameHsBinds
318 -- The mysterious SigConverter converts Sigs to ClassOpSigs
319 -- in class declarations. Mostly it's just an identity function
321 cvBinds sig_cvtr binding
322 = case (cvMonoBindsAndSigs sig_cvtr binding) of { (mbs, sigs) ->
323 MonoBind mbs sigs Recursive
328 cvMonoBindsAndSigs :: SigConverter
330 -> (RdrNameMonoBinds, [RdrNameSig])
332 cvMonoBindsAndSigs sig_cvtr fb
333 = mangle_bind (EmptyMonoBinds, []) fb
335 mangle_bind acc RdrNullBind
338 mangle_bind acc (RdrAndBindings fb1 fb2)
339 = mangle_bind (mangle_bind acc fb1) fb2
341 mangle_bind (b_acc, s_acc) (RdrSig sig)
342 = (b_acc, sig_cvtr sig : s_acc)
344 mangle_bind (b_acc, s_acc) (RdrValBinding binding)
345 = (b_acc `AndMonoBinds` binding, s_acc)
349 %************************************************************************
351 \subsection[PrefixToHS-utils]{Utilities for conversion}
353 %************************************************************************
355 Separate declarations into all the various kinds:
358 cvTopDecls :: RdrBinding -> [RdrNameHsDecl]
361 (top_decls, mono_binds, sigs) = go ([], EmptyMonoBinds, []) bind
363 (ValD (MonoBind mono_binds sigs Recursive) : top_decls)
365 go acc RdrNullBind = acc
366 go acc (RdrAndBindings b1 b2) = go (go acc b1) b2
367 go (topds, mbs, sigs) (RdrHsDecl d) = (d : topds, mbs, sigs)
368 go (topds, mbs, sigs) (RdrSig (FixSig d)) = (FixD d : topds, mbs, sigs)
369 go (topds, mbs, sigs) (RdrSig sig) = (topds, mbs, sig:sigs)
370 go (topds, mbs, sigs) (RdrValBinding bind) = (topds, mbs `AndMonoBinds` bind, sigs)