[project @ 2002-04-05 15:18:25 by sof]
[ghc-hetmet.git] / ghc / compiler / rename / RnSource.lhs
1 %
2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
3 %
4 \section[RnSource]{Main pass of renamer}
5
6 \begin{code}
7 module RnSource ( rnTyClDecl, rnIfaceRuleDecl, rnInstDecl, rnSourceDecls, 
8         ) where
9
10 #include "HsVersions.h"
11
12 import RnExpr
13 import HsSyn
14 import HscTypes         ( GlobalRdrEnv, AvailEnv )
15 import RdrName          ( RdrName, isRdrDataCon, elemRdrEnv )
16 import RdrHsSyn         ( RdrNameConDecl, RdrNameTyClDecl,
17                           extractGenericPatTyVars
18                         )
19 import RnHsSyn
20 import HsCore
21
22 import RnTypes          ( rnHsType, rnHsSigType, rnHsTypeFVs, rnContext )
23
24 import RnBinds          ( rnTopBinds, rnMethodBinds, renameSigs, renameSigsFVs )
25 import RnEnv            ( lookupTopBndrRn, lookupOccRn, lookupIfaceName,
26                           lookupSysBinder, newLocalsRn,
27                           bindLocalsFVRn, bindPatSigTyVars,
28                           bindTyVarsRn, extendTyVarEnvFVRn,
29                           bindCoreLocalRn, bindCoreLocalsRn, bindLocalNames,
30                           checkDupOrQualNames, checkDupNames, mapFvRn
31                         )
32 import RnMonad
33
34 import Class            ( FunDep, DefMeth (..) )
35 import TyCon            ( DataConDetails(..), visibleDataCons )
36 import DataCon          ( dataConWorkId )
37 import Name             ( Name, NamedThing(..) )
38 import NameSet
39 import PrelNames        ( deRefStablePtrName, newStablePtrName,
40                           bindIOName, returnIOName
41                         )
42 import TysWiredIn       ( tupleCon )
43 import List             ( partition )
44 import Outputable
45 import SrcLoc           ( SrcLoc )
46 import CmdLineOpts      ( DynFlag(..) )
47                                 -- Warn of unused for-all'd tyvars
48 import Maybes           ( maybeToBool )
49 import Maybe            ( maybe )
50 \end{code}
51
52 @rnSourceDecl@ `renames' declarations.
53 It simultaneously performs dependency analysis and precedence parsing.
54 It also does the following error checks:
55 \begin{enumerate}
56 \item
57 Checks that tyvars are used properly. This includes checking
58 for undefined tyvars, and tyvars in contexts that are ambiguous.
59 (Some of this checking has now been moved to module @TcMonoType@,
60 since we don't have functional dependency information at this point.)
61 \item
62 Checks that all variable occurences are defined.
63 \item 
64 Checks the @(..)@ etc constraints in the export list.
65 \end{enumerate}
66
67
68 %*********************************************************
69 %*                                                      *
70 \subsection{Source code declarations}
71 %*                                                      *
72 %*********************************************************
73
74 \begin{code}
75 rnSourceDecls :: GlobalRdrEnv -> AvailEnv -> LocalFixityEnv -> RnMode
76               -> [RdrNameHsDecl] 
77               -> RnMG ([RenamedHsDecl], FreeVars)
78         -- The decls get reversed, but that's ok
79
80 rnSourceDecls gbl_env avails local_fixity_env mode decls
81   = initRnMS gbl_env avails emptyRdrEnv local_fixity_env mode (go emptyFVs [] decls)
82   where
83         -- Fixity and deprecations have been dealt with already; ignore them
84     go fvs ds' []             = returnRn (ds', fvs)
85     go fvs ds' (FixD _:ds)    = go fvs ds' ds
86     go fvs ds' (DeprecD _:ds) = go fvs ds' ds
87     go fvs ds' (d:ds)         = rnSourceDecl d  `thenRn` \(d', fvs') ->
88                                 go (fvs `plusFV` fvs') (d':ds') ds
89
90
91 rnSourceDecl :: RdrNameHsDecl -> RnMS (RenamedHsDecl, FreeVars)
92
93 rnSourceDecl (ValD binds) = rnTopBinds binds    `thenRn` \ (new_binds, fvs) ->
94                             returnRn (ValD new_binds, fvs)
95
96 rnSourceDecl (TyClD tycl_decl)
97   = rnTyClDecl tycl_decl                        `thenRn` \ new_decl ->
98     finishSourceTyClDecl tycl_decl new_decl     `thenRn` \ (new_decl', fvs) ->
99     returnRn (TyClD new_decl', fvs `plusFV` tyClDeclFVs new_decl')
100
101 rnSourceDecl (InstD inst)
102   = rnInstDecl inst                     `thenRn` \ new_inst ->
103     finishSourceInstDecl inst new_inst  `thenRn` \ (new_inst', fvs) ->
104     returnRn (InstD new_inst', fvs `plusFV` instDeclFVs new_inst')
105
106 rnSourceDecl (RuleD rule)
107   = rnHsRuleDecl rule           `thenRn` \ (new_rule, fvs) ->
108     returnRn (RuleD new_rule, fvs)
109
110 rnSourceDecl (ForD ford)
111   = rnHsForeignDecl ford                `thenRn` \ (new_ford, fvs) ->
112     returnRn (ForD new_ford, fvs)
113
114 rnSourceDecl (DefD (DefaultDecl tys src_loc))
115   = pushSrcLocRn src_loc $
116     mapFvRn (rnHsTypeFVs doc_str) tys           `thenRn` \ (tys', fvs) ->
117     returnRn (DefD (DefaultDecl tys' src_loc), fvs)
118   where
119     doc_str = text "In a `default' declaration"
120 \end{code}
121
122
123 %*********************************************************
124 %*                                                      *
125 \subsection{Foreign declarations}
126 %*                                                      *
127 %*********************************************************
128
129 \begin{code}
130 rnHsForeignDecl (ForeignImport name ty spec isDeprec src_loc)
131   = pushSrcLocRn src_loc                $
132     lookupTopBndrRn name                `thenRn` \ name' ->
133     rnHsTypeFVs (fo_decl_msg name) ty   `thenRn` \ (ty', fvs) ->
134     returnRn (ForeignImport name' ty' spec isDeprec src_loc, 
135               fvs `plusFV` extras spec)
136   where
137     extras (CImport _ _ _ _ CWrapper) = mkFVs [newStablePtrName,
138                                                deRefStablePtrName,  
139                                                bindIOName, returnIOName]
140     extras _                          = emptyFVs
141
142 rnHsForeignDecl (ForeignExport name ty spec isDeprec src_loc)
143   = pushSrcLocRn src_loc                        $
144     lookupOccRn name                            `thenRn` \ name' ->
145     rnHsTypeFVs (fo_decl_msg name) ty           `thenRn` \ (ty', fvs) ->
146     returnRn (ForeignExport name' ty' spec isDeprec src_loc, 
147               mkFVs [bindIOName, returnIOName] `plusFV` fvs)
148
149 fo_decl_msg name = ptext SLIT("The foreign declaration for") <+> ppr name
150 \end{code}
151
152
153 %*********************************************************
154 %*                                                      *
155 \subsection{Instance declarations}
156 %*                                                      *
157 %*********************************************************
158
159 \begin{code}
160 rnInstDecl (InstDecl inst_ty mbinds uprags maybe_dfun_rdr_name src_loc)
161         -- Used for both source and interface file decls
162   = pushSrcLocRn src_loc $
163     rnHsSigType (text "an instance decl") inst_ty       `thenRn` \ inst_ty' ->
164
165     (case maybe_dfun_rdr_name of
166         Nothing            -> returnRn Nothing
167         Just dfun_rdr_name -> lookupIfaceName dfun_rdr_name     `thenRn` \ dfun_name ->
168                               returnRn (Just dfun_name)
169     )                                                   `thenRn` \ maybe_dfun_name ->
170
171     -- The typechecker checks that all the bindings are for the right class.
172     returnRn (InstDecl inst_ty' EmptyMonoBinds [] maybe_dfun_name src_loc)
173
174 -- Compare finishSourceTyClDecl
175 finishSourceInstDecl (InstDecl _       mbinds uprags _               _      )
176                      (InstDecl inst_ty _      _      maybe_dfun_name src_loc)
177         -- Used for both source decls only
178   = ASSERT( not (maybeToBool maybe_dfun_name) ) -- Source decl!
179     let
180         meth_doc    = text "In the bindings in an instance declaration"
181         meth_names  = collectLocatedMonoBinders mbinds
182         (inst_tyvars, (cls,_)) = getHsInstHead inst_ty
183         -- (Slightly strangely) the forall-d tyvars scope over
184         -- the method bindings too
185     in
186
187         -- Rename the bindings
188         -- NB meth_names can be qualified!
189     checkDupNames meth_doc meth_names           `thenRn_`
190     extendTyVarEnvFVRn (map hsTyVarName inst_tyvars) (          
191         rnMethodBinds cls [] mbinds
192     )                                           `thenRn` \ (mbinds', meth_fvs) ->
193     let 
194         binders    = collectMonoBinders mbinds'
195         binder_set = mkNameSet binders
196     in
197         -- Rename the prags and signatures.
198         -- Note that the type variables are not in scope here,
199         -- so that      instance Eq a => Eq (T a) where
200         --                      {-# SPECIALISE instance Eq a => Eq (T [a]) #-}
201         -- works OK. 
202         --
203         -- But the (unqualified) method names are in scope
204     bindLocalNames binders (
205        renameSigsFVs (okInstDclSig binder_set) uprags
206     )                                                   `thenRn` \ (uprags', prag_fvs) ->
207
208     returnRn (InstDecl inst_ty mbinds' uprags' maybe_dfun_name src_loc,
209               meth_fvs `plusFV` prag_fvs)
210 \end{code}
211
212 %*********************************************************
213 %*                                                      *
214 \subsection{Rules}
215 %*                                                      *
216 %*********************************************************
217
218 \begin{code}
219 rnIfaceRuleDecl (IfaceRule rule_name act vars fn args rhs src_loc)
220   = pushSrcLocRn src_loc        $
221     lookupOccRn fn              `thenRn` \ fn' ->
222     rnCoreBndrs vars            $ \ vars' ->
223     mapRn rnCoreExpr args       `thenRn` \ args' ->
224     rnCoreExpr rhs              `thenRn` \ rhs' ->
225     returnRn (IfaceRule rule_name act vars' fn' args' rhs' src_loc)
226
227 rnIfaceRuleDecl (IfaceRuleOut fn rule)          -- Builtin rules come this way
228   = lookupOccRn fn              `thenRn` \ fn' ->
229     returnRn (IfaceRuleOut fn' rule)
230
231 rnHsRuleDecl (HsRule rule_name act vars lhs rhs src_loc)
232   = pushSrcLocRn src_loc                                $
233     bindPatSigTyVars (collectRuleBndrSigTys vars)       $
234
235     bindLocalsFVRn doc (map get_var vars)       $ \ ids ->
236     mapFvRn rn_var (vars `zip` ids)             `thenRn` \ (vars', fv_vars) ->
237
238     rnExpr lhs                                  `thenRn` \ (lhs', fv_lhs) ->
239     rnExpr rhs                                  `thenRn` \ (rhs', fv_rhs) ->
240     checkRn (validRuleLhs ids lhs')
241             (badRuleLhsErr rule_name lhs')      `thenRn_`
242     let
243         bad_vars = [var | var <- ids, not (var `elemNameSet` fv_lhs)]
244     in
245     mapRn (addErrRn . badRuleVar rule_name) bad_vars    `thenRn_`
246     returnRn (HsRule rule_name act vars' lhs' rhs' src_loc,
247               fv_vars `plusFV` fv_lhs `plusFV` fv_rhs)
248   where
249     doc = text "In the transformation rule" <+> ptext rule_name
250   
251     get_var (RuleBndr v)      = v
252     get_var (RuleBndrSig v _) = v
253
254     rn_var (RuleBndr v, id)      = returnRn (RuleBndr id, emptyFVs)
255     rn_var (RuleBndrSig v t, id) = rnHsTypeFVs doc t    `thenRn` \ (t', fvs) ->
256                                    returnRn (RuleBndrSig id t', fvs)
257 \end{code}
258
259
260 %*********************************************************
261 %*                                                      *
262 \subsection{Type, class and iface sig declarations}
263 %*                                                      *
264 %*********************************************************
265
266 @rnTyDecl@ uses the `global name function' to create a new type
267 declaration in which local names have been replaced by their original
268 names, reporting any unknown names.
269
270 Renaming type variables is a pain. Because they now contain uniques,
271 it is necessary to pass in an association list which maps a parsed
272 tyvar to its @Name@ representation.
273 In some cases (type signatures of values),
274 it is even necessary to go over the type first
275 in order to get the set of tyvars used by it, make an assoc list,
276 and then go over it again to rename the tyvars!
277 However, we can also do some scoping checks at the same time.
278
279 \begin{code}
280 rnTyClDecl (IfaceSig {tcdName = name, tcdType = ty, tcdIdInfo = id_infos, tcdLoc = loc})
281   = pushSrcLocRn loc $
282     lookupTopBndrRn name                `thenRn` \ name' ->
283     rnHsType doc_str ty                 `thenRn` \ ty' ->
284     mapRn rnIdInfo id_infos             `thenRn` \ id_infos' -> 
285     returnRn (IfaceSig {tcdName = name', tcdType = ty', tcdIdInfo = id_infos', tcdLoc = loc})
286   where
287     doc_str = text "In the interface signature for" <+> quotes (ppr name)
288
289 rnTyClDecl (CoreDecl {tcdName = name, tcdType = ty, tcdRhs = rhs, tcdLoc = loc})
290   = pushSrcLocRn loc $
291     lookupTopBndrRn name                `thenRn` \ name' ->
292     rnHsType doc_str ty                 `thenRn` \ ty' ->
293     rnCoreExpr rhs                      `thenRn` \ rhs' ->
294     returnRn (CoreDecl {tcdName = name', tcdType = ty', tcdRhs = rhs', tcdLoc = loc})
295   where
296     doc_str = text "In the Core declaration for" <+> quotes (ppr name)
297
298 rnTyClDecl (ForeignType {tcdName = name, tcdFoType = fo_type, tcdExtName = ext_name, tcdLoc = loc})
299   = pushSrcLocRn loc                    $
300     lookupTopBndrRn name                `thenRn` \ name' ->
301     returnRn (ForeignType {tcdName = name', tcdFoType = fo_type, tcdExtName = ext_name, tcdLoc = loc})
302
303 rnTyClDecl (TyData {tcdND = new_or_data, tcdCtxt = context, tcdName = tycon,
304                     tcdTyVars = tyvars, tcdCons = condecls, 
305                     tcdDerivs = derivs, tcdLoc = src_loc, tcdSysNames = sys_names})
306   = pushSrcLocRn src_loc $
307     lookupTopBndrRn tycon                       `thenRn` \ tycon' ->
308     bindTyVarsRn data_doc tyvars                $ \ tyvars' ->
309     rnContext data_doc context                  `thenRn` \ context' ->
310     rn_derivs derivs                            `thenRn` \ derivs' ->
311     checkDupOrQualNames data_doc con_names      `thenRn_`
312
313     rnConDecls tycon' condecls                  `thenRn` \ condecls' ->
314     mapRn lookupSysBinder sys_names             `thenRn` \ sys_names' ->
315     returnRn (TyData {tcdND = new_or_data, tcdCtxt = context', tcdName = tycon',
316                       tcdTyVars = tyvars', tcdCons = condecls', 
317                       tcdDerivs = derivs', tcdLoc = src_loc, tcdSysNames = sys_names'})
318   where
319     data_doc = text "In the data type declaration for" <+> quotes (ppr tycon)
320     con_names = map conDeclName (visibleDataCons condecls)
321
322     rn_derivs Nothing   = returnRn Nothing
323     rn_derivs (Just ds) = rnContext data_doc ds `thenRn` \ ds' -> returnRn (Just ds')
324     
325 rnTyClDecl (TySynonym {tcdName = name, tcdTyVars = tyvars, tcdSynRhs = ty, tcdLoc = src_loc})
326   = pushSrcLocRn src_loc $
327     lookupTopBndrRn name                        `thenRn` \ name' ->
328     bindTyVarsRn syn_doc tyvars                 $ \ tyvars' ->
329     rnHsType syn_doc ty                         `thenRn` \ ty' ->
330     returnRn (TySynonym {tcdName = name', tcdTyVars = tyvars', tcdSynRhs = ty', tcdLoc = src_loc})
331   where
332     syn_doc = text "In the declaration for type synonym" <+> quotes (ppr name)
333
334 rnTyClDecl (ClassDecl {tcdCtxt = context, tcdName = cname, 
335                        tcdTyVars = tyvars, tcdFDs = fds, tcdSigs = sigs, 
336                        tcdSysNames = names, tcdLoc = src_loc})
337         -- Used for both source and interface file decls
338   = pushSrcLocRn src_loc $
339
340     lookupTopBndrRn cname                       `thenRn` \ cname' ->
341
342         -- Deal with the implicit tycon and datacon name
343         -- They aren't in scope (because they aren't visible to the user)
344         -- and what we want to do is simply look them up in the cache;
345         -- we jolly well ought to get a 'hit' there!
346     mapRn lookupSysBinder names                 `thenRn` \ names' ->
347
348         -- Tyvars scope over bindings and context
349     bindTyVarsRn cls_doc tyvars                 $ \ tyvars' ->
350
351         -- Check the superclasses
352     rnContext cls_doc context                   `thenRn` \ context' ->
353
354         -- Check the functional dependencies
355     rnFds cls_doc fds                           `thenRn` \ fds' ->
356
357         -- Check the signatures
358         -- First process the class op sigs (op_sigs), then the fixity sigs (non_op_sigs).
359     let
360         (op_sigs, non_op_sigs) = partition isClassOpSig sigs
361         sig_rdr_names_w_locs   = [(op,locn) | ClassOpSig op _ _ locn <- sigs]
362     in
363     checkDupOrQualNames sig_doc sig_rdr_names_w_locs    `thenRn_` 
364     mapRn (rnClassOp cname' fds') op_sigs               `thenRn` \ sigs' ->
365     let
366         binders = mkNameSet [ nm | (ClassOpSig nm _ _ _) <- sigs' ]
367     in
368     renameSigs (okClsDclSig binders) non_op_sigs          `thenRn` \ non_ops' ->
369
370         -- Typechecker is responsible for checking that we only
371         -- give default-method bindings for things in this class.
372         -- The renamer *could* check this for class decls, but can't
373         -- for instance decls.
374
375     returnRn (ClassDecl { tcdCtxt = context', tcdName = cname', tcdTyVars = tyvars',
376                           tcdFDs = fds', tcdSigs = non_ops' ++ sigs', tcdMeths = Nothing, 
377                           tcdSysNames = names', tcdLoc = src_loc})
378   where
379     cls_doc  = text "In the declaration for class"      <+> ppr cname
380     sig_doc  = text "In the signatures for class"       <+> ppr cname
381
382 rnClassOp clas clas_fds sig@(ClassOpSig op dm_stuff ty locn)
383   = pushSrcLocRn locn $
384     lookupTopBndrRn op                  `thenRn` \ op_name ->
385     
386         -- Check the signature
387     rnHsSigType (quotes (ppr op)) ty    `thenRn` \ new_ty ->
388     
389         -- Make the default-method name
390     (case dm_stuff of 
391         DefMeth dm_rdr_name
392             ->  -- Imported class that has a default method decl
393                 -- See comments with tname, snames, above
394                 lookupSysBinder dm_rdr_name     `thenRn` \ dm_name ->
395                 returnRn (DefMeth dm_name)
396                         -- An imported class decl for a class decl that had an explicit default
397                         -- method, mentions, rather than defines,
398                         -- the default method, so we must arrange to pull it in
399
400         GenDefMeth -> returnRn GenDefMeth
401         NoDefMeth  -> returnRn NoDefMeth
402     )                                           `thenRn` \ dm_stuff' ->
403     
404     returnRn (ClassOpSig op_name dm_stuff' new_ty locn)
405
406 finishSourceTyClDecl :: RdrNameTyClDecl -> RenamedTyClDecl -> RnMS (RenamedTyClDecl, FreeVars)
407         -- Used for source file decls only
408         -- Renames the default-bindings of a class decl
409 finishSourceTyClDecl (ClassDecl {tcdMeths = Just mbinds, tcdLoc = src_loc})     -- Get mbinds from here
410          rn_cls_decl@(ClassDecl {tcdName = cls, tcdTyVars = tyvars})            -- Everything else is here
411   -- There are some default-method bindings (abeit possibly empty) so 
412   -- this is a source-code class declaration
413   =     -- The newLocals call is tiresome: given a generic class decl
414         --      class C a where
415         --        op :: a -> a
416         --        op {| x+y |} (Inl a) = ...
417         --        op {| x+y |} (Inr b) = ...
418         --        op {| a*b |} (a*b)   = ...
419         -- we want to name both "x" tyvars with the same unique, so that they are
420         -- easy to group together in the typechecker.  
421         -- Hence the 
422     pushSrcLocRn src_loc                                $
423     extendTyVarEnvFVRn (map hsTyVarName tyvars)         $
424     getLocalNameEnv                                     `thenRn` \ name_env ->
425     let
426         meth_rdr_names_w_locs = collectLocatedMonoBinders mbinds
427         gen_rdr_tyvars_w_locs = [(tv,src_loc) | tv <- extractGenericPatTyVars mbinds,
428                                                 not (tv `elemRdrEnv` name_env)]
429     in
430     checkDupOrQualNames meth_doc meth_rdr_names_w_locs  `thenRn_`
431     newLocalsRn gen_rdr_tyvars_w_locs                   `thenRn` \ gen_tyvars ->
432     rnMethodBinds cls gen_tyvars mbinds                 `thenRn` \ (mbinds', meth_fvs) ->
433     returnRn (rn_cls_decl {tcdMeths = Just mbinds'}, meth_fvs)
434   where
435     meth_doc = text "In the default-methods for class"  <+> ppr (tcdName rn_cls_decl)
436
437 finishSourceTyClDecl _ tycl_decl@(TyData {tcdDerivs = derivings})
438   -- Derivings are returned here so that they don't form part of the tyClDeclFVs.
439   -- This is important, because tyClDeclFVs should contain only the
440   -- FVs that are `needed' by the interface file declaration, and
441   -- derivings do not appear in this.  It also means that the tcGroups
442   -- are smaller, which turned out to be important for the usage inference. KSW 2002-02.
443   = returnRn (tycl_decl,
444               maybe emptyFVs extractHsCtxtTyNames derivings)
445
446 finishSourceTyClDecl _ tycl_decl = returnRn (tycl_decl, emptyFVs)
447         -- Not a class declaration
448 \end{code}
449
450
451 %*********************************************************
452 %*                                                      *
453 \subsection{Support code for type/data declarations}
454 %*                                                      *
455 %*********************************************************
456
457 \begin{code}
458 conDeclName :: RdrNameConDecl -> (RdrName, SrcLoc)
459 conDeclName (ConDecl n _ _ _ _ l) = (n,l)
460
461 rnConDecls :: Name -> DataConDetails RdrNameConDecl -> RnMS (DataConDetails RenamedConDecl)
462 rnConDecls tycon Unknown     = returnRn Unknown
463 rnConDecls tycon (HasCons n) = returnRn (HasCons n)
464 rnConDecls tycon (DataCons condecls)
465   =     -- Check that there's at least one condecl,
466         -- or else we're reading an interface file, or -fglasgow-exts
467     (if null condecls then
468         doptRn Opt_GlasgowExts  `thenRn` \ glaExts ->
469         getModeRn               `thenRn` \ mode ->
470         checkRn (glaExts || isInterfaceMode mode)
471                 (emptyConDeclsErr tycon)
472      else returnRn ()
473     )                                           `thenRn_` 
474
475     mapRn rnConDecl condecls                    `thenRn` \ condecls' ->
476     returnRn (DataCons condecls')
477
478 rnConDecl :: RdrNameConDecl -> RnMS RenamedConDecl
479 rnConDecl (ConDecl name wkr tvs cxt details locn)
480   = pushSrcLocRn locn $
481     checkConName name           `thenRn_` 
482     lookupTopBndrRn name        `thenRn` \ new_name ->
483
484     lookupSysBinder wkr         `thenRn` \ new_wkr ->
485         -- See comments with ClassDecl
486
487     bindTyVarsRn doc tvs                $ \ new_tyvars ->
488     rnContext doc cxt                   `thenRn` \ new_context ->
489     rnConDetails doc locn details       `thenRn` \ new_details -> 
490     returnRn (ConDecl new_name new_wkr new_tyvars new_context new_details locn)
491   where
492     doc = text "In the definition of data constructor" <+> quotes (ppr name)
493
494 rnConDetails doc locn (VanillaCon tys)
495   = mapRn (rnBangTy doc) tys    `thenRn` \ new_tys  ->
496     returnRn (VanillaCon new_tys)
497
498 rnConDetails doc locn (InfixCon ty1 ty2)
499   = rnBangTy doc ty1            `thenRn` \ new_ty1 ->
500     rnBangTy doc ty2            `thenRn` \ new_ty2 ->
501     returnRn (InfixCon new_ty1 new_ty2)
502
503 rnConDetails doc locn (RecCon fields)
504   = checkDupOrQualNames doc field_names `thenRn_`
505     mapRn (rnField doc) fields          `thenRn` \ new_fields ->
506     returnRn (RecCon new_fields)
507   where
508     field_names = [(fld, locn) | (flds, _) <- fields, fld <- flds]
509
510 rnField doc (names, ty)
511   = mapRn lookupTopBndrRn names `thenRn` \ new_names ->
512     rnBangTy doc ty             `thenRn` \ new_ty ->
513     returnRn (new_names, new_ty) 
514
515 rnBangTy doc (BangType s ty)
516   = rnHsType doc ty             `thenRn` \ new_ty ->
517     returnRn (BangType s new_ty)
518
519 -- This data decl will parse OK
520 --      data T = a Int
521 -- treating "a" as the constructor.
522 -- It is really hard to make the parser spot this malformation.
523 -- So the renamer has to check that the constructor is legal
524 --
525 -- We can get an operator as the constructor, even in the prefix form:
526 --      data T = :% Int Int
527 -- from interface files, which always print in prefix form
528
529 checkConName name
530   = checkRn (isRdrDataCon name)
531             (badDataCon name)
532 \end{code}
533
534
535 %*********************************************************
536 %*                                                      *
537 \subsection{Support code to rename types}
538 %*                                                      *
539 %*********************************************************
540
541 \begin{code}
542 rnFds :: SDoc -> [FunDep RdrName] -> RnMS [FunDep Name]
543
544 rnFds doc fds
545   = mapRn rn_fds fds
546   where
547     rn_fds (tys1, tys2)
548       = rnHsTyVars doc tys1             `thenRn` \ tys1' ->
549         rnHsTyVars doc tys2             `thenRn` \ tys2' ->
550         returnRn (tys1', tys2')
551
552 rnHsTyVars doc tvs  = mapRn (rnHsTyvar doc) tvs
553 rnHsTyvar doc tyvar = lookupOccRn tyvar
554 \end{code}
555
556 %*********************************************************
557 %*                                                       *
558 \subsection{IdInfo}
559 %*                                                       *
560 %*********************************************************
561
562 \begin{code}
563 rnIdInfo (HsWorker worker arity)
564   = lookupOccRn worker                  `thenRn` \ worker' ->
565     returnRn (HsWorker worker' arity)
566
567 rnIdInfo (HsUnfold inline expr) = rnCoreExpr expr `thenRn` \ expr' ->
568                                   returnRn (HsUnfold inline expr')
569 rnIdInfo (HsStrictness str)     = returnRn (HsStrictness str)
570 rnIdInfo (HsArity arity)        = returnRn (HsArity arity)
571 rnIdInfo HsNoCafRefs            = returnRn HsNoCafRefs
572 \end{code}
573
574 @UfCore@ expressions.
575
576 \begin{code}
577 rnCoreExpr (UfType ty)
578   = rnHsType (text "unfolding type") ty `thenRn` \ ty' ->
579     returnRn (UfType ty')
580
581 rnCoreExpr (UfVar v)
582   = lookupOccRn v       `thenRn` \ v' ->
583     returnRn (UfVar v')
584
585 rnCoreExpr (UfLit l)
586   = returnRn (UfLit l)
587
588 rnCoreExpr (UfLitLit l ty)
589   = rnHsType (text "litlit") ty `thenRn` \ ty' ->
590     returnRn (UfLitLit l ty')
591
592 rnCoreExpr (UfFCall cc ty)
593   = rnHsType (text "ccall") ty  `thenRn` \ ty' ->
594     returnRn (UfFCall cc ty')
595
596 rnCoreExpr (UfTuple (HsTupCon _ boxity arity) args) 
597   = mapRn rnCoreExpr args               `thenRn` \ args' ->
598     returnRn (UfTuple (HsTupCon tup_name boxity arity) args')
599   where
600     tup_name = getName (dataConWorkId (tupleCon boxity arity))
601         -- Get the *worker* name and use that
602
603 rnCoreExpr (UfApp fun arg)
604   = rnCoreExpr fun              `thenRn` \ fun' ->
605     rnCoreExpr arg              `thenRn` \ arg' ->
606     returnRn (UfApp fun' arg')
607
608 rnCoreExpr (UfCase scrut bndr alts)
609   = rnCoreExpr scrut                    `thenRn` \ scrut' ->
610     bindCoreLocalRn bndr                $ \ bndr' ->
611     mapRn rnCoreAlt alts                `thenRn` \ alts' ->
612     returnRn (UfCase scrut' bndr' alts')
613
614 rnCoreExpr (UfNote note expr) 
615   = rnNote note                 `thenRn` \ note' ->
616     rnCoreExpr expr             `thenRn` \ expr' ->
617     returnRn  (UfNote note' expr')
618
619 rnCoreExpr (UfLam bndr body)
620   = rnCoreBndr bndr             $ \ bndr' ->
621     rnCoreExpr body             `thenRn` \ body' ->
622     returnRn (UfLam bndr' body')
623
624 rnCoreExpr (UfLet (UfNonRec bndr rhs) body)
625   = rnCoreExpr rhs              `thenRn` \ rhs' ->
626     rnCoreBndr bndr             $ \ bndr' ->
627     rnCoreExpr body             `thenRn` \ body' ->
628     returnRn (UfLet (UfNonRec bndr' rhs') body')
629
630 rnCoreExpr (UfLet (UfRec pairs) body)
631   = rnCoreBndrs bndrs           $ \ bndrs' ->
632     mapRn rnCoreExpr rhss       `thenRn` \ rhss' ->
633     rnCoreExpr body             `thenRn` \ body' ->
634     returnRn (UfLet (UfRec (bndrs' `zip` rhss')) body')
635   where
636     (bndrs, rhss) = unzip pairs
637 \end{code}
638
639 \begin{code}
640 rnCoreBndr (UfValBinder name ty) thing_inside
641   = rnHsType doc ty             `thenRn` \ ty' ->
642     bindCoreLocalRn name        $ \ name' ->
643     thing_inside (UfValBinder name' ty')
644   where
645     doc = text "unfolding id"
646     
647 rnCoreBndr (UfTyBinder name kind) thing_inside
648   = bindCoreLocalRn name                $ \ name' ->
649     thing_inside (UfTyBinder name' kind)
650     
651 rnCoreBndrs []     thing_inside = thing_inside []
652 rnCoreBndrs (b:bs) thing_inside = rnCoreBndr b          $ \ name' ->
653                                   rnCoreBndrs bs        $ \ names' ->
654                                   thing_inside (name':names')
655 \end{code}    
656
657 \begin{code}
658 rnCoreAlt (con, bndrs, rhs)
659   = rnUfCon con                         `thenRn` \ con' ->
660     bindCoreLocalsRn bndrs              $ \ bndrs' ->
661     rnCoreExpr rhs                      `thenRn` \ rhs' ->
662     returnRn (con', bndrs', rhs')
663
664 rnNote (UfCoerce ty)
665   = rnHsType (text "unfolding coerce") ty       `thenRn` \ ty' ->
666     returnRn (UfCoerce ty')
667
668 rnNote (UfSCC cc)   = returnRn (UfSCC cc)
669 rnNote UfInlineCall = returnRn UfInlineCall
670 rnNote UfInlineMe   = returnRn UfInlineMe
671
672
673 rnUfCon UfDefault
674   = returnRn UfDefault
675
676 rnUfCon (UfTupleAlt (HsTupCon _ boxity arity))
677   = returnRn (UfTupleAlt (HsTupCon tup_name boxity arity))
678   where
679     tup_name = getName (tupleCon boxity arity)
680
681 rnUfCon (UfDataAlt con)
682   = lookupOccRn con             `thenRn` \ con' ->
683     returnRn (UfDataAlt con')
684
685 rnUfCon (UfLitAlt lit)
686   = returnRn (UfLitAlt lit)
687
688 rnUfCon (UfLitLitAlt lit ty)
689   = rnHsType (text "litlit") ty         `thenRn` \ ty' ->
690     returnRn (UfLitLitAlt lit ty')
691 \end{code}
692
693 %*********************************************************
694 %*                                                       *
695 \subsection{Rule shapes}
696 %*                                                       *
697 %*********************************************************
698
699 Check the shape of a transformation rule LHS.  Currently
700 we only allow LHSs of the form @(f e1 .. en)@, where @f@ is
701 not one of the @forall@'d variables.
702
703 \begin{code}
704 validRuleLhs foralls lhs
705   = check lhs
706   where
707     check (OpApp _ op _ _)                = check op
708     check (HsApp e1 e2)                   = check e1
709     check (HsVar v) | v `notElem` foralls = True
710     check other                           = False
711 \end{code}
712
713
714 %*********************************************************
715 %*                                                       *
716 \subsection{Errors}
717 %*                                                       *
718 %*********************************************************
719
720 \begin{code}
721 badDataCon name
722    = hsep [ptext SLIT("Illegal data constructor name"), quotes (ppr name)]
723
724 badRuleLhsErr name lhs
725   = sep [ptext SLIT("Rule") <+> ptext name <> colon,
726          nest 4 (ptext SLIT("Illegal left-hand side:") <+> ppr lhs)]
727     $$
728     ptext SLIT("LHS must be of form (f e1 .. en) where f is not forall'd")
729
730 badRuleVar name var
731   = sep [ptext SLIT("Rule") <+> doubleQuotes (ptext name) <> colon,
732          ptext SLIT("Forall'd variable") <+> quotes (ppr var) <+> 
733                 ptext SLIT("does not appear on left hand side")]
734
735 emptyConDeclsErr tycon
736   = sep [quotes (ppr tycon) <+> ptext SLIT("has no constructors"),
737          nest 4 (ptext SLIT("(-fglasgow-exts permits this)"))]
738 \end{code}