GHC.Unit.Module.Deps

ghc-lib-parser-9.10.1.20250103: The GHC API, decoupled from GHC versions

Safe Haskell | Ignore
Language | GHC2021

GHC.Unit.Module.Deps

Description

Dependencies and Usage of a module

Synopsis

- data Dependencies
- mkDependencies :: HomeUnit -> Module -> ImportAvails -> [Module] -> Dependencies
- noDependencies :: Dependencies
- dep_direct_mods :: Dependencies -> Set (UnitId, ModuleNameWithIsBoot)
- dep_direct_pkgs :: Dependencies -> Set UnitId
- dep_sig_mods :: Dependencies -> [ModuleName]
- dep_trusted_pkgs :: Dependencies -> Set UnitId
- dep_orphs :: Dependencies -> [Module]
- dep_plugin_pkgs :: Dependencies -> Set UnitId
- dep_finsts :: Dependencies -> [Module]
- dep_boot_mods :: Dependencies -> Set (UnitId, ModuleNameWithIsBoot)
- dep_orphs_update :: Monad m => Dependencies -> ([Module] -> m [Module]) -> m Dependencies
- dep_finsts_update :: Monad m => Dependencies -> ([Module] -> m [Module]) -> m Dependencies
- pprDeps :: UnitState -> Dependencies -> SDoc
- data Usage
  - = UsagePackageModule {
    - usg_mod :: Module
    - usg_mod_hash :: Fingerprint
    - usg_safe :: IsSafeImport
    }
  - | UsageHomeModule {
    - usg_mod_name :: ModuleName
    - usg_unit_id :: UnitId
    - usg_mod_hash :: Fingerprint
    - usg_entities :: [(OccName, Fingerprint)]
    - usg_exports :: Maybe Fingerprint
    - usg_safe :: IsSafeImport
    }
  - | UsageFile {
    - usg_file_path :: FastString
    - usg_file_hash :: Fingerprint
    - usg_file_label :: Maybe String
    }
  - | UsageHomeModuleInterface {
    - usg_mod_name :: ModuleName
    - usg_unit_id :: UnitId
    - usg_iface_hash :: Fingerprint
    }
  - | UsageMergedRequirement {
    - usg_mod :: Module
    - usg_mod_hash :: Fingerprint
    }
- data ImportAvails = ImportAvails {
  - imp_mods :: ImportedMods
  - imp_direct_dep_mods :: InstalledModuleEnv ModuleNameWithIsBoot
  - imp_dep_direct_pkgs :: Set UnitId
  - imp_trust_own_pkg :: Bool
  - imp_trust_pkgs :: Set UnitId
  - imp_boot_mods :: InstalledModuleEnv ModuleNameWithIsBoot
  - imp_sig_mods :: [ModuleName]
  - imp_orphs :: [Module]
  - imp_finsts :: [Module]
  }

# Documentation

data Dependencies #

Dependency information about ALL modules and packages below this one in the import hierarchy. This is the serialisable version of `ImportAvails`.

Invariant: the dependencies of a module `M` never includes `M`.

Invariant: none of the lists contain duplicates.

Invariant: lists are ordered canonically (e.g. using stableModuleCmp)

See Note [Transitive Information in Dependencies]

#### Instances

Instances details

Binary Dependencies # |
Instance details Defined in GHC.Unit.Module.Deps Methods put_ :: BinHandle -> Dependencies -> IO () # put :: BinHandle -> Dependencies -> IO (Bin Dependencies) # get :: BinHandle -> IO Dependencies #
Eq Dependencies # |
Instance details Defined in GHC.Unit.Module.Deps Methods (==) :: Dependencies -> Dependencies -> Bool # (/=) :: Dependencies -> Dependencies -> Bool #

mkDependencies :: HomeUnit -> Module -> ImportAvails -> [Module] -> Dependencies #

Extract information from the rename and typecheck phases to produce a dependencies information for the module being compiled.

The fourth argument is a list of plugin modules.

noDependencies :: Dependencies #

dep_direct_mods :: Dependencies -> Set (UnitId, ModuleNameWithIsBoot) #

All home-package modules which are directly imported by this one. This may include modules from other units when using multiple home units

dep_direct_pkgs :: Dependencies -> Set UnitId #

All packages directly imported by this module I.e. packages to which this module's direct imports belong. Does not include other home units when using multiple home units. Modules from these units will go in `dep_direct_mods`

dep_sig_mods :: Dependencies -> [ModuleName] #

Transitive closure of hsig files in the home package

dep_trusted_pkgs :: Dependencies -> Set UnitId #

dep_orphs :: Dependencies -> [Module] #

Transitive closure of orphan modules (whether home or external pkg).

