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