2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
4 \section[RnSource]{Main pass of renamer}
7 module RnSource ( rnTyClDecl, rnIfaceRuleDecl, rnInstDecl, rnSourceDecls,
10 #include "HsVersions.h"
14 import HscTypes ( GlobalRdrEnv )
15 import RdrName ( RdrName, isRdrDataCon, elemRdrEnv )
16 import RdrHsSyn ( RdrNameConDecl, RdrNameTyClDecl,
17 extractGenericPatTyVars
22 import RnTypes ( rnHsType, rnHsSigType, rnHsTypeFVs, rnContext )
24 import RnBinds ( rnTopBinds, rnMethodBinds, renameSigs, renameSigsFVs )
25 import RnEnv ( lookupTopBndrRn, lookupOccRn, lookupIfaceName,
26 lookupOrigNames, lookupSysBinder, newLocalsRn,
27 bindLocalsFVRn, bindPatSigTyVars,
28 bindTyVarsRn, bindTyVars2Rn,
30 bindCoreLocalRn, bindCoreLocalsRn, bindLocalNames,
31 checkDupOrQualNames, checkDupNames, mapFvRn
35 import Class ( FunDep, DefMeth (..) )
36 import DataCon ( dataConId )
37 import Name ( Name, NamedThing(..) )
39 import PrelInfo ( derivableClassKeys )
40 import PrelNames ( deRefStablePtr_RDR, newStablePtr_RDR,
41 bindIO_RDR, returnIO_RDR
43 import TysWiredIn ( tupleCon )
44 import List ( partition )
46 import SrcLoc ( SrcLoc )
47 import CmdLineOpts ( DynFlag(..) )
48 -- Warn of unused for-all'd tyvars
49 import Unique ( Uniquable(..) )
50 import Maybes ( maybeToBool )
53 @rnSourceDecl@ `renames' declarations.
54 It simultaneously performs dependency analysis and precedence parsing.
55 It also does the following error checks:
58 Checks that tyvars are used properly. This includes checking
59 for undefined tyvars, and tyvars in contexts that are ambiguous.
60 (Some of this checking has now been moved to module @TcMonoType@,
61 since we don't have functional dependency information at this point.)
63 Checks that all variable occurences are defined.
65 Checks the @(..)@ etc constraints in the export list.
69 %*********************************************************
71 \subsection{Source code declarations}
73 %*********************************************************
76 rnSourceDecls :: GlobalRdrEnv -> LocalFixityEnv
78 -> RnMG ([RenamedHsDecl], FreeVars)
79 -- The decls get reversed, but that's ok
81 rnSourceDecls gbl_env local_fixity_env decls
82 = initRnMS gbl_env emptyRdrEnv local_fixity_env SourceMode (go emptyFVs [] decls)
84 -- Fixity and deprecations have been dealt with already; ignore them
85 go fvs ds' [] = returnRn (ds', fvs)
86 go fvs ds' (FixD _:ds) = go fvs ds' ds
87 go fvs ds' (DeprecD _:ds) = go fvs ds' ds
88 go fvs ds' (d:ds) = rnSourceDecl d `thenRn` \(d', fvs') ->
89 go (fvs `plusFV` fvs') (d':ds') ds
92 rnSourceDecl :: RdrNameHsDecl -> RnMS (RenamedHsDecl, FreeVars)
94 rnSourceDecl (ValD binds) = rnTopBinds binds `thenRn` \ (new_binds, fvs) ->
95 returnRn (ValD new_binds, fvs)
97 rnSourceDecl (TyClD tycl_decl)
98 = rnTyClDecl tycl_decl `thenRn` \ new_decl ->
99 finishSourceTyClDecl tycl_decl new_decl `thenRn` \ (new_decl', fvs) ->
100 returnRn (TyClD new_decl', fvs `plusFV` tyClDeclFVs new_decl')
102 rnSourceDecl (InstD inst)
103 = rnInstDecl inst `thenRn` \ new_inst ->
104 finishSourceInstDecl inst new_inst `thenRn` \ (new_inst', fvs) ->
105 returnRn (InstD new_inst', fvs `plusFV` instDeclFVs new_inst')
107 rnSourceDecl (RuleD rule)
108 = rnHsRuleDecl rule `thenRn` \ (new_rule, fvs) ->
109 returnRn (RuleD new_rule, fvs)
111 rnSourceDecl (ForD ford)
112 = rnHsForeignDecl ford `thenRn` \ (new_ford, fvs) ->
113 returnRn (ForD new_ford, fvs)
115 rnSourceDecl (DefD (DefaultDecl tys src_loc))
116 = pushSrcLocRn src_loc $
117 mapFvRn (rnHsTypeFVs doc_str) tys `thenRn` \ (tys', fvs) ->
118 returnRn (DefD (DefaultDecl tys' src_loc), fvs)
120 doc_str = text "In a `default' declaration"
124 %*********************************************************
126 \subsection{Foreign declarations}
128 %*********************************************************
131 rnHsForeignDecl (ForeignImport name ty spec src_loc)
132 = pushSrcLocRn src_loc $
133 lookupTopBndrRn name `thenRn` \ name' ->
134 rnHsTypeFVs (fo_decl_msg name) ty `thenRn` \ (ty', fvs1) ->
135 lookupOrigNames (extras spec) `thenRn` \ fvs2 ->
136 returnRn (ForeignImport name' ty' spec src_loc, fvs1 `plusFV` fvs2)
138 extras (CDynImport _) = [newStablePtr_RDR, deRefStablePtr_RDR, bindIO_RDR, returnIO_RDR]
141 rnHsForeignDecl (ForeignExport name ty spec src_loc)
142 = pushSrcLocRn src_loc $
143 lookupOccRn name `thenRn` \ name' ->
144 rnHsTypeFVs (fo_decl_msg name) ty `thenRn` \ (ty', fvs1) ->
145 lookupOrigNames [bindIO_RDR, returnIO_RDR] `thenRn` \ fvs2 ->
146 returnRn (ForeignExport name' ty' spec src_loc, fvs1 `plusFV` fvs2)
148 fo_decl_msg name = ptext SLIT("The foreign declaration for") <+> ppr name
152 %*********************************************************
154 \subsection{Instance declarations}
156 %*********************************************************
159 rnInstDecl (InstDecl inst_ty mbinds uprags maybe_dfun_rdr_name src_loc)
160 -- Used for both source and interface file decls
161 = pushSrcLocRn src_loc $
162 rnHsSigType (text "an instance decl") inst_ty `thenRn` \ inst_ty' ->
164 (case maybe_dfun_rdr_name of
165 Nothing -> returnRn Nothing
166 Just dfun_rdr_name -> lookupIfaceName dfun_rdr_name `thenRn` \ dfun_name ->
167 returnRn (Just dfun_name)
168 ) `thenRn` \ maybe_dfun_name ->
170 -- The typechecker checks that all the bindings are for the right class.
171 returnRn (InstDecl inst_ty' EmptyMonoBinds [] maybe_dfun_name src_loc)
173 -- Compare finishSourceTyClDecl
174 finishSourceInstDecl (InstDecl _ mbinds uprags _ _ )
175 (InstDecl inst_ty _ _ maybe_dfun_name src_loc)
176 -- Used for both source decls only
177 = ASSERT( not (maybeToBool maybe_dfun_name) ) -- Source decl!
179 meth_doc = text "In the bindings in an instance declaration"
180 meth_names = collectLocatedMonoBinders mbinds
181 inst_tyvars = case inst_ty of
182 HsForAllTy (Just inst_tyvars) _ _ -> inst_tyvars
184 -- (Slightly strangely) the forall-d tyvars scope over
185 -- the method bindings too
188 -- Rename the bindings
189 -- NB meth_names can be qualified!
190 checkDupNames meth_doc meth_names `thenRn_`
191 extendTyVarEnvFVRn (map hsTyVarName inst_tyvars) (
192 rnMethodBinds [] mbinds
193 ) `thenRn` \ (mbinds', meth_fvs) ->
195 binders = collectMonoBinders mbinds'
196 binder_set = mkNameSet binders
198 -- Rename the prags and signatures.
199 -- Note that the type variables are not in scope here,
200 -- so that instance Eq a => Eq (T a) where
201 -- {-# SPECIALISE instance Eq a => Eq (T [a]) #-}
204 -- But the (unqualified) method names are in scope
205 bindLocalNames binders (
206 renameSigsFVs (okInstDclSig binder_set) uprags
207 ) `thenRn` \ (uprags', prag_fvs) ->
209 returnRn (InstDecl inst_ty mbinds' uprags' maybe_dfun_name src_loc,
210 meth_fvs `plusFV` prag_fvs)
213 %*********************************************************
217 %*********************************************************
220 rnIfaceRuleDecl (IfaceRule rule_name act vars fn args rhs src_loc)
221 = pushSrcLocRn src_loc $
222 lookupOccRn fn `thenRn` \ fn' ->
223 rnCoreBndrs vars $ \ vars' ->
224 mapRn rnCoreExpr args `thenRn` \ args' ->
225 rnCoreExpr rhs `thenRn` \ rhs' ->
226 returnRn (IfaceRule rule_name act vars' fn' args' rhs' src_loc)
228 rnIfaceRuleDecl (IfaceRuleOut fn rule) -- Builtin rules come this way
229 = lookupOccRn fn `thenRn` \ fn' ->
230 returnRn (IfaceRuleOut fn' rule)
232 rnHsRuleDecl (HsRule rule_name act vars lhs rhs src_loc)
233 = pushSrcLocRn src_loc $
234 bindPatSigTyVars (collectRuleBndrSigTys vars) $
236 bindLocalsFVRn doc (map get_var vars) $ \ ids ->
237 mapFvRn rn_var (vars `zip` ids) `thenRn` \ (vars', fv_vars) ->
239 rnExpr lhs `thenRn` \ (lhs', fv_lhs) ->
240 rnExpr rhs `thenRn` \ (rhs', fv_rhs) ->
241 checkRn (validRuleLhs ids lhs')
242 (badRuleLhsErr rule_name lhs') `thenRn_`
244 bad_vars = [var | var <- ids, not (var `elemNameSet` fv_lhs)]
246 mapRn (addErrRn . badRuleVar rule_name) bad_vars `thenRn_`
247 returnRn (HsRule rule_name act vars' lhs' rhs' src_loc,
248 fv_vars `plusFV` fv_lhs `plusFV` fv_rhs)
250 doc = text "In the transformation rule" <+> ptext rule_name
252 get_var (RuleBndr v) = v
253 get_var (RuleBndrSig v _) = v
255 rn_var (RuleBndr v, id) = returnRn (RuleBndr id, emptyFVs)
256 rn_var (RuleBndrSig v t, id) = rnHsTypeFVs doc t `thenRn` \ (t', fvs) ->
257 returnRn (RuleBndrSig id t', fvs)
261 %*********************************************************
263 \subsection{Type, class and iface sig declarations}
265 %*********************************************************
267 @rnTyDecl@ uses the `global name function' to create a new type
268 declaration in which local names have been replaced by their original
269 names, reporting any unknown names.
271 Renaming type variables is a pain. Because they now contain uniques,
272 it is necessary to pass in an association list which maps a parsed
273 tyvar to its @Name@ representation.
274 In some cases (type signatures of values),
275 it is even necessary to go over the type first
276 in order to get the set of tyvars used by it, make an assoc list,
277 and then go over it again to rename the tyvars!
278 However, we can also do some scoping checks at the same time.
281 rnTyClDecl (IfaceSig {tcdName = name, tcdType = ty, tcdIdInfo = id_infos, tcdLoc = loc})
283 lookupTopBndrRn name `thenRn` \ name' ->
284 rnHsType doc_str ty `thenRn` \ ty' ->
285 mapRn rnIdInfo id_infos `thenRn` \ id_infos' ->
286 returnRn (IfaceSig {tcdName = name', tcdType = ty', tcdIdInfo = id_infos', tcdLoc = loc})
288 doc_str = text "In the interface signature for" <+> quotes (ppr name)
290 rnTyClDecl (ForeignType {tcdName = name, tcdFoType = fo_type, tcdExtName = ext_name, tcdLoc = loc})
292 lookupTopBndrRn name `thenRn` \ name' ->
293 returnRn (ForeignType {tcdName = name', tcdFoType = fo_type, tcdExtName = ext_name, tcdLoc = loc})
295 rnTyClDecl (TyData {tcdND = new_or_data, tcdCtxt = context, tcdName = tycon,
296 tcdTyVars = tyvars, tcdCons = condecls, tcdNCons = nconstrs,
297 tcdLoc = src_loc, tcdSysNames = sys_names})
298 = pushSrcLocRn src_loc $
299 lookupTopBndrRn tycon `thenRn` \ tycon' ->
300 bindTyVarsRn data_doc tyvars $ \ tyvars' ->
301 rnContext data_doc context `thenRn` \ context' ->
302 checkDupOrQualNames data_doc con_names `thenRn_`
304 -- Check that there's at least one condecl,
305 -- or else we're reading an interface file, or -fglasgow-exts
306 (if null condecls then
307 doptRn Opt_GlasgowExts `thenRn` \ glaExts ->
308 getModeRn `thenRn` \ mode ->
309 checkRn (glaExts || isInterfaceMode mode)
310 (emptyConDeclsErr tycon)
314 mapRn rnConDecl condecls `thenRn` \ condecls' ->
315 mapRn lookupSysBinder sys_names `thenRn` \ sys_names' ->
316 returnRn (TyData {tcdND = new_or_data, tcdCtxt = context', tcdName = tycon',
317 tcdTyVars = tyvars', tcdCons = condecls', tcdNCons = nconstrs,
318 tcdDerivs = Nothing, tcdLoc = src_loc, tcdSysNames = sys_names'})
320 data_doc = text "In the data type declaration for" <+> quotes (ppr tycon)
321 con_names = map conDeclName condecls
323 rnTyClDecl (TySynonym {tcdName = name, tcdTyVars = tyvars, tcdSynRhs = ty, tcdLoc = src_loc})
324 = pushSrcLocRn src_loc $
325 lookupTopBndrRn name `thenRn` \ name' ->
326 bindTyVarsRn syn_doc tyvars $ \ tyvars' ->
327 rnHsType syn_doc ty `thenRn` \ ty' ->
328 returnRn (TySynonym {tcdName = name', tcdTyVars = tyvars', tcdSynRhs = ty', tcdLoc = src_loc})
330 syn_doc = text "In the declaration for type synonym" <+> quotes (ppr name)
332 rnTyClDecl (ClassDecl {tcdCtxt = context, tcdName = cname,
333 tcdTyVars = tyvars, tcdFDs = fds, tcdSigs = sigs,
334 tcdSysNames = names, tcdLoc = src_loc})
335 -- Used for both source and interface file decls
336 = pushSrcLocRn src_loc $
338 lookupTopBndrRn cname `thenRn` \ cname' ->
340 -- Deal with the implicit tycon and datacon name
341 -- They aren't in scope (because they aren't visible to the user)
342 -- and what we want to do is simply look them up in the cache;
343 -- we jolly well ought to get a 'hit' there!
344 mapRn lookupSysBinder names `thenRn` \ names' ->
346 -- Tyvars scope over bindings and context
347 bindTyVars2Rn cls_doc tyvars $ \ clas_tyvar_names tyvars' ->
349 -- Check the superclasses
350 rnContext cls_doc context `thenRn` \ context' ->
352 -- Check the functional dependencies
353 rnFds cls_doc fds `thenRn` \ fds' ->
355 -- Check the signatures
356 -- First process the class op sigs (op_sigs), then the fixity sigs (non_op_sigs).
358 (op_sigs, non_op_sigs) = partition isClassOpSig sigs
359 sig_rdr_names_w_locs = [(op,locn) | ClassOpSig op _ _ locn <- sigs]
361 checkDupOrQualNames sig_doc sig_rdr_names_w_locs `thenRn_`
362 mapRn (rnClassOp cname' clas_tyvar_names fds') op_sigs `thenRn` \ sigs' ->
364 binders = mkNameSet [ nm | (ClassOpSig nm _ _ _) <- sigs' ]
366 renameSigs (okClsDclSig binders) non_op_sigs `thenRn` \ non_ops' ->
368 -- Typechecker is responsible for checking that we only
369 -- give default-method bindings for things in this class.
370 -- The renamer *could* check this for class decls, but can't
371 -- for instance decls.
373 returnRn (ClassDecl { tcdCtxt = context', tcdName = cname', tcdTyVars = tyvars',
374 tcdFDs = fds', tcdSigs = non_ops' ++ sigs', tcdMeths = Nothing,
375 tcdSysNames = names', tcdLoc = src_loc})
377 cls_doc = text "In the declaration for class" <+> ppr cname
378 sig_doc = text "In the signatures for class" <+> ppr cname
380 rnClassOp clas clas_tyvars clas_fds sig@(ClassOpSig op dm_stuff ty locn)
381 = pushSrcLocRn locn $
382 lookupTopBndrRn op `thenRn` \ op_name ->
384 -- Check the signature
385 rnHsSigType (quotes (ppr op)) ty `thenRn` \ new_ty ->
387 -- Make the default-method name
390 -> -- Imported class that has a default method decl
391 -- See comments with tname, snames, above
392 lookupSysBinder dm_rdr_name `thenRn` \ dm_name ->
393 returnRn (DefMeth dm_name)
394 -- An imported class decl for a class decl that had an explicit default
395 -- method, mentions, rather than defines,
396 -- the default method, so we must arrange to pull it in
398 GenDefMeth -> returnRn GenDefMeth
399 NoDefMeth -> returnRn NoDefMeth
400 ) `thenRn` \ dm_stuff' ->
402 returnRn (ClassOpSig op_name dm_stuff' new_ty locn)
404 finishSourceTyClDecl :: RdrNameTyClDecl -> RenamedTyClDecl -> RnMS (RenamedTyClDecl, FreeVars)
405 -- Used for source file decls only
406 -- Renames the default-bindings of a class decl
407 -- the derivings of a data decl
408 finishSourceTyClDecl (TyData {tcdDerivs = Just derivs, tcdLoc = src_loc}) -- Derivings in here
409 rn_ty_decl -- Everything else is here
410 = pushSrcLocRn src_loc $
411 mapRn rnDeriv derivs `thenRn` \ derivs' ->
412 returnRn (rn_ty_decl {tcdDerivs = Just derivs'}, mkNameSet derivs')
414 finishSourceTyClDecl (ClassDecl {tcdMeths = Just mbinds, tcdLoc = src_loc}) -- Get mbinds from here
415 rn_cls_decl@(ClassDecl {tcdTyVars = tyvars}) -- Everything else is here
416 -- There are some default-method bindings (abeit possibly empty) so
417 -- this is a source-code class declaration
418 = -- The newLocals call is tiresome: given a generic class decl
421 -- op {| x+y |} (Inl a) = ...
422 -- op {| x+y |} (Inr b) = ...
423 -- op {| a*b |} (a*b) = ...
424 -- we want to name both "x" tyvars with the same unique, so that they are
425 -- easy to group together in the typechecker.
427 pushSrcLocRn src_loc $
428 extendTyVarEnvFVRn (map hsTyVarName tyvars) $
429 getLocalNameEnv `thenRn` \ name_env ->
431 meth_rdr_names_w_locs = collectLocatedMonoBinders mbinds
432 gen_rdr_tyvars_w_locs = [(tv,src_loc) | tv <- extractGenericPatTyVars mbinds,
433 not (tv `elemRdrEnv` name_env)]
435 checkDupOrQualNames meth_doc meth_rdr_names_w_locs `thenRn_`
436 newLocalsRn gen_rdr_tyvars_w_locs `thenRn` \ gen_tyvars ->
437 rnMethodBinds gen_tyvars mbinds `thenRn` \ (mbinds', meth_fvs) ->
438 returnRn (rn_cls_decl {tcdMeths = Just mbinds'}, meth_fvs)
440 meth_doc = text "In the default-methods for class" <+> ppr (tcdName rn_cls_decl)
442 finishSourceTyClDecl _ tycl_decl = returnRn (tycl_decl, emptyFVs)
443 -- Not a class or data type declaration
447 %*********************************************************
449 \subsection{Support code for type/data declarations}
451 %*********************************************************
454 rnDeriv :: RdrName -> RnMS Name
456 = lookupOccRn cls `thenRn` \ clas_name ->
457 checkRn (getUnique clas_name `elem` derivableClassKeys)
458 (derivingNonStdClassErr clas_name) `thenRn_`
463 conDeclName :: RdrNameConDecl -> (RdrName, SrcLoc)
464 conDeclName (ConDecl n _ _ _ _ l) = (n,l)
466 rnConDecl :: RdrNameConDecl -> RnMS RenamedConDecl
467 rnConDecl (ConDecl name wkr tvs cxt details locn)
468 = pushSrcLocRn locn $
469 checkConName name `thenRn_`
470 lookupTopBndrRn name `thenRn` \ new_name ->
472 lookupSysBinder wkr `thenRn` \ new_wkr ->
473 -- See comments with ClassDecl
475 bindTyVarsRn doc tvs $ \ new_tyvars ->
476 rnContext doc cxt `thenRn` \ new_context ->
477 rnConDetails doc locn details `thenRn` \ new_details ->
478 returnRn (ConDecl new_name new_wkr new_tyvars new_context new_details locn)
480 doc = text "In the definition of data constructor" <+> quotes (ppr name)
482 rnConDetails doc locn (VanillaCon tys)
483 = mapRn (rnBangTy doc) tys `thenRn` \ new_tys ->
484 returnRn (VanillaCon new_tys)
486 rnConDetails doc locn (InfixCon ty1 ty2)
487 = rnBangTy doc ty1 `thenRn` \ new_ty1 ->
488 rnBangTy doc ty2 `thenRn` \ new_ty2 ->
489 returnRn (InfixCon new_ty1 new_ty2)
491 rnConDetails doc locn (RecCon fields)
492 = checkDupOrQualNames doc field_names `thenRn_`
493 mapRn (rnField doc) fields `thenRn` \ new_fields ->
494 returnRn (RecCon new_fields)
496 field_names = [(fld, locn) | (flds, _) <- fields, fld <- flds]
498 rnField doc (names, ty)
499 = mapRn lookupTopBndrRn names `thenRn` \ new_names ->
500 rnBangTy doc ty `thenRn` \ new_ty ->
501 returnRn (new_names, new_ty)
503 rnBangTy doc (BangType s ty)
504 = rnHsType doc ty `thenRn` \ new_ty ->
505 returnRn (BangType s new_ty)
507 -- This data decl will parse OK
509 -- treating "a" as the constructor.
510 -- It is really hard to make the parser spot this malformation.
511 -- So the renamer has to check that the constructor is legal
513 -- We can get an operator as the constructor, even in the prefix form:
514 -- data T = :% Int Int
515 -- from interface files, which always print in prefix form
518 = checkRn (isRdrDataCon name)
523 %*********************************************************
525 \subsection{Support code to rename types}
527 %*********************************************************
530 rnFds :: SDoc -> [FunDep RdrName] -> RnMS [FunDep Name]
536 = rnHsTyVars doc tys1 `thenRn` \ tys1' ->
537 rnHsTyVars doc tys2 `thenRn` \ tys2' ->
538 returnRn (tys1', tys2')
540 rnHsTyVars doc tvs = mapRn (rnHsTyvar doc) tvs
541 rnHsTyvar doc tyvar = lookupOccRn tyvar
544 %*********************************************************
548 %*********************************************************
551 rnIdInfo (HsWorker worker arity)
552 = lookupOccRn worker `thenRn` \ worker' ->
553 returnRn (HsWorker worker' arity)
555 rnIdInfo (HsUnfold inline expr) = rnCoreExpr expr `thenRn` \ expr' ->
556 returnRn (HsUnfold inline expr')
557 rnIdInfo (HsStrictness str) = returnRn (HsStrictness str)
558 rnIdInfo (HsArity arity) = returnRn (HsArity arity)
559 rnIdInfo HsNoCafRefs = returnRn HsNoCafRefs
562 @UfCore@ expressions.
565 rnCoreExpr (UfType ty)
566 = rnHsType (text "unfolding type") ty `thenRn` \ ty' ->
567 returnRn (UfType ty')
570 = lookupOccRn v `thenRn` \ v' ->
576 rnCoreExpr (UfLitLit l ty)
577 = rnHsType (text "litlit") ty `thenRn` \ ty' ->
578 returnRn (UfLitLit l ty')
580 rnCoreExpr (UfFCall cc ty)
581 = rnHsType (text "ccall") ty `thenRn` \ ty' ->
582 returnRn (UfFCall cc ty')
584 rnCoreExpr (UfTuple (HsTupCon _ boxity arity) args)
585 = mapRn rnCoreExpr args `thenRn` \ args' ->
586 returnRn (UfTuple (HsTupCon tup_name boxity arity) args')
588 tup_name = getName (dataConId (tupleCon boxity arity))
589 -- Get the *worker* name and use that
591 rnCoreExpr (UfApp fun arg)
592 = rnCoreExpr fun `thenRn` \ fun' ->
593 rnCoreExpr arg `thenRn` \ arg' ->
594 returnRn (UfApp fun' arg')
596 rnCoreExpr (UfCase scrut bndr alts)
597 = rnCoreExpr scrut `thenRn` \ scrut' ->
598 bindCoreLocalRn bndr $ \ bndr' ->
599 mapRn rnCoreAlt alts `thenRn` \ alts' ->
600 returnRn (UfCase scrut' bndr' alts')
602 rnCoreExpr (UfNote note expr)
603 = rnNote note `thenRn` \ note' ->
604 rnCoreExpr expr `thenRn` \ expr' ->
605 returnRn (UfNote note' expr')
607 rnCoreExpr (UfLam bndr body)
608 = rnCoreBndr bndr $ \ bndr' ->
609 rnCoreExpr body `thenRn` \ body' ->
610 returnRn (UfLam bndr' body')
612 rnCoreExpr (UfLet (UfNonRec bndr rhs) body)
613 = rnCoreExpr rhs `thenRn` \ rhs' ->
614 rnCoreBndr bndr $ \ bndr' ->
615 rnCoreExpr body `thenRn` \ body' ->
616 returnRn (UfLet (UfNonRec bndr' rhs') body')
618 rnCoreExpr (UfLet (UfRec pairs) body)
619 = rnCoreBndrs bndrs $ \ bndrs' ->
620 mapRn rnCoreExpr rhss `thenRn` \ rhss' ->
621 rnCoreExpr body `thenRn` \ body' ->
622 returnRn (UfLet (UfRec (bndrs' `zip` rhss')) body')
624 (bndrs, rhss) = unzip pairs
628 rnCoreBndr (UfValBinder name ty) thing_inside
629 = rnHsType doc ty `thenRn` \ ty' ->
630 bindCoreLocalRn name $ \ name' ->
631 thing_inside (UfValBinder name' ty')
633 doc = text "unfolding id"
635 rnCoreBndr (UfTyBinder name kind) thing_inside
636 = bindCoreLocalRn name $ \ name' ->
637 thing_inside (UfTyBinder name' kind)
639 rnCoreBndrs [] thing_inside = thing_inside []
640 rnCoreBndrs (b:bs) thing_inside = rnCoreBndr b $ \ name' ->
641 rnCoreBndrs bs $ \ names' ->
642 thing_inside (name':names')
646 rnCoreAlt (con, bndrs, rhs)
647 = rnUfCon con `thenRn` \ con' ->
648 bindCoreLocalsRn bndrs $ \ bndrs' ->
649 rnCoreExpr rhs `thenRn` \ rhs' ->
650 returnRn (con', bndrs', rhs')
653 = rnHsType (text "unfolding coerce") ty `thenRn` \ ty' ->
654 returnRn (UfCoerce ty')
656 rnNote (UfSCC cc) = returnRn (UfSCC cc)
657 rnNote UfInlineCall = returnRn UfInlineCall
658 rnNote UfInlineMe = returnRn UfInlineMe
664 rnUfCon (UfTupleAlt (HsTupCon _ boxity arity))
665 = returnRn (UfTupleAlt (HsTupCon tup_name boxity arity))
667 tup_name = getName (tupleCon boxity arity)
669 rnUfCon (UfDataAlt con)
670 = lookupOccRn con `thenRn` \ con' ->
671 returnRn (UfDataAlt con')
673 rnUfCon (UfLitAlt lit)
674 = returnRn (UfLitAlt lit)
676 rnUfCon (UfLitLitAlt lit ty)
677 = rnHsType (text "litlit") ty `thenRn` \ ty' ->
678 returnRn (UfLitLitAlt lit ty')
681 %*********************************************************
683 \subsection{Rule shapes}
685 %*********************************************************
687 Check the shape of a transformation rule LHS. Currently
688 we only allow LHSs of the form @(f e1 .. en)@, where @f@ is
689 not one of the @forall@'d variables.
692 validRuleLhs foralls lhs
695 check (OpApp _ op _ _) = check op
696 check (HsApp e1 e2) = check e1
697 check (HsVar v) | v `notElem` foralls = True
702 %*********************************************************
706 %*********************************************************
709 derivingNonStdClassErr clas
710 = hsep [ptext SLIT("non-standard class"), ppr clas, ptext SLIT("in deriving clause")]
713 = hsep [ptext SLIT("Illegal data constructor name"), quotes (ppr name)]
714 badRuleLhsErr name lhs
715 = sep [ptext SLIT("Rule") <+> ptext name <> colon,
716 nest 4 (ptext SLIT("Illegal left-hand side:") <+> ppr lhs)]
718 ptext SLIT("LHS must be of form (f e1 .. en) where f is not forall'd")
721 = sep [ptext SLIT("Rule") <+> doubleQuotes (ptext name) <> colon,
722 ptext SLIT("Forall'd variable") <+> quotes (ppr var) <+>
723 ptext SLIT("does not appear on left hand side")]
725 emptyConDeclsErr tycon
726 = sep [quotes (ppr tycon) <+> ptext SLIT("has no constructors"),
727 nest 4 (ptext SLIT("(-fglasgow-exts permits this)"))]