Safe Haskell | None |
---|---|
Language | GHC2021 |
A UnitEnv
provides the complete interface into everything that is loaded
into a GHC session, including the HomeUnitGraph
for mapping home units to their
HomePackageTable
s (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
- data UnitEnv = UnitEnv {}
- initUnitEnv :: UnitId -> HomeUnitGraph -> GhcNameVersion -> Platform -> IO UnitEnv
- ueEPS :: UnitEnv -> IO ExternalPackageState
- updateHug :: (HomeUnitGraph -> HomeUnitGraph) -> UnitEnv -> UnitEnv
- ue_currentHomeUnitEnv :: HasDebugCallStack => UnitEnv -> HomeUnitEnv
- ue_hpt :: HasDebugCallStack => UnitEnv -> HomePackageTable
- ue_setActiveUnit :: UnitId -> UnitEnv -> UnitEnv
- ue_currentUnit :: UnitEnv -> UnitId
- ue_findHomeUnitEnv :: HasDebugCallStack => UnitId -> UnitEnv -> HomeUnitEnv
- ue_unitHomeUnit :: UnitId -> UnitEnv -> HomeUnit
- ue_unitHomeUnit_maybe :: UnitId -> UnitEnv -> Maybe HomeUnit
- ue_updateHomeUnitEnv :: (HomeUnitEnv -> HomeUnitEnv) -> UnitId -> UnitEnv -> UnitEnv
- ue_all_home_unit_ids :: UnitEnv -> Set UnitId
- ue_unsafeHomeUnit :: UnitEnv -> HomeUnit
- type HomeUnitGraph = UnitEnvGraph HomeUnitEnv
- data HomeUnitEnv = HomeUnitEnv {}
- assertUnitEnvInvariant :: HasDebugCallStack => UnitEnv -> UnitEnv
- preloadUnitsInfo :: UnitEnv -> MaybeErr UnitErr [UnitInfo]
- preloadUnitsInfo' :: UnitEnv -> [UnitId] -> MaybeErr UnitErr [UnitInfo]
- isUnitEnvInstalledModule :: UnitEnv -> InstalledModule -> Bool
- renameUnitId :: HasDebugCallStack => UnitId -> UnitId -> UnitEnv -> UnitEnv
- insertHpt :: HasDebugCallStack => HomeModInfo -> UnitEnv -> IO ()
- ue_setFlags :: HasDebugCallStack => DynFlags -> UnitEnv -> UnitEnv
- ue_homeUnitState :: HasDebugCallStack => UnitEnv -> UnitState
- ue_unit_dbs :: UnitEnv -> Maybe [UnitDatabase UnitId]
- ue_homeUnit :: UnitEnv -> Maybe HomeUnit
- ue_unitFlags :: HasDebugCallStack => UnitId -> UnitEnv -> DynFlags
- ue_transitiveHomeDeps :: UnitId -> UnitEnv -> [UnitId]
- hugCompleteSigs :: UnitEnv -> IO CompleteMatches
- hugAllInstances :: UnitEnv -> IO (InstEnv, [FamInst])
- hugAllAnns :: UnitEnv -> IO AnnEnv
- ue_units :: HasDebugCallStack => UnitEnv -> UnitState
Documentation
UnitEnv | |
|
initUnitEnv :: UnitId -> HomeUnitGraph -> GhcNameVersion -> Platform -> IO UnitEnv Source #
updateHug :: (HomeUnitGraph -> HomeUnitGraph) -> UnitEnv -> UnitEnv Source #
Unit Env helper functions
ue_hpt :: HasDebugCallStack => UnitEnv -> HomePackageTable Source #
Get the current home unit's package table
ue_currentUnit :: UnitEnv -> UnitId Source #
ue_findHomeUnitEnv :: HasDebugCallStack => UnitId -> UnitEnv -> HomeUnitEnv Source #
ue_updateHomeUnitEnv :: (HomeUnitEnv -> HomeUnitEnv) -> UnitId -> UnitEnv -> UnitEnv Source #
ue_unsafeHomeUnit :: UnitEnv -> HomeUnit Source #
HUG Re-export
type HomeUnitGraph = UnitEnvGraph HomeUnitEnv Source #
data HomeUnitEnv Source #
HomeUnitEnv | |
|
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.
, it is assumed that the renameUnitId
oldUnit newUnit UnitEnvoldUnit
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
ue_homeUnitState :: HasDebugCallStack => UnitEnv -> UnitState Source #
ue_unit_dbs :: UnitEnv -> Maybe [UnitDatabase UnitId] Source #
ue_unitFlags :: HasDebugCallStack => UnitId -> UnitEnv -> DynFlags Source #
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.
Legacy API
This API is deprecated!