blob: d7de79643448cb8583f17ede7e8cdb9fc12309d2 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
module GHC.Unit.Env
( UnitEnv (..)
, preloadUnitsInfo
, preloadUnitsInfo'
)
where
import GHC.Prelude
import GHC.Unit.State
import GHC.Unit.Home
import GHC.Unit.Types
import GHC.Platform
import GHC.Settings
import GHC.Data.Maybe
data UnitEnv = UnitEnv
{ ue_units :: !UnitState -- ^ Units
, ue_home_unit :: !HomeUnit -- ^ Home unit
, ue_platform :: !Platform -- ^ Platform
, ue_namever :: !GhcNameVersion -- ^ GHC name/version (used for dynamic library suffix)
}
-- -----------------------------------------------------------------------------
-- Extracting information from the packages in scope
-- Many of these functions take a list of packages: in those cases,
-- the list is expected to contain the "dependent packages",
-- i.e. those packages that were found to be depended on by the
-- current module/program. These can be auto or non-auto packages, it
-- doesn't really matter. The list is always combined with the list
-- of preload (command-line) packages to determine which packages to
-- use.
-- | 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.
preloadUnitsInfo' :: UnitEnv -> [UnitId] -> MaybeErr UnitErr [UnitInfo]
preloadUnitsInfo' unit_env ids0 = all_infos
where
home_unit = ue_home_unit unit_env
unit_state = ue_units unit_env
ids = ids0 ++ inst_ids
inst_ids
-- An indefinite package will have insts to HOLE,
-- which is not a real package. Don't look it up.
-- Fixes #14525
| isHomeUnitIndefinite home_unit = []
| otherwise = map (toUnitId . moduleUnit . snd) (homeUnitInstantiations home_unit)
pkg_map = unitInfoMap unit_state
preload = preloadUnits unit_state
all_pkgs = closeUnitDeps' pkg_map preload (ids `zip` repeat Nothing)
all_infos = map (unsafeLookupUnitId unit_state) <$> all_pkgs
-- | Lookup 'UnitInfo' for every preload unit from the UnitState and for every
-- unit used to instantiate the home unit.
preloadUnitsInfo :: UnitEnv -> MaybeErr UnitErr [UnitInfo]
preloadUnitsInfo unit_env = preloadUnitsInfo' unit_env []
|