ghc-9.13: The GHC API
Safe HaskellNone
LanguageGHC2021

GHC.Unit.Env

Description

A UnitEnv provides the complete interface into everything that is loaded into a GHC session, including the HomeUnitGraph for mapping home units to their HomePackageTables (which store information about all home modules), and the ExternalPackageState which provides access to all external packages loaded.

This module is meant to be imported as UnitEnv when calling insertHpt:

import GHC.Unit.Env (UnitEnv, HomeUnitGraph, HomeUnitEnv)
import GHC.Unit.Env as UnitEnv

Here is an overview of how the UnitEnv, ModuleGraph, HUG, HPT, and EPS interact:

┌────────────────┐┌────────────────────┐┌───────────┐
│HomePackageTable││ExternalPackageState││ModuleGraph│
└┬───────────────┘└┬───────────────────┘└┬──────────┘
┌▽────────────┐    │                     │
│HomeUnitGraph│    │                     │
└┬────────────┘    │                     │
┌▽─────────────────▽┐                    │
│UnitEnv            │                    │
└┬──────────────────┘                    │
┌▽───────────────────────────────────────▽┐
│HscEnv                                   │
└─────────────────────────────────────────┘

The UnitEnv references both the HomeUnitGraph (with all the home unit modules) and the ExternalPackageState (information about all non-home/external units). The HscEnv references this UnitEnv and the ModuleGraph (which describes the relationship between the modules being compiled). The HomeUnitGraph has one HomePackageTable for every unit.

TODO: Arguably, the ModuleGraph should be part of UnitEnv rather than being in the HscEnv.

Synopsis

Documentation

data UnitEnv Source #

Constructors

UnitEnv 

Fields

Unit Env helper functions

ue_hpt :: HasDebugCallStack => UnitEnv -> HomePackageTable Source #

Get the current home unit's package table

HUG Re-export

data HomeUnitEnv Source #

Constructors

HomeUnitEnv 

Fields

  • homeUnitEnv_units :: !UnitState

    External units

  • homeUnitEnv_unit_dbs :: !(Maybe [UnitDatabase UnitId])

    Stack of unit databases for the target platform.

    This field is populated with the result of initUnits.

    Nothing means the databases have never been read from disk.

    Usually we don't reload the databases from disk if they are cached, even if the database flags changed!

  • homeUnitEnv_dflags :: DynFlags

    The dynamic flag settings

  • homeUnitEnv_hpt :: HomePackageTable

    The home package table describes already-compiled home-package modules, excluding the module we are compiling right now. (In one-shot mode the current module is the only home-package module, so homeUnitEnv_hpt is empty. All other modules count as "external-package" modules. However, even in GHCi mode, hi-boot interfaces are demand-loaded into the external-package table.)

    homeUnitEnv_hpt is not mutable because we only demand-load external packages; the home package is eagerly loaded, module by module, by the compilation manager.

    The HPT may contain modules compiled earlier by --make but not actually below the current module in the dependency graph.

    (This changes a previous invariant: changed Jan 05.)

  • homeUnitEnv_home_unit :: !(Maybe HomeUnit)

    Home-unit

Invariants

Preload units info

preloadUnitsInfo :: UnitEnv -> MaybeErr UnitErr [UnitInfo] Source #

Lookup UnitInfo for every preload unit from the UnitState and for every unit used to instantiate the home unit.

preloadUnitsInfo' :: UnitEnv -> [UnitId] -> MaybeErr UnitErr [UnitInfo] Source #

Lookup UnitInfo for every preload unit from the UnitState, for every unit used to instantiate the home unit, and for every unit explicitly passed in the given list of UnitId.

Home Module functions

Operations on the UnitEnv

renameUnitId :: HasDebugCallStack => UnitId -> UnitId -> UnitEnv -> UnitEnv Source #

Rename a unit id in the internal unit env.

renameUnitId oldUnit newUnit UnitEnv, it is assumed that the oldUnit exists in the home units map, otherwise we panic. The DynFlags associated with the home unit will have its field homeUnitId set to newUnit.

Modifying the current active home unit

insertHpt :: HasDebugCallStack => HomeModInfo -> UnitEnv -> IO () Source #

Inserts a HomeModInfo at the given ModuleName on the HomePackageTable of the current unit being compiled.

ue_setFlags :: HasDebugCallStack => DynFlags -> UnitEnv -> UnitEnv Source #

Sets the DynFlags of the current unit being compiled to the given ones

Queries

Queries on the current active home unit

Reachability

Instances, rules, type fams, annotations, etc..

The hug prefix means the function returns only things found in home units.

hugCompleteSigs :: UnitEnv -> IO CompleteMatches Source #

Get all CompleteMatches (arising from COMPLETE pragmas) present across all home units.

hugAllInstances :: UnitEnv -> IO (InstEnv, [FamInst]) Source #

Find all the instance declarations (of classes and families) from the Home Package Table filtered by the provided predicate function.

hugAllAnns :: UnitEnv -> IO AnnEnv Source #

Find all the annotations in all home units

Legacy API

This API is deprecated!

ue_units :: HasDebugCallStack => UnitEnv -> UnitState Source #

Deprecated: Renamed to ue_homeUnitState because of confusion between units(tate) and unit(s) plural