diff --git a/cabal-install/Distribution/Client/ProjectPlanOutput.hs b/cabal-install/Distribution/Client/ProjectPlanOutput.hs index 2b6f31d50de33394ea1527f9d7f1361143a64929..0f5a18b76a9c4d2fc61c00068153a4bb578e4dfa 100644 --- a/cabal-install/Distribution/Client/ProjectPlanOutput.hs +++ b/cabal-install/Distribution/Client/ProjectPlanOutput.hs @@ -81,11 +81,12 @@ encodePlanAsJson elaboratedInstallPlan _elaboratedSharedConfig = ElabPackage pkg -> let components = J.object $ [ comp2str c J..= J.object - [ "depends" J..= map (jdisplay . confInstId) v ] - | (c,v) <- ComponentDeps.toList (pkgLibDependencies pkg) ] ++ - [ comp2str c J..= J.object - [ "exe-depends" J..= map (jdisplay . confInstId) v ] - | (c,v) <- ComponentDeps.toList (pkgExeDependencies pkg) ] + [ "depends" J..= map (jdisplay . confInstId) ldeps + , "exe-depends" J..= map (jdisplay . confInstId) edeps ] + | (c,(ldeps,edeps)) + <- ComponentDeps.toList $ + ComponentDeps.zip (pkgLibDependencies pkg) + (pkgExeDependencies pkg) ] in ["components" J..= components] ElabComponent _ -> ["depends" J..= map (jdisplay . confInstId) (elabLibDependencies elab) diff --git a/cabal-install/Distribution/Solver/Types/ComponentDeps.hs b/cabal-install/Distribution/Solver/Types/ComponentDeps.hs index 6c36cc6083ef310cd6f475194eae8f730d0cb3e7..621d12df117a84c33c1e23998861b184fa8dd187 100644 --- a/cabal-install/Distribution/Solver/Types/ComponentDeps.hs +++ b/cabal-install/Distribution/Solver/Types/ComponentDeps.hs @@ -22,6 +22,7 @@ module Distribution.Solver.Types.ComponentDeps ( , fromList , singleton , insert + , zip , filterDeps , fromLibraryDeps , fromSetupDeps @@ -35,6 +36,7 @@ module Distribution.Solver.Types.ComponentDeps ( , select ) where +import Prelude hiding (zip) import Data.Map (Map) import qualified Data.Map as Map import Distribution.Compat.Binary (Binary) @@ -119,6 +121,28 @@ insert comp a = ComponentDeps . Map.alter aux comp . unComponentDeps aux Nothing = Just a aux (Just a') = Just $ a `mappend` a' +-- | Zip two 'ComponentDeps' together by 'Component', using 'mempty' +-- as the neutral element when a 'Component' is present only in one. +zip :: (Monoid a, Monoid b) => ComponentDeps a -> ComponentDeps b -> ComponentDeps (a, b) +{- TODO/FIXME: Once we can expect containers>=0.5, switch to the more efficient version below: + +zip (ComponentDeps d1) (ComponentDeps d2) = + ComponentDeps $ + Map.mergeWithKey + (\_ a b -> Just (a,b)) + (fmap (\a -> (a, mempty))) + (fmap (\b -> (mempty, b))) + d1 d2 + +-} +zip (ComponentDeps d1) (ComponentDeps d2) = + ComponentDeps $ + Map.unionWith + mappend + (Map.map (\a -> (a, mempty)) d1) + (Map.map (\b -> (mempty, b)) d2) + + -- | Keep only selected components (and their associated deps info). filterDeps :: (Component -> a -> Bool) -> ComponentDeps a -> ComponentDeps a filterDeps p = ComponentDeps . Map.filterWithKey p . unComponentDeps diff --git a/cabal-install/tests/UnitTests/Distribution/Client/InstallPlan.hs b/cabal-install/tests/UnitTests/Distribution/Client/InstallPlan.hs index 2d06a8cdb2b20a06e8a8ceefdef06aa59a27c36e..74528a1f6e0c84b8ed7d0d6860874badedf09ece 100644 --- a/cabal-install/tests/UnitTests/Distribution/Client/InstallPlan.hs +++ b/cabal-install/tests/UnitTests/Distribution/Client/InstallPlan.hs @@ -11,7 +11,7 @@ import qualified Distribution.Compat.Graph as Graph import Distribution.Compat.Graph (IsNode(..)) import Distribution.Solver.Types.Settings import Distribution.Solver.Types.PackageFixedDeps -import Distribution.Solver.Types.ComponentDeps as CD +import qualified Distribution.Solver.Types.ComponentDeps as CD import Distribution.Client.Types import Distribution.Client.JobControl