hackport-0.5.1: cabal/Cabal/Distribution/Backpack/PreExistingComponent.hs
-- | See <https://github.com/ezyang/ghc-proposals/blob/backpack/proposals/0000-backpack.rst>
module Distribution.Backpack.PreExistingComponent (
PreExistingComponent(..),
ipiToPreExistingComponent,
) where
import Prelude ()
import Distribution.Backpack.ModuleShape
import Distribution.Backpack
import qualified Data.Map as Map
import Distribution.Package
import qualified Distribution.InstalledPackageInfo as Installed
import Distribution.InstalledPackageInfo (InstalledPackageInfo)
-- | Stripped down version of 'LinkedComponent' for things
-- we don't need to know how to build.
data PreExistingComponent
= PreExistingComponent {
-- | The 'PackageName' that, when we see it in 'PackageDescription',
-- we should map this to. This may DISAGREE with 'pc_pkgid' for
-- internal dependencies: e.g., an internal component @lib@
-- may be munged to @z-pkg-z-lib@, but we still want to use
-- it when we see @lib@ in @build-depends@
pc_pkgname :: PackageName,
pc_pkgid :: PackageId,
pc_uid :: UnitId,
pc_cid :: ComponentId,
pc_open_uid :: OpenUnitId,
pc_shape :: ModuleShape
}
-- | Convert an 'InstalledPackageInfo' into a 'PreExistingComponent',
-- which was brought into scope under the 'PackageName' (important for
-- a package qualified reference.)
ipiToPreExistingComponent :: (PackageName, InstalledPackageInfo) -> PreExistingComponent
ipiToPreExistingComponent (pn, ipi) =
PreExistingComponent {
pc_pkgname = pn,
pc_pkgid = Installed.sourcePackageId ipi,
pc_uid = Installed.installedUnitId ipi,
pc_cid = Installed.installedComponentId ipi,
pc_open_uid =
IndefFullUnitId (Installed.installedComponentId ipi)
(Map.fromList (Installed.instantiatedWith ipi)),
pc_shape = shapeInstalledPackage ipi
}