+ -- Filter the imports according to the import list
+ filterImports imp_mod is_boot imp_spec avails `thenM` \ (filtered_avails, explicits) ->
+
+ let
+ -- Compute new transitive dependencies
+ orphans | is_orph = insert imp_mod_name (dep_orphs deps)
+ | otherwise = dep_orphs deps
+
+ (dependent_mods, dependent_pkgs)
+ | isHomeModule imp_mod
+ = -- Imported module is from the home package
+ -- Take its dependent modules and
+ -- (a) remove this_mod (might be there as a hi-boot)
+ -- (b) add imp_mod itself
+ -- Take its dependent packages unchanged
+ ((imp_mod_name, is_boot) : filter not_self (dep_mods deps), dep_pkgs deps)
+
+ | otherwise
+ = -- Imported module is from another package
+ -- Dump the dependent modules
+ -- Add the package imp_mod comes from to the dependent packages
+ -- from imp_mod
+ ([], insert (mi_package iface) (dep_pkgs deps))
+
+ not_self (m, _) = m /= this_mod_name
+
+ import_all = case imp_spec of
+ (Just (False, _)) -> False -- Imports are spec'd explicitly
+ other -> True -- Everything is imported,
+ -- (or almost everything [hiding])
+
+ qual_mod_name = case as_mod of
+ Nothing -> imp_mod_name
+ Just another_name -> another_name
+
+ -- unqual_avails is the Avails that are visible in *unqualified* form
+ -- We need to know this so we know what to export when we see
+ -- module M ( module P ) where ...
+ -- Then we must export whatever came from P unqualified.
+ avail_env = mkAvailEnv filtered_avails
+
+ mk_prov name = NonLocalDef (UserImport imp_mod iloc (name `elemNameSet` explicits))
+ gbl_env = mkGlobalRdrEnv qual_mod_name (not qual_only)
+ mk_prov filtered_avails deprecs
+ imports = ImportAvails {
+ imp_qual = unitModuleEnvByName qual_mod_name avail_env,
+ imp_env = avail_env,
+ imp_mods = unitModuleEnv imp_mod (imp_mod, import_all),
+ imp_orphs = orphans,
+ imp_dep_mods = mkModDeps dependent_mods,
+ imp_dep_pkgs = dependent_pkgs }
+
+ in