import TyCon ( visibleDataCons, isSynTyCon, getSynTyConDefn, tyConClass_maybe, tyConName )
import Class ( className )
import Name ( Name {-instance NamedThing-}, nameOccName,
- nameModule, isLocalName, NamedThing(..)
+ nameModule, isInternalName, NamedThing(..)
)
import NameEnv ( elemNameEnv, delFromNameEnv, lookupNameEnv )
import NameSet
import FiniteMap
import Outputable
import Bag
-import Util ( sortLt )
+import Util ( sortLt, seqList )
\end{code}
maybe_export_vers | import_all_mod = Just (vers_exports version_info)
| otherwise = Nothing
in
- returnRn import_info
+
+ -- seq the list of ImportVersions returned: occasionally these
+ -- don't get evaluated for a while and we can end up hanging on to
+ -- the entire collection of Ifaces.
+ seqList import_info (returnRn import_info)
\end{code}
%*********************************************************
-------------------------------------------------------
-- closeDecls keeps going until the free-var set is empty
closeDecls decls needed
- | not (isEmptyFVs needed)
- = slurpDecls decls needed `thenRn` \ (decls1, needed1) ->
- closeDecls decls1 needed1
-
- | otherwise
- = getImportedRules `thenRn` \ rule_decls ->
+ = slurpIfaceDecls decls needed `thenRn` \ decls1 ->
+ getImportedRules `thenRn` \ rule_decls ->
case rule_decls of
- [] -> returnRn decls -- No new rules, so we are done
+ [] -> returnRn decls1 -- No new rules, so we are done
other -> rnIfaceDecls rnIfaceRuleDecl rule_decls `thenRn` \ rule_decls' ->
let
rule_fvs = plusFVs (map ruleDeclFVs rule_decls')
in
- traceRn (text "closeRules" <+> ppr rule_decls' $$ fsep (map ppr (nameSetToList rule_fvs))) `thenRn_`
- closeDecls (map RuleD rule_decls' ++ decls) rule_fvs
-
+ traceRn (text "closeRules" <+> ppr rule_decls' $$
+ fsep (map ppr (nameSetToList rule_fvs))) `thenRn_`
+ closeDecls (map RuleD rule_decls' ++ decls1) rule_fvs
-------------------------------------------------------
--- Augment decls with any decls needed by needed.
--- Return also free vars of the new decls (only)
-slurpDecls decls needed
- = go decls emptyFVs (nameSetToList needed)
+-- Augment decls with any decls needed by needed,
+-- and so on transitively
+slurpIfaceDecls :: [RenamedHsDecl] -> FreeVars -> RnMG [RenamedHsDecl]
+slurpIfaceDecls decls needed
+ = slurp decls (nameSetToList needed)
where
- go decls fvs [] = returnRn (decls, fvs)
- go decls fvs (ref:refs) = slurpDecl decls fvs ref `thenRn` \ (decls1, fvs1) ->
- go decls1 fvs1 refs
-
--------------------------------------------------------
-slurpDecl decls fvs wanted_name
- = importDecl wanted_name `thenRn` \ import_result ->
- case import_result of
- -- Found a declaration... rename it
- HereItIs decl -> rnIfaceTyClDecl decl `thenRn` \ (new_decl, fvs1) ->
- returnRn (TyClD new_decl:decls, fvs1 `plusFV` fvs)
-
- -- No declaration... (wired in thing, or deferred, or already slurped)
- other -> returnRn (decls, fvs)
+ slurp decls [] = returnRn decls
+ slurp decls (n:ns) = slurp_one decls n `thenRn` \ decls1 ->
+ slurp decls1 ns
+
+ slurp_one decls wanted_name
+ = importDecl wanted_name `thenRn` \ import_result ->
+ case import_result of
+ HereItIs decl -> -- Found a declaration... rename it
+ -- and get the things it needs
+ rnIfaceTyClDecl decl `thenRn` \ (new_decl, fvs) ->
+ slurp (TyClD new_decl : decls) (nameSetToList fvs)
+
+
+ other -> -- No declaration... (wired in thing, or deferred,
+ -- or already slurped)
+ returnRn decls
-------------------------------------------------------
iSlurp = slurped_names,
iVSlurp = vslurp })
avail
- = ASSERT2( not (isLocalName (availName avail)), ppr avail )
+ = ASSERT2( not (isInternalName (availName avail)), ppr avail )
ifaces { iDecls = (new_decls_map, n_slurped+1),
iSlurp = new_slurped_names,
iVSlurp = updateVSlurp vslurp (availName avail) }
get_gates is_used (ForeignType {tcdName = tycon}) = unitNameSet tycon
get_gates is_used (IfaceSig {tcdType = ty}) = extractHsTyNames ty
+get_gates is_used (CoreDecl {tcdType = ty}) = extractHsTyNames ty
get_gates is_used (ClassDecl { tcdCtxt = ctxt, tcdName = cls, tcdTyVars = tvs, tcdSigs = sigs})
= (super_cls_and_sigs `addOneToNameSet` cls) `unionNameSets`