@@ -83,25 +83,30 @@ data SimpleDesc = SimpleDesc
83 { sdPackages :: Map PackageName DepInfo
83 { sdPackages :: Map PackageName DepInfo
84 , sdTools :: Map ExeName DepInfo
84 , sdTools :: Map ExeName DepInfo
85 , sdProvidedExes :: Set ExeName
85 , sdProvidedExes :: Set ExeName
86+ , sdModules :: Set Text
87+ -- ^ modules exported by the library
87 deriving (Show, Eq)
89 deriving (Show, Eq)
88instance Monoid SimpleDesc where
90instance Monoid SimpleDesc where
89− mempty = SimpleDesc mempty mempty mempty
91+ mempty = SimpleDesc mempty mempty mempty mempty
90− mappend (SimpleDesc a b c) (SimpleDesc x y z) = SimpleDesc
92+ mappend (SimpleDesc a b c d) (SimpleDesc w x y z) = SimpleDesc
91− (unionWith (<>) a x)
93+ (unionWith (<>) a w)
92− (unionWith (<>) b y)
94+ (unionWith (<>) b x)
94instance ToJSON SimpleDesc where
97instance ToJSON SimpleDesc where
95 toJSON SimpleDesc {..} = object
98 toJSON SimpleDesc {..} = object
96 [ "packages" .= Map.mapKeysWith const unPackageName sdPackages
99 [ "packages" .= Map.mapKeysWith const unPackageName sdPackages
97 , "tools" .= Map.mapKeysWith const unExeName sdTools
100 , "tools" .= Map.mapKeysWith const unExeName sdTools
98 , "provided-exes" .= sdProvidedExes
101 , "provided-exes" .= sdProvidedExes
102+ , "modules" .= sdModules
100instance FromJSON SimpleDesc where
104instance FromJSON SimpleDesc where
101 parseJSON = withObject "SimpleDesc" $ \o -> do
105 parseJSON = withObject "SimpleDesc" $ \o -> do
102 sdPackages <- Map.mapKeysWith const mkPackageName <$> (o .: "packages")
106 sdPackages <- Map.mapKeysWith const mkPackageName <$> (o .: "packages")
103 sdTools <- Map.mapKeysWith const ExeName <$> (o .: "tools")
107 sdTools <- Map.mapKeysWith const ExeName <$> (o .: "tools")
104 sdProvidedExes <- o .: "provided-exes"
108 sdProvidedExes <- o .: "provided-exes"
109+ sdModules <- o .: "modules"
105 return SimpleDesc {..}
110 return SimpleDesc {..}
107-- | Convert a 'GenericPackageDescription' into a 'SimpleDesc' by following the
112-- | Convert a 'GenericPackageDescription' into a 'SimpleDesc' by following the
@@ -111,46 +116,54 @@ toSimpleDesc :: MonadThrow m
111 -> GenericPackageDescription
116 -> GenericPackageDescription
112 -> m SimpleDesc
117 -> m SimpleDesc
113toSimpleDesc cc gpd = execWriterT $ do
118toSimpleDesc cc gpd = execWriterT $ do
114− forM_ (condLibrary gpd) $ tellTree cc CompLibrary libBuildInfo
119+ forM_ (condLibrary gpd) $ tellTree cc CompLibrary libBuildInfo getModules
115− forM_ (condExecutables gpd) $ tellTree cc CompExecutable buildInfo . snd
120+ forM_ (condExecutables gpd) $ tellTree cc CompExecutable buildInfo noModules . snd
116 tell mempty { sdProvidedExes = setFromList
121 tell mempty { sdProvidedExes = setFromList
117 $ map (fromString . fst)
122 $ map (fromString . fst)
118 $ condExecutables gpd
123 $ condExecutables gpd
120 when (ccIncludeTests cc) $ forM_ (condTestSuites gpd)
125 when (ccIncludeTests cc) $ forM_ (condTestSuites gpd)
121− $ tellTree cc CompTestSuite testBuildInfo . snd
126+ $ tellTree cc CompTestSuite testBuildInfo noModules . snd
122 when (ccIncludeBenchmarks cc) $ forM_ (condBenchmarks gpd)
127 when (ccIncludeBenchmarks cc) $ forM_ (condBenchmarks gpd)
123− $ tellTree cc CompBenchmark benchmarkBuildInfo . snd
128+ $ tellTree cc CompBenchmark benchmarkBuildInfo noModules . snd
130+ noModules = const mempty
131+ getModules = setFromList . map display . exposedModules
125-- | Convert a single CondTree to a 'SimpleDesc'.
133-- | Convert a single CondTree to a 'SimpleDesc'.
126tellTree :: (MonadWriter SimpleDesc m, MonadThrow m)
134tellTree :: (MonadWriter SimpleDesc m, MonadThrow m)
127 => CheckCond
135 => CheckCond
128 -> Component
136 -> Component
129 -> (a -> BuildInfo)
137 -> (a -> BuildInfo)
138+ -> (a -> Set Text) -- ^ get module names
130 -> CondTree ConfVar [Dependency] a
139 -> CondTree ConfVar [Dependency] a
141+tellTree cc component getBI getModules =
132−tellTree cc component getBI (CondNode dat deps comps) = do
144+ loop (CondNode dat deps comps) = do
133− tell mempty
145+ tell mempty
134− { sdPackages = unionsWith (<>) $ flip map deps
146+ { sdPackages = unionsWith (<>) $ flip map deps
135− $ \(Dependency x y) -> singletonMap x DepInfo
147+ $ \(Dependency x y) -> singletonMap x DepInfo
136− { diComponents = singletonSet component
137− , diRange = simplifyVersionRange y
139− , sdTools = unionsWith (<>) $ flip map (buildTools $ getBI dat)
140− $ \(Dependency name range) -> singletonMap
141− -- In practice, cabal files refer to the exe name, not the
143− (ExeName $ unPackageName name)
145 { diComponents = singletonSet component
148 { diComponents = singletonSet component
146− , diRange = simplifyVersionRange range
149+ , diRange = simplifyVersionRange y
151+ , sdTools = unionsWith (<>) $ flip map (buildTools $ getBI dat)
152+ $ \(Dependency name range) -> singletonMap
153+ -- In practice, cabal files refer to the exe name, not the
155+ (ExeName $ unPackageName name)
157+ { diComponents = singletonSet component
158+ , diRange = simplifyVersionRange range
160+ , sdModules = getModules dat
149− forM_ comps $ \(cond, ontrue, onfalse) -> do
162+ forM_ comps $ \(cond, ontrue, onfalse) -> do
150− b <- checkCond cc cond
163+ b <- checkCond cc cond
152− then tellTree cc component getBI ontrue
165+ then loop ontrue
153− else maybe (return ()) (tellTree cc component getBI) onfalse
166+ else maybe (return ()) loop onfalse
155-- | Resolve a condition to a boolean based on the provided 'CheckCond'.
168-- | Resolve a condition to a boolean based on the provided 'CheckCond'.
156checkCond :: MonadThrow m => CheckCond -> Condition ConfVar -> m Bool
169checkCond :: MonadThrow m => CheckCond -> Condition ConfVar -> m Bool