+mkModDetails :: TypeEnv -> [DFunId] -- From typechecker
+ -> [CoreBind] -> [Id] -- Final bindings, plus the top-level Ids from the
+ -- code generator; they have authoritative arity info
+ -> [IdCoreRule] -- Tidy orphan rules
+ -> ModDetails
+mkModDetails type_env dfun_ids tidy_binds stg_ids orphan_rules
+ = ModDetails { md_types = new_type_env,
+ md_rules = rule_dcls,
+ md_insts = dfun_ids }
+ where
+ -- The competed type environment is gotten from
+ -- a) keeping the types and classes
+ -- b) removing all Ids, and Ids with correct IdInfo
+ -- gotten from the bindings
+ new_type_env = mkNameEnv [(getName tycl, tycl) | tycl <- orig_type_env, isTyClThing tycl]
+ `plusNameEnv`
+ mkNameEnv [(idName id, AnId id) | id <- final_ids]
+
+ orig_type_env = nameEnvElts type_env
+
+ final_ids = bindsToIds (mkVarSet dfun_ids `unionVarSet` orphan_rule_ids)
+ (mkVarSet stg_ids)
+ tidy_binds
+
+ -- The complete rules are gotten by combining
+ -- a) the orphan rules
+ -- b) rules embedded in the top-level Ids
+ rule_dcls | opt_OmitInterfacePragmas = []
+ | otherwise = getRules orphan_rules tidy_binds (mkVarSet final_ids)
+
+ orphan_rule_ids = unionVarSets [ ruleSomeFreeVars interestingId rule
+ | (_, rule) <- orphan_rules]
+
+
+-- This version is used when we are re-linking a module
+-- so we've only run the type checker on its previous interface
+mkModDetailsFromIface :: TypeEnv -> [DFunId] -- From typechecker
+ -> [TypecheckedRuleDecl]
+ -> ModDetails
+mkModDetailsFromIface type_env dfun_ids rules
+ = ModDetails { md_types = type_env,
+ md_rules = rule_dcls,
+ md_insts = dfun_ids }
+ where
+ rule_dcls = [(id,rule) | IfaceRuleOut id rule <- rules]
+ -- All the rules from an interface are of the IfaceRuleOut form
+
+
+completeIface :: Maybe ModIface -- The old interface, if we have it
+ -> ModIface -- The new one, minus the decls and versions
+ -> ModDetails -- The ModDetails for this module
+ -> Maybe (ModIface, SDoc) -- The new one, complete with decls and versions
+ -- The SDoc is a debug document giving differences
+ -- Nothing => no change
+
+ -- NB: 'Nothing' means that even the usages havn't changed, so there's no
+ -- need to write a new interface file. But even if the usages have
+ -- changed, the module version may not have.
+ --
+ -- The IO in the type is solely for debug output
+ -- In particular, dumping a record of what has changed
+completeIface maybe_old_iface new_iface mod_details
+ = addVersionInfo maybe_old_iface (new_iface { mi_decls = new_decls })
+ where
+ new_decls = IfaceDecls { dcl_tycl = ty_cls_dcls,
+ dcl_insts = inst_dcls,
+ dcl_rules = rule_dcls }