- -- Build the environment
- qualifyImports mod
- True -- Want unqualified names
- Nothing -- no 'as M'
- [] -- Hide nothing
- avails
- (\n -> n)
-
- where
- newLocalName rdr_name loc = newLocallyDefinedGlobalName mod (rdrNameOcc rdr_name)
- rec_exp_fn loc
-
-getLocalDeclBinders :: (RdrName -> SrcLoc -> RnMG Name) -- New-name function
- -> RdrNameHsDecl
- -> RnMG Avails
-getLocalDeclBinders new_name (ValD binds)
- = mapRn do_one (bagToList (collectTopBinders binds))
+ -- Record that locally-defined things are available
+ recordLocalSlurps (availsToNameSet avails) `thenRn_`
+ let
+ mod_name = moduleName this_mod
+ unqual_imp = True -- Want unqualified names
+ mk_prov n = LocalDef -- Provenance is local
+ hides = [] -- Hide nothing
+
+ gbl_env = mkGlobalRdrEnv mod_name unqual_imp mk_prov avails hides NoDeprecs
+ -- NoDeprecs: don't complain about locally defined names
+ -- For a start, we may be exporting a deprecated thing
+ -- Also we may use a deprecated thing in the defn of another
+ -- deprecated things. We may even use a deprecated thing in
+ -- the defn of a non-deprecated thing, when changing a module's
+ -- interface
+
+ exports = mkExportAvails mod_name unqual_imp gbl_env avails
+ in
+ returnRn (gbl_env, exports)
+
+---------------------------
+getLocalDeclBinders :: Module -> RdrNameHsDecl -> RnMG [AvailInfo]
+getLocalDeclBinders mod (TyClD tycl_decl)
+ = -- For type and class decls, we generate Global names, with
+ -- no export indicator. They need to be global because they get
+ -- permanently bound into the TyCons and Classes. They don't need
+ -- an export indicator because they are all implicitly exported.
+ getTyClDeclBinders mod tycl_decl `thenRn` \ (avail, sys_names) ->
+
+ -- Record that the system names are available
+ recordLocalSlurps (mkNameSet sys_names) `thenRn_`
+ returnRn [avail]
+
+getLocalDeclBinders mod (ValD binds)
+ = mapRn new (collectLocatedHsBinders binds) `thenRn` \ avails ->
+ returnRn avails