ghc-9.6.3: The GHC API

Safe Haskell | Safe-Inferred
Language | Haskell2010

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 :: FilePath
    - 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 Source #

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

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

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 Source #

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

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 Source #

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] Source #

Transitive closure of hsig files in the home package

dep_trusted_pkgs :: Dependencies -> Set UnitId Source #

dep_orphs :: Dependencies -> [Module] Source #

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 Source #

All units needed for plugins

dep_finsts :: Dependencies -> [Module] Source #

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) Source #

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 Source #

Update module dependencies containing orphans (used by Backpack)

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

Update module dependencies containing family instances (used by Backpack)

pprDeps :: UnitState -> Dependencies -> SDoc Source #

Pretty-print unit dependencies

data Usage Source #

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 :: FilePath

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

data ImportAvails Source #

`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)