11-- TODO: Review and possibly move elsewhere. This code was part of the
22-- RecentPackages (formerly "Check") feature, but that caused some cyclic
33-- dependencies.
4+ {-# LANGUAGE TupleSections #-}
45module Distribution.Server.Packages.Render (
56 -- * Package render
67 PackageRender (.. )
@@ -53,6 +54,7 @@ import Distribution.Utils.ShortText (fromShortText)
5354
5455import qualified Data.TarIndex as TarIndex
5556import Data.TarIndex (TarIndex , TarEntryOffset )
57+ import Data.Bifunctor (first , Bifunctor (.. ))
5658
5759data ModSigIndex = ModSigIndex {
5860 modIndex :: ModuleForest ,
@@ -64,10 +66,10 @@ data ModSigIndex = ModSigIndex {
6466-- This is why some fields of PackageDescription are preprocessed, and others aren't.
6567data PackageRender = PackageRender {
6668 rendPkgId :: PackageIdentifier ,
69+ rendLibName :: LibraryName -> String ,
6770 rendDepends :: [Dependency ],
6871 rendExecNames :: [String ],
69- rendLibraryDeps :: Maybe DependencyTree ,
70- rendSublibraryDeps :: [(String , DependencyTree )],
72+ rendLibraryDeps :: [(LibraryName , DependencyTree )],
7173 rendExecutableDeps :: [(String , DependencyTree )],
7274 rendLicenseName :: String ,
7375 rendLicenseFiles :: [FilePath ],
@@ -78,7 +80,7 @@ data PackageRender = PackageRender {
7880 -- to test if a module actually has a corresponding documentation HTML
7981 -- file we can link to. If no 'TarIndex' is provided, it is assumed
8082 -- all links are dead.
81- rendModules :: Maybe TarIndex -> Maybe ModSigIndex ,
83+ rendModules :: Maybe TarIndex -> [( LibraryName , ModSigIndex )] ,
8284 rendHasTarball :: Bool ,
8385 rendChangeLog :: Maybe (FilePath , ETag , TarEntryOffset , FilePath ),
8486 rendReadme :: Maybe (FilePath , ETag , TarEntryOffset , FilePath ),
@@ -95,14 +97,13 @@ data PackageRender = PackageRender {
9597
9698doPackageRender :: Users. Users -> PkgInfo -> PackageRender
9799doPackageRender users info = PackageRender
98- { rendPkgId = pkgInfoId info
100+ { rendPkgId = packageId'
99101 , rendDepends = flatDependencies genDesc
102+ , rendLibName = renderLibName
100103 , rendExecNames = map (unUnqualComponentName . exeName) (executables flatDesc)
101- , rendLibraryDeps = depTree libBuildInfo `fmap` condLibrary genDesc
102104 , rendExecutableDeps = (unUnqualComponentName *** depTree buildInfo)
103105 `map` condExecutables genDesc
104- , rendSublibraryDeps = (unUnqualComponentName *** depTree libBuildInfo)
105- `map` condSubLibraries genDesc
106+ , rendLibraryDeps = second (depTree libBuildInfo) <$> allCondLibs genDesc
106107 , rendLicenseName = prettyShow (license desc) -- maybe make this a bit more human-readable
107108 , rendLicenseFiles = map getSymbolicPath $ licenseFiles desc
108109 , rendMaintainer = case fromShortText $ maintainer desc of
@@ -144,17 +145,15 @@ doPackageRender users info = PackageRender
144145 then Buildable
145146 else NotBuildable
146147
147- renderModules docindex
148- | Just lib <- library flatDesc
149- = let mod_ix = mkForest $ exposedModules lib
148+ renderModules :: Maybe TarIndex -> [( LibraryName , ModSigIndex )]
149+ renderModules docindex = flip fmap (allLibraries flatDesc) $ \ lib ->
150+ let mod_ix = mkForest $ exposedModules lib
150151 -- Assumes that there is an HTML per reexport
151152 ++ map moduleReexportName (reexportedModules lib)
152153 ++ virtualModules (libBuildInfo lib)
153- sig_ix = mkForest $ signatures lib
154- mkForest = moduleForest . map (\ m -> (m, moduleHasDocs docindex m))
155- in Just (ModSigIndex { modIndex = mod_ix, sigIndex = sig_ix })
156- | otherwise
157- = Nothing
154+ sig_ix = mkForest $ signatures lib
155+ mkForest = moduleForest . map (\ m -> (m, moduleHasDocs docindex m))
156+ in (libName lib, ModSigIndex { modIndex = mod_ix, sigIndex = sig_ix })
158157
159158 moduleHasDocs :: Maybe TarIndex -> ModuleName -> Bool
160159 moduleHasDocs Nothing = const False
@@ -172,6 +171,21 @@ doPackageRender users info = PackageRender
172171 loc <- repoLocation r
173172 return (ty, loc, r)
174173
174+ packageId' :: PackageIdentifier
175+ packageId' = pkgInfoId info
176+
177+ packageName' :: String
178+ packageName' = unPackageName $ pkgName packageId'
179+
180+ renderLibName :: LibraryName -> String
181+ renderLibName LMainLibName = packageName'
182+ renderLibName (LSubLibName name) =
183+ packageName' ++ " :" ++ unUnqualComponentName name
184+
185+ allCondLibs :: GenericPackageDescription -> [(LibraryName , CondTree ConfVar [Dependency ] Library )]
186+ allCondLibs desc = maybeToList ((LMainLibName ,) <$> condLibrary desc)
187+ ++ (first LSubLibName <$> condSubLibraries desc)
188+
175189type DependencyTree = CondTree ConfVar [Dependency ] IsBuildable
176190
177191data IsBuildable = Buildable
0 commit comments