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...)
45 RdrNameClassOpPragmas,
49 RdrNameInstancePragmas,
51 extractHsTyRdrTyVars, extractHsTysRdrTyVars,
53 extractRuleBndrsTyVars,
55 mkOpApp, mkClassDecl, mkClassOpSig,
60 cvValSig, cvClassOpSig, cvInstDeclSig
63 #include "HsVersions.h"
66 import Name ( mkClassTyConOcc, mkClassDataConOcc )
67 import OccName ( mkClassTyConOcc, mkClassDataConOcc,
68 mkSuperDictSelOcc, mkDefaultMethodOcc
70 import RdrName ( RdrName, isRdrTyVar, mkRdrUnqual, rdrNameOcc )
71 import Util ( thenCmp )
74 import BasicTypes ( RecFlag(..) )
79 %************************************************************************
81 \subsection{Type synonyms}
83 %************************************************************************
86 type RdrNameArithSeqInfo = ArithSeqInfo RdrName RdrNamePat
87 type RdrNameBangType = BangType RdrName
88 type RdrNameClassOpSig = Sig RdrName
89 type RdrNameConDecl = ConDecl RdrName
90 type RdrNameConDetails = ConDetails RdrName
91 type RdrNameContext = Context RdrName
92 type RdrNameHsDecl = HsDecl RdrName RdrNamePat
93 type RdrNameSpecDataSig = SpecDataSig RdrName
94 type RdrNameDefaultDecl = DefaultDecl RdrName
95 type RdrNameForeignDecl = ForeignDecl RdrName
96 type RdrNameGRHS = GRHS RdrName RdrNamePat
97 type RdrNameGRHSs = GRHSs RdrName RdrNamePat
98 type RdrNameHsBinds = HsBinds RdrName RdrNamePat
99 type RdrNameHsExpr = HsExpr RdrName RdrNamePat
100 type RdrNameHsModule = HsModule RdrName RdrNamePat
101 type RdrNameIE = IE RdrName
102 type RdrNameImportDecl = ImportDecl RdrName
103 type RdrNameInstDecl = InstDecl RdrName RdrNamePat
104 type RdrNameMatch = Match RdrName RdrNamePat
105 type RdrNameMonoBinds = MonoBinds RdrName RdrNamePat
106 type RdrNamePat = InPat RdrName
107 type RdrNameHsType = HsType RdrName
108 type RdrNameHsTyVar = HsTyVar RdrName
109 type RdrNameSig = Sig RdrName
110 type RdrNameStmt = Stmt RdrName RdrNamePat
111 type RdrNameTyClDecl = TyClDecl RdrName RdrNamePat
112 type RdrNameRuleBndr = RuleBndr RdrName
113 type RdrNameRuleDecl = RuleDecl RdrName RdrNamePat
115 type RdrNameHsRecordBinds = HsRecordBinds RdrName RdrNamePat
117 type RdrNameClassOpPragmas = ClassOpPragmas RdrName
118 type RdrNameClassPragmas = ClassPragmas RdrName
119 type RdrNameDataPragmas = DataPragmas RdrName
120 type RdrNameGenPragmas = GenPragmas RdrName
121 type RdrNameInstancePragmas = InstancePragmas RdrName
125 %************************************************************************
127 \subsection{A few functions over HsSyn at RdrName}
129 %************************************************************************
131 @extractHsTyRdrNames@ finds the free variables of a HsType
132 It's used when making the for-alls explicit.
135 extractHsTyRdrNames :: HsType RdrName -> [RdrName]
136 extractHsTyRdrNames ty = nub (extract_ty ty [])
138 extractHsTyRdrTyVars :: RdrNameHsType -> [RdrName]
139 extractHsTyRdrTyVars ty = filter isRdrTyVar (extractHsTyRdrNames ty)
141 extractHsTysRdrTyVars :: [RdrNameHsType] -> [RdrName]
142 extractHsTysRdrTyVars tys = filter isRdrTyVar (nub (extract_tys tys []))
144 extractRuleBndrsTyVars :: [RuleBndr RdrName] -> [RdrName]
145 extractRuleBndrsTyVars bndrs = filter isRdrTyVar (nub (foldr go [] bndrs))
147 go (RuleBndr _) acc = acc
148 go (RuleBndrSig _ ty) acc = extract_ty ty acc
150 extractHsCtxtRdrNames :: Context RdrName -> [RdrName]
151 extractHsCtxtRdrNames ty = nub (extract_ctxt ty [])
153 extract_ctxt ctxt acc = foldr extract_ass acc ctxt
155 extract_ass (cls, tys) acc = foldr extract_ty (cls : acc) tys
157 extract_tys tys acc = foldr extract_ty acc tys
159 extract_ty (MonoTyApp ty1 ty2) acc = extract_ty ty1 (extract_ty ty2 acc)
160 extract_ty (MonoListTy ty) acc = extract_ty ty acc
161 extract_ty (MonoTupleTy tys _) acc = foldr extract_ty acc tys
162 extract_ty (MonoFunTy ty1 ty2) acc = extract_ty ty1 (extract_ty ty2 acc)
163 extract_ty (MonoDictTy cls tys) acc = foldr extract_ty (cls : acc) tys
164 extract_ty (MonoUsgTy usg ty) acc = extract_ty ty acc
165 extract_ty (MonoUsgForAllTy uv ty) acc = extract_ty ty acc
166 extract_ty (MonoTyVar tv) acc = tv : acc
167 extract_ty (HsForAllTy Nothing ctxt ty) acc = extract_ctxt ctxt (extract_ty ty acc)
168 extract_ty (HsForAllTy (Just tvs) ctxt ty)
170 (filter (`notElem` locals) $
171 extract_ctxt ctxt (extract_ty ty []))
173 locals = map getTyVarName tvs
176 extractPatsTyVars :: [RdrNamePat] -> [RdrName]
177 extractPatsTyVars pats = filter isRdrTyVar (nub (foldr extract_pat [] pats))
179 extract_pat (SigPatIn pat ty) acc = extract_ty ty acc
180 extract_pat WildPatIn acc = acc
181 extract_pat (VarPatIn var) acc = acc
182 extract_pat (LitPatIn _) acc = acc
183 extract_pat (LazyPatIn pat) acc = extract_pat pat acc
184 extract_pat (AsPatIn a pat) acc = extract_pat pat acc
185 extract_pat (NPlusKPatIn n _) acc = acc
186 extract_pat (ConPatIn c pats) acc = foldr extract_pat acc pats
187 extract_pat (ConOpPatIn p1 c f p2) acc = extract_pat p1 (extract_pat p2 acc)
188 extract_pat (NegPatIn pat) acc = extract_pat pat acc
189 extract_pat (ParPatIn pat) acc = extract_pat pat acc
190 extract_pat (ListPatIn pats) acc = foldr extract_pat acc pats
191 extract_pat (TuplePatIn pats _) acc = foldr extract_pat acc pats
192 extract_pat (RecPatIn c fields) acc = foldr (\ (f,pat,_) acc -> extract_pat pat acc) acc fields
195 mkClassDecl builds a RdrClassDecl, filling in the names for tycon and datacon
196 by deriving them from the name of the class. We fill in the names for the
197 tycon and datacon corresponding to the class, by deriving them from the
198 name of the class itself. This saves recording the names in the interface
199 file (which would be equally good).
201 Similarly for mkClassOpSig and default-method names.
204 mkClassDecl cxt cname tyvars fds sigs mbinds prags loc
205 = ClassDecl cxt cname tyvars fds sigs mbinds prags tname dname sc_sel_names loc
207 cls_occ = rdrNameOcc cname
208 dname = mkRdrUnqual (mkClassDataConOcc cls_occ)
209 tname = mkRdrUnqual (mkClassTyConOcc cls_occ)
210 sc_sel_names = [ mkRdrUnqual (mkSuperDictSelOcc n cls_occ)
211 | n <- [1..length cxt]]
212 -- We number off the superclass selectors, 1, 2, 3 etc so that we
213 -- can construct names for the selectors. Thus
214 -- class (C a, C b) => D a b where ...
215 -- gives superclass selectors
217 -- (We used to call them D_C, but now we can have two different
218 -- superclasses both called C!)
220 mkClassOpSig has_default_method op ty loc
221 = ClassOpSig op dm_rn has_default_method ty loc
223 dm_rn = mkRdrUnqual (mkDefaultMethodOcc (rdrNameOcc op))
226 A useful function for building @OpApps@. The operator is always a variable,
227 and we don't know the fixity yet.
230 mkOpApp e1 op e2 = OpApp e1 (HsVar op) (error "mkOpApp:fixity") e2
233 %************************************************************************
235 \subsection[rdrBinding]{Bindings straight out of the parser}
237 %************************************************************************
241 = -- On input we use the Empty/And form rather than a list
243 | RdrAndBindings RdrBinding RdrBinding
245 -- Value bindings havn't been united with their
247 | RdrValBinding RdrNameMonoBinds
249 -- Signatures are mysterious; we can't
250 -- tell if its a Sig or a ClassOpSig,
251 -- so we just save the pieces:
254 -- The remainder all fit into the main HsDecl form
255 | RdrHsDecl RdrNameHsDecl
257 type SigConverter = RdrNameSig -> RdrNameSig
264 (Maybe RdrNameHsType)
268 %************************************************************************
270 \subsection[cvDecls]{Convert various top-level declarations}
272 %************************************************************************
274 We make a point not to throw any user-pragma ``sigs'' at
275 these conversion functions:
278 cvValSig, cvClassOpSig, cvInstDeclSig :: SigConverter
282 cvInstDeclSig sig = sig
284 cvClassOpSig (Sig var poly_ty src_loc) = ClassOpSig var (panic "cvClassOpSig:dm_name")
285 (panic "cvClassOpSig:dm_present")
287 cvClassOpSig sig = sig
291 %************************************************************************
293 \subsection[cvBinds-etc]{Converting to @HsBinds@, @MonoBinds@, etc.}
295 %************************************************************************
297 Function definitions are restructured here. Each is assumed to be recursive
298 initially, and non recursive definitions are discovered by the dependency
302 cvBinds :: SigConverter -> RdrBinding -> RdrNameHsBinds
303 -- The mysterious SigConverter converts Sigs to ClassOpSigs
304 -- in class declarations. Mostly it's just an identity function
306 cvBinds sig_cvtr binding
307 = case (cvMonoBindsAndSigs sig_cvtr binding) of { (mbs, sigs) ->
308 MonoBind mbs sigs Recursive
313 cvMonoBindsAndSigs :: SigConverter
315 -> (RdrNameMonoBinds, [RdrNameSig])
317 cvMonoBindsAndSigs sig_cvtr fb
318 = mangle_bind (EmptyMonoBinds, []) fb
320 mangle_bind acc RdrNullBind
323 mangle_bind acc (RdrAndBindings fb1 fb2)
324 = mangle_bind (mangle_bind acc fb1) fb2
326 mangle_bind (b_acc, s_acc) (RdrSig sig)
327 = (b_acc, sig_cvtr sig : s_acc)
329 mangle_bind (b_acc, s_acc) (RdrValBinding binding)
330 = (b_acc `AndMonoBinds` binding, s_acc)
334 %************************************************************************
336 \subsection[PrefixToHS-utils]{Utilities for conversion}
338 %************************************************************************
340 Separate declarations into all the various kinds:
343 cvTopDecls :: RdrBinding -> [RdrNameHsDecl]
346 (top_decls, mono_binds, sigs) = go ([], EmptyMonoBinds, []) bind
348 (ValD (MonoBind mono_binds sigs Recursive) : top_decls)
350 go acc RdrNullBind = acc
351 go acc (RdrAndBindings b1 b2) = go (go acc b1) b2
352 go (topds, mbs, sigs) (RdrHsDecl d) = (d : topds, mbs, sigs)
353 go (topds, mbs, sigs) (RdrSig (FixSig d)) = (FixD d : topds, mbs, sigs)
354 go (topds, mbs, sigs) (RdrSig sig) = (topds, mbs, sig:sigs)
355 go (topds, mbs, sigs) (RdrValBinding bind) = (topds, mbs `AndMonoBinds` bind, sigs)