(Possible optimization: don't include family instance orphans as they are anyway included in `dep_finsts`. But then be careful about code which relies on dep_orphs having the complete list!) This does NOT include us, unlike `imp_orphs`.

dep_plugin_pkgs :: Dependencies -> Set UnitId #

All units needed for plugins

dep_finsts :: Dependencies -> [Module] #

Transitive closure of depended upon modules which contain family instances (whether home or external). This is used by `checkFamInstConsistency`. This does NOT include us, unlike `imp_finsts`. See Note [The type family instance consistency story].

dep_boot_mods :: Dependencies -> Set (UnitId, ModuleNameWithIsBoot) #

All modules which have boot files below this one, and whether we should use the boot file or not. This information is only used to populate the eps_is_boot field. See Note [Structure of dep_boot_mods]

dep_orphs_update :: Monad m => Dependencies -> ([Module] -> m [Module]) -> m Dependencies #

Update module dependencies containing orphans (used by Backpack)

dep_finsts_update :: Monad m => Dependencies -> ([Module] -> m [Module]) -> m Dependencies #

Update module dependencies containing family instances (used by Backpack)

pprDeps :: UnitState -> Dependencies -> SDoc #

Pretty-print unit dependencies

data Usage #

Records modules for which changes may force recompilation of this module See wiki: https://gitlab.haskell.org/ghc/ghc/wikis/commentary/compiler/recompilation-avoidance

This differs from Dependencies. A module X may be in the dep_mods of this module (via an import chain) but if we don't use anything from X it won't appear in our Usage

Constructors

UsagePackageModule | Module from another package
Fields usg_mod :: Module External package module depended on usg_mod_hash :: Fingerprint Cached module ABI fingerprint (corresponds to mi_mod_hash) usg_safe :: IsSafeImport Was this module imported as a safe import
UsageHomeModule | Module from the current package
Fields usg_mod_name :: ModuleName Name of the module usg_unit_id :: UnitId UnitId of the HomeUnit the module is from usg_mod_hash :: Fingerprint Cached module ABI fingerprint (corresponds to mi_mod_hash) usg_entities :: [(OccName, Fingerprint)] Entities we depend on, sorted by occurrence name and fingerprinted. NB: usages are for parent names only, e.g. type constructors but not the associated data constructors. usg_exports :: Maybe Fingerprint Fingerprint for the export list of this module, if we directly imported it (and hence we depend on its export list) usg_safe :: IsSafeImport Was this module imported as a safe import
UsageFile | A file upon which the module depends, e.g. a CPP #include, or using TH's `addDependentFile`
Fields usg_file_path :: FastString External file dependency. From a CPP #include or TH addDependentFile. Should be absolute. usg_file_hash :: Fingerprint `Fingerprint` of the file contents. usg_file_label :: Maybe String An optional string which is used in recompilation messages if file in question has changed.
UsageHomeModuleInterface |
Fields usg_mod_name :: ModuleName Name of the module usg_unit_id :: UnitId UnitId of the HomeUnit the module is from usg_iface_hash :: Fingerprint The *interface* hash of the module, not the ABI hash. This changes when anything about the interface (and hence the module) has changed.
UsageMergedRequirement | A requirement which was merged into this one.
Fields usg_mod :: Module External package module depended on usg_mod_hash :: Fingerprint Cached module ABI fingerprint (corresponds to mi_mod_hash)

#### Instances

Instances details

Binary Usage # |
Instance details Defined in GHC.Unit.Module.Deps Methods put_ :: BinHandle -> Usage -> IO () # put :: BinHandle -> Usage -> IO (Bin Usage) # get :: BinHandle -> IO Usage #
Eq Usage # |
Instance details Defined in GHC.Unit.Module.Deps Methods (==) :: Usage -> Usage -> Bool # (/=) :: Usage -> Usage -> Bool #

data ImportAvails #

`ImportAvails` summarises what was imported from where, irrespective of whether the imported things are actually used or not. It is used:

- when processing the export list,
- when constructing usage info for the interface file,
- to identify the list of directly imported modules for initialisation purposes and for optimised overlap checking of family instances,
- when figuring out what things are really unused

Constructors

ImportAvails |
Fields imp_mods :: ImportedMods Domain is all directly-imported modules See the documentation on ImportedModsVal in GHC.Unit.Module.Imported for the meaning of the fields. We need a full ModuleEnv rather than a ModuleNameEnv here, because we might be importing modules of the same name from different packages. (currently not the case, but might be in the future). imp_direct_dep_mods :: InstalledModuleEnv ModuleNameWithIsBoot Home-package modules directly imported by the module being compiled. imp_dep_direct_pkgs :: Set UnitId Packages directly needed by the module being compiled imp_trust_own_pkg :: Bool Do we require that our own package is trusted? This is to handle efficiently the case where a Safe module imports a Trustworthy module that resides in the same package as it. See Note [Trust Own Package] in GHC.Rename.Names imp_trust_pkgs :: Set UnitId This records the packages the current module needs to trust for Safe Haskell compilation to succeed. A package is required to be trusted if we are dependent on a trustworthy module in that package. See Note [Tracking Trust Transitively] in GHC.Rename.Names imp_boot_mods :: InstalledModuleEnv ModuleNameWithIsBoot Domain is all modules which have hs-boot files, and whether we should import the boot version of interface file. Only used in one-shot mode to populate eps_is_boot. imp_sig_mods :: [ModuleName] Signature modules below this one imp_orphs :: [Module] Orphan modules below us in the import tree (and maybe including us for imported modules) imp_finsts :: [Module] Family instance modules below us in the import tree (and maybe including us for imported modules)