1-- | See <https://github.com/ezyang/ghc-proposals/blob/backpack/proposals/0000-backpack.rst>
2module Distribution.Backpack.PreExistingComponent (
3    PreExistingComponent(..),
4    ipiToPreExistingComponent,
5) where
6
7import Prelude ()
8import Distribution.Compat.Prelude
9
10import Distribution.Backpack.ModuleShape
11import Distribution.Backpack
12import Distribution.Types.ComponentId
13import Distribution.Types.MungedPackageId
14import Distribution.Types.PackageId
15import Distribution.Types.UnitId
16import Distribution.Types.ComponentName
17import Distribution.Types.PackageName
18import Distribution.Package
19
20import qualified Data.Map as Map
21import qualified Distribution.InstalledPackageInfo as Installed
22import Distribution.InstalledPackageInfo (InstalledPackageInfo)
23
24-- | Stripped down version of 'LinkedComponent' for things
25-- we don't need to know how to build.
26data PreExistingComponent
27    = PreExistingComponent {
28        -- | The actual name of the package. This may DISAGREE with 'pc_pkgid'
29        -- for internal dependencies: e.g., an internal component @lib@ may be
30        -- munged to @z-pkg-z-lib@, but we still want to use it when we see
31        -- @lib@ in @build-depends@
32        pc_pkgname :: PackageName,
33        -- | The actual name of the component.
34        pc_compname :: ComponentName,
35        pc_munged_id :: MungedPackageId,
36        pc_uid   :: UnitId,
37        pc_cid   :: ComponentId,
38        pc_open_uid :: OpenUnitId,
39        pc_shape :: ModuleShape
40    }
41
42-- | Convert an 'InstalledPackageInfo' into a 'PreExistingComponent',
43-- which was brought into scope under the 'PackageName' (important for
44-- a package qualified reference.)
45ipiToPreExistingComponent :: InstalledPackageInfo -> PreExistingComponent
46ipiToPreExistingComponent ipi =
47    PreExistingComponent {
48        pc_pkgname = packageName ipi,
49        pc_compname = CLibName $ Installed.sourceLibName ipi,
50        pc_munged_id = mungedId ipi,
51        pc_uid   = Installed.installedUnitId ipi,
52        pc_cid   = Installed.installedComponentId ipi,
53        pc_open_uid =
54            IndefFullUnitId (Installed.installedComponentId ipi)
55                            (Map.fromList (Installed.instantiatedWith ipi)),
56        pc_shape = shapeInstalledPackage ipi
57    }
58
59instance HasMungedPackageId PreExistingComponent where
60  mungedId = pc_munged_id
61
62instance Package PreExistingComponent where
63  packageId pec = PackageIdentifier (pc_pkgname pec) v
64    where MungedPackageId _ v = pc_munged_id pec
65
66instance HasUnitId PreExistingComponent where
67  installedUnitId = pc_uid
68