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...)
46 RdrNameClassOpPragmas,
50 RdrNameInstancePragmas,
52 extractHsTyRdrTyVars, extractHsTysRdrTyVars,
54 extractRuleBndrsTyVars,
56 mkOpApp, mkClassDecl, mkClassOpSig,
61 cvValSig, cvClassOpSig, cvInstDeclSig
64 #include "HsVersions.h"
67 import Name ( mkClassTyConOcc, mkClassDataConOcc )
68 import OccName ( mkClassTyConOcc, mkClassDataConOcc,
69 mkSuperDictSelOcc, mkDefaultMethodOcc
71 import RdrName ( RdrName, isRdrTyVar, mkRdrUnqual, rdrNameOcc )
72 import Util ( thenCmp )
75 import BasicTypes ( RecFlag(..) )
80 %************************************************************************
82 \subsection{Type synonyms}
84 %************************************************************************
87 type RdrNameArithSeqInfo = ArithSeqInfo RdrName RdrNamePat
88 type RdrNameBangType = BangType RdrName
89 type RdrNameClassOpSig = Sig RdrName
90 type RdrNameConDecl = ConDecl RdrName
91 type RdrNameConDetails = ConDetails RdrName
92 type RdrNameContext = HsContext RdrName
93 type RdrNameHsDecl = HsDecl RdrName RdrNamePat
94 type RdrNameSpecDataSig = SpecDataSig RdrName
95 type RdrNameDefaultDecl = DefaultDecl RdrName
96 type RdrNameForeignDecl = ForeignDecl RdrName
97 type RdrNameGRHS = GRHS RdrName RdrNamePat
98 type RdrNameGRHSs = GRHSs RdrName RdrNamePat
99 type RdrNameHsBinds = HsBinds RdrName RdrNamePat
100 type RdrNameHsExpr = HsExpr RdrName RdrNamePat
101 type RdrNameHsModule = HsModule RdrName RdrNamePat
102 type RdrNameIE = IE RdrName
103 type RdrNameImportDecl = ImportDecl RdrName
104 type RdrNameInstDecl = InstDecl RdrName RdrNamePat
105 type RdrNameMatch = Match RdrName RdrNamePat
106 type RdrNameMonoBinds = MonoBinds RdrName RdrNamePat
107 type RdrNamePat = InPat RdrName
108 type RdrNameHsType = HsType RdrName
109 type RdrNameHsTyVar = HsTyVar RdrName
110 type RdrNameSig = Sig RdrName
111 type RdrNameStmt = Stmt RdrName RdrNamePat
112 type RdrNameTyClDecl = TyClDecl RdrName RdrNamePat
113 type RdrNameRuleBndr = RuleBndr RdrName
114 type RdrNameRuleDecl = RuleDecl RdrName RdrNamePat
115 type RdrNameDeprecation = Deprecation RdrName
117 type RdrNameHsRecordBinds = HsRecordBinds RdrName RdrNamePat
119 type RdrNameClassOpPragmas = ClassOpPragmas RdrName
120 type RdrNameClassPragmas = ClassPragmas RdrName
121 type RdrNameDataPragmas = DataPragmas RdrName
122 type RdrNameGenPragmas = GenPragmas RdrName
123 type RdrNameInstancePragmas = InstancePragmas RdrName
127 %************************************************************************
129 \subsection{A few functions over HsSyn at RdrName}
131 %************************************************************************
133 @extractHsTyRdrNames@ finds the free variables of a HsType
134 It's used when making the for-alls explicit.
137 extractHsTyRdrNames :: HsType RdrName -> [RdrName]
138 extractHsTyRdrNames ty = nub (extract_ty ty [])
140 extractHsTyRdrTyVars :: RdrNameHsType -> [RdrName]
141 extractHsTyRdrTyVars ty = filter isRdrTyVar (extractHsTyRdrNames ty)
143 extractHsTysRdrTyVars :: [RdrNameHsType] -> [RdrName]
144 extractHsTysRdrTyVars tys = filter isRdrTyVar (nub (extract_tys tys []))
146 extractRuleBndrsTyVars :: [RuleBndr RdrName] -> [RdrName]
147 extractRuleBndrsTyVars bndrs = filter isRdrTyVar (nub (foldr go [] bndrs))
149 go (RuleBndr _) acc = acc
150 go (RuleBndrSig _ ty) acc = extract_ty ty acc
152 extractHsCtxtRdrNames :: HsContext RdrName -> [RdrName]
153 extractHsCtxtRdrNames ty = nub (extract_ctxt ty [])
155 extract_ctxt ctxt acc = foldr extract_pred acc ctxt
157 extract_pred (HsPClass cls tys) acc = foldr extract_ty (cls : acc) tys
158 extract_pred (HsPIParam n ty) acc = extract_ty ty acc
160 extract_tys tys acc = foldr extract_ty acc tys
162 extract_ty (MonoTyApp ty1 ty2) acc = extract_ty ty1 (extract_ty ty2 acc)
163 extract_ty (MonoListTy ty) acc = extract_ty ty acc
164 extract_ty (MonoTupleTy tys _) acc = foldr extract_ty acc tys
165 extract_ty (MonoFunTy ty1 ty2) acc = extract_ty ty1 (extract_ty ty2 acc)
166 extract_ty (MonoIParamTy n ty) acc = extract_ty ty acc
167 extract_ty (MonoDictTy cls tys) acc = foldr extract_ty (cls : acc) tys
168 extract_ty (MonoUsgTy usg ty) acc = extract_ty ty acc
169 extract_ty (MonoUsgForAllTy uv ty) acc = extract_ty ty acc
170 extract_ty (MonoTyVar tv) acc = tv : acc
171 extract_ty (HsForAllTy Nothing ctxt ty) acc = extract_ctxt ctxt (extract_ty ty acc)
172 extract_ty (HsForAllTy (Just tvs) ctxt ty)
174 (filter (`notElem` locals) $
175 extract_ctxt ctxt (extract_ty ty []))
177 locals = map getTyVarName tvs
180 extractPatsTyVars :: [RdrNamePat] -> [RdrName]
181 extractPatsTyVars pats = filter isRdrTyVar (nub (foldr extract_pat [] pats))
183 extract_pat (SigPatIn pat ty) acc = extract_ty ty acc
184 extract_pat WildPatIn acc = acc
185 extract_pat (VarPatIn var) acc = acc
186 extract_pat (LitPatIn _) acc = acc
187 extract_pat (LazyPatIn pat) acc = extract_pat pat acc
188 extract_pat (AsPatIn a pat) acc = extract_pat pat acc
189 extract_pat (NPlusKPatIn n _) acc = acc
190 extract_pat (ConPatIn c pats) acc = foldr extract_pat acc pats
191 extract_pat (ConOpPatIn p1 c f p2) acc = extract_pat p1 (extract_pat p2 acc)
192 extract_pat (NegPatIn pat) acc = extract_pat pat acc
193 extract_pat (ParPatIn pat) acc = extract_pat pat acc
194 extract_pat (ListPatIn pats) acc = foldr extract_pat acc pats
195 extract_pat (TuplePatIn pats _) acc = foldr extract_pat acc pats
196 extract_pat (RecPatIn c fields) acc = foldr (\ (f,pat,_) acc -> extract_pat pat acc) acc fields
199 mkClassDecl builds a RdrClassDecl, filling in the names for tycon and datacon
200 by deriving them from the name of the class. We fill in the names for the
201 tycon and datacon corresponding to the class, by deriving them from the
202 name of the class itself. This saves recording the names in the interface
203 file (which would be equally good).
205 Similarly for mkClassOpSig and default-method names.
208 mkClassDecl cxt cname tyvars fds sigs mbinds prags loc
209 = ClassDecl cxt cname tyvars fds sigs mbinds prags tname dname sc_sel_names loc
211 cls_occ = rdrNameOcc cname
212 dname = mkRdrUnqual (mkClassDataConOcc cls_occ)
213 tname = mkRdrUnqual (mkClassTyConOcc cls_occ)
214 sc_sel_names = [ mkRdrUnqual (mkSuperDictSelOcc n cls_occ)
215 | n <- [1..length cxt]]
216 -- We number off the superclass selectors, 1, 2, 3 etc so that we
217 -- can construct names for the selectors. Thus
218 -- class (C a, C b) => D a b where ...
219 -- gives superclass selectors
221 -- (We used to call them D_C, but now we can have two different
222 -- superclasses both called C!)
224 mkClassOpSig has_default_method op ty loc
225 = ClassOpSig op dm_rn has_default_method ty loc
227 dm_rn = mkRdrUnqual (mkDefaultMethodOcc (rdrNameOcc op))
230 A useful function for building @OpApps@. The operator is always a variable,
231 and we don't know the fixity yet.
234 mkOpApp e1 op e2 = OpApp e1 (HsVar op) (error "mkOpApp:fixity") e2
237 %************************************************************************
239 \subsection[rdrBinding]{Bindings straight out of the parser}
241 %************************************************************************
245 = -- On input we use the Empty/And form rather than a list
247 | RdrAndBindings RdrBinding RdrBinding
249 -- Value bindings havn't been united with their
251 | RdrValBinding RdrNameMonoBinds
253 -- Signatures are mysterious; we can't
254 -- tell if its a Sig or a ClassOpSig,
255 -- so we just save the pieces:
258 -- The remainder all fit into the main HsDecl form
259 | RdrHsDecl RdrNameHsDecl
261 type SigConverter = RdrNameSig -> RdrNameSig
268 (Maybe RdrNameHsType)
272 %************************************************************************
274 \subsection[cvDecls]{Convert various top-level declarations}
276 %************************************************************************
278 We make a point not to throw any user-pragma ``sigs'' at
279 these conversion functions:
282 cvValSig, cvClassOpSig, cvInstDeclSig :: SigConverter
286 cvInstDeclSig sig = sig
288 cvClassOpSig (Sig var poly_ty src_loc) = ClassOpSig var (panic "cvClassOpSig:dm_name")
289 (panic "cvClassOpSig:dm_present")
291 cvClassOpSig sig = sig
295 %************************************************************************
297 \subsection[cvBinds-etc]{Converting to @HsBinds@, @MonoBinds@, etc.}
299 %************************************************************************
301 Function definitions are restructured here. Each is assumed to be recursive
302 initially, and non recursive definitions are discovered by the dependency
306 cvBinds :: SigConverter -> RdrBinding -> RdrNameHsBinds
307 -- The mysterious SigConverter converts Sigs to ClassOpSigs
308 -- in class declarations. Mostly it's just an identity function
310 cvBinds sig_cvtr binding
311 = case (cvMonoBindsAndSigs sig_cvtr binding) of { (mbs, sigs) ->
312 MonoBind mbs sigs Recursive
317 cvMonoBindsAndSigs :: SigConverter
319 -> (RdrNameMonoBinds, [RdrNameSig])
321 cvMonoBindsAndSigs sig_cvtr fb
322 = mangle_bind (EmptyMonoBinds, []) fb
324 mangle_bind acc RdrNullBind
327 mangle_bind acc (RdrAndBindings fb1 fb2)
328 = mangle_bind (mangle_bind acc fb1) fb2
330 mangle_bind (b_acc, s_acc) (RdrSig sig)
331 = (b_acc, sig_cvtr sig : s_acc)
333 mangle_bind (b_acc, s_acc) (RdrValBinding binding)
334 = (b_acc `AndMonoBinds` binding, s_acc)
338 %************************************************************************
340 \subsection[PrefixToHS-utils]{Utilities for conversion}
342 %************************************************************************
344 Separate declarations into all the various kinds:
347 cvTopDecls :: RdrBinding -> [RdrNameHsDecl]
350 (top_decls, mono_binds, sigs) = go ([], EmptyMonoBinds, []) bind
352 (ValD (MonoBind mono_binds sigs Recursive) : top_decls)
354 go acc RdrNullBind = acc
355 go acc (RdrAndBindings b1 b2) = go (go acc b1) b2
356 go (topds, mbs, sigs) (RdrHsDecl d) = (d : topds, mbs, sigs)
357 go (topds, mbs, sigs) (RdrSig (FixSig d)) = (FixD d : topds, mbs, sigs)
358 go (topds, mbs, sigs) (RdrSig sig) = (topds, mbs, sig:sigs)
359 go (topds, mbs, sigs) (RdrValBinding bind) = (topds, mbs `AndMonoBinds` bind, sigs)