+rnSrcDecls :: HsGroup RdrName -> RnM (TcGblEnv, HsGroup Name)
+
+rnSrcDecls (HsGroup { hs_valds = [HsBindGroup binds sigs _],
+ hs_tyclds = tycl_decls,
+ hs_instds = inst_decls,
+ hs_fixds = fix_decls,
+ hs_depds = deprec_decls,
+ hs_fords = foreign_decls,
+ hs_defds = default_decls,
+ hs_ruleds = rule_decls })
+
+ = do { -- Deal with deprecations (returns only the extra deprecations)
+ deprecs <- rnSrcDeprecDecls deprec_decls ;
+ updGblEnv (\gbl -> gbl { tcg_deprecs = tcg_deprecs gbl `plusDeprecs` deprecs })
+ $ do {
+
+ -- Deal with top-level fixity decls
+ -- (returns the total new fixity env)
+ fix_env <- rnSrcFixityDecls fix_decls ;
+ updGblEnv (\gbl -> gbl { tcg_fix_env = fix_env })
+ $ do {
+
+ -- Rename other declarations
+ traceRn (text "Start rnmono") ;
+ (rn_val_decls, bind_dus) <- rnTopBinds binds sigs ;
+ traceRn (text "finish rnmono" <+> ppr rn_val_decls) ;
+
+ -- You might think that we could build proper def/use information
+ -- for type and class declarations, but they can be involved
+ -- in mutual recursion across modules, and we only do the SCC
+ -- analysis for them in the type checker.
+ -- So we content ourselves with gathering uses only; that
+ -- means we'll only report a declaration as unused if it isn't
+ -- mentioned at all. Ah well.
+ (rn_tycl_decls, src_fvs1)
+ <- mapFvRn (wrapLocFstM rnTyClDecl) tycl_decls ;
+ (rn_inst_decls, src_fvs2)
+ <- mapFvRn (wrapLocFstM rnSrcInstDecl) inst_decls ;
+ (rn_rule_decls, src_fvs3)
+ <- mapFvRn (wrapLocFstM rnHsRuleDecl) rule_decls ;
+ (rn_foreign_decls, src_fvs4)
+ <- mapFvRn (wrapLocFstM rnHsForeignDecl) foreign_decls ;
+ (rn_default_decls, src_fvs5)
+ <- mapFvRn (wrapLocFstM rnDefaultDecl) default_decls ;
+
+ let {
+ rn_group = HsGroup { hs_valds = rn_val_decls,
+ hs_tyclds = rn_tycl_decls,
+ hs_instds = rn_inst_decls,
+ hs_fixds = [],
+ hs_depds = [],
+ hs_fords = rn_foreign_decls,
+ hs_defds = rn_default_decls,
+ hs_ruleds = rn_rule_decls } ;
+
+ other_fvs = plusFVs [src_fvs1, src_fvs2, src_fvs3,
+ src_fvs4, src_fvs5] ;
+ src_dus = bind_dus `plusDU` usesOnly other_fvs
+ -- Note: src_dus will contain *uses* for locally-defined types
+ -- and classes, but no *defs* for them. (Because rnTyClDecl
+ -- returns only the uses.) This is a little
+ -- surprising but it doesn't actually matter at all.
+ } ;
+
+ traceRn (text "finish rnSrc" <+> ppr rn_group) ;
+ traceRn (text "finish Dus" <+> ppr src_dus ) ;
+ tcg_env <- getGblEnv ;
+ return (tcg_env `addTcgDUs` src_dus, rn_group)
+ }}}
+
+rnTyClDecls :: [LTyClDecl RdrName] -> RnM [LTyClDecl Name]
+rnTyClDecls tycl_decls = do
+ (decls', fvs) <- mapFvRn (wrapLocFstM rnTyClDecl) tycl_decls
+ return decls'
+
+addTcgDUs :: TcGblEnv -> DefUses -> TcGblEnv
+addTcgDUs tcg_env dus = tcg_env { tcg_dus = tcg_dus tcg_env `plusDU` dus }