1
1
-- TODO: Review and possibly move elsewhere. This code was part of the
2
2
-- RecentPackages (formerly "Check") feature, but that caused some cyclic
3
3
-- dependencies.
4
+ {-# LANGUAGE TupleSections #-}
4
5
module Distribution.Server.Packages.Render (
5
6
-- * Package render
6
7
PackageRender (.. )
@@ -53,6 +54,7 @@ import Distribution.Utils.ShortText (fromShortText)
53
54
54
55
import qualified Data.TarIndex as TarIndex
55
56
import Data.TarIndex (TarIndex , TarEntryOffset )
57
+ import Data.Bifunctor (first , Bifunctor (.. ))
56
58
57
59
data ModSigIndex = ModSigIndex {
58
60
modIndex :: ModuleForest ,
@@ -64,10 +66,10 @@ data ModSigIndex = ModSigIndex {
64
66
-- This is why some fields of PackageDescription are preprocessed, and others aren't.
65
67
data PackageRender = PackageRender {
66
68
rendPkgId :: PackageIdentifier ,
69
+ rendLibName :: LibraryName -> String ,
67
70
rendDepends :: [Dependency ],
68
71
rendExecNames :: [String ],
69
- rendLibraryDeps :: Maybe DependencyTree ,
70
- rendSublibraryDeps :: [(String , DependencyTree )],
72
+ rendLibraryDeps :: [(LibraryName , DependencyTree )],
71
73
rendExecutableDeps :: [(String , DependencyTree )],
72
74
rendLicenseName :: String ,
73
75
rendLicenseFiles :: [FilePath ],
@@ -78,7 +80,7 @@ data PackageRender = PackageRender {
78
80
-- to test if a module actually has a corresponding documentation HTML
79
81
-- file we can link to. If no 'TarIndex' is provided, it is assumed
80
82
-- all links are dead.
81
- rendModules :: Maybe TarIndex -> Maybe ModSigIndex ,
83
+ rendModules :: Maybe TarIndex -> [( LibraryName , ModSigIndex )] ,
82
84
rendHasTarball :: Bool ,
83
85
rendChangeLog :: Maybe (FilePath , ETag , TarEntryOffset , FilePath ),
84
86
rendReadme :: Maybe (FilePath , ETag , TarEntryOffset , FilePath ),
@@ -95,14 +97,13 @@ data PackageRender = PackageRender {
95
97
96
98
doPackageRender :: Users. Users -> PkgInfo -> PackageRender
97
99
doPackageRender users info = PackageRender
98
- { rendPkgId = pkgInfoId info
100
+ { rendPkgId = packageId'
99
101
, rendDepends = flatDependencies genDesc
102
+ , rendLibName = renderLibName
100
103
, rendExecNames = map (unUnqualComponentName . exeName) (executables flatDesc)
101
- , rendLibraryDeps = depTree libBuildInfo `fmap` condLibrary genDesc
102
104
, rendExecutableDeps = (unUnqualComponentName *** depTree buildInfo)
103
105
`map` condExecutables genDesc
104
- , rendSublibraryDeps = (unUnqualComponentName *** depTree libBuildInfo)
105
- `map` condSubLibraries genDesc
106
+ , rendLibraryDeps = second (depTree libBuildInfo) <$> allCondLibs genDesc
106
107
, rendLicenseName = prettyShow (license desc) -- maybe make this a bit more human-readable
107
108
, rendLicenseFiles = map getSymbolicPath $ licenseFiles desc
108
109
, rendMaintainer = case fromShortText $ maintainer desc of
@@ -144,17 +145,15 @@ doPackageRender users info = PackageRender
144
145
then Buildable
145
146
else NotBuildable
146
147
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
150
151
-- Assumes that there is an HTML per reexport
151
152
++ map moduleReexportName (reexportedModules lib)
152
153
++ 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 })
158
157
159
158
moduleHasDocs :: Maybe TarIndex -> ModuleName -> Bool
160
159
moduleHasDocs Nothing = const False
@@ -172,6 +171,21 @@ doPackageRender users info = PackageRender
172
171
loc <- repoLocation r
173
172
return (ty, loc, r)
174
173
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
+
175
189
type DependencyTree = CondTree ConfVar [Dependency ] IsBuildable
176
190
177
191
data IsBuildable = Buildable
0 commit comments