pollock-0.1.0.3: src/Pollock/ModuleInfo/ModuleInfo.hs
{- |
Module: Pollock.ModuleInfo.ModuleInfo
Copyright: (c) Trevis Elser 2023
License: MIT
Maintainer: trevis@flipstone.com
Stability: experimental
Portability: portable
-}
module Pollock.ModuleInfo.ModuleInfo
( ModuleInfo (..)
, buildModuleInfo
) where
import qualified Data.Maybe as Maybe
import qualified Pollock.CompatGHC as CompatGHC
import qualified Pollock.Documentation as Documentation
import qualified Pollock.ModuleInfo.ModuleHeader as ModuleHeader
data ModuleInfo = ModuleInfo
{ moduleHeader :: !ModuleHeader.ModuleHeader
-- ^ The haddock module header
, haddockableExports :: !Int
-- ^ How many exported items that could have documentation attached.
, haddockedExports :: !Int
-- ^ How many exported items that do have haddock attached.
, numWithSince :: !Int
-- ^ How many exported items have a since annotation.
, numWithCodeBlock :: !Int
-- ^ How many exported items have a code block included in the documentation.
, numWithExample :: !Int
-- ^ How many exported items have an example included in the documentation.
, numWithProperty :: !Int
-- ^ How many exported items have a property included in the documentation.
, numWithWarning :: !Int
-- ^ How many exported items have a warning attached to them.
}
buildModuleInfo :: Maybe CompatGHC.HsDocString -> [Documentation.ExportItem] -> ModuleInfo
buildModuleInfo str =
let
initialModuleInfo =
ModuleInfo
{ moduleHeader = ModuleHeader.processModuleHeader str
, haddockableExports = 0
, haddockedExports = 0
, numWithSince = 0
, numWithCodeBlock = 0
, numWithExample = 0
, numWithProperty = 0
, numWithWarning = 0
}
in
foldr foldExportItemInfo initialModuleInfo
foldExportItemInfo :: Documentation.ExportItem -> ModuleInfo -> ModuleInfo
foldExportItemInfo exportItem moduleInfo =
if hasDoc exportItem
then
moduleInfo
{ haddockableExports =
haddockableExports moduleInfo + 1
, haddockedExports =
haddockedExports moduleInfo + 1
, numWithSince =
if Documentation.exportItemHasSinceVersion exportItem
then numWithSince moduleInfo + 1
else numWithSince moduleInfo
, numWithCodeBlock =
if Documentation.exportItemHasCodeBlock exportItem
then numWithCodeBlock moduleInfo + 1
else numWithCodeBlock moduleInfo
, numWithExample =
if Documentation.exportItemHasExample exportItem
then numWithExample moduleInfo + 1
else numWithExample moduleInfo
, numWithProperty =
if Documentation.exportItemHasProperty exportItem
then numWithProperty moduleInfo + 1
else numWithProperty moduleInfo
, numWithWarning =
if Documentation.exportItemHasWarning exportItem
then numWithWarning moduleInfo + 1
else numWithWarning moduleInfo
}
else -- With no docs we _only_ had an export, but nothing else.
moduleInfo
{ haddockableExports =
haddockableExports moduleInfo + 1
}
hasDoc :: Documentation.ExportItem -> Bool
hasDoc
( Documentation.ExportItemDecl
(Documentation.ExportDecl (Documentation.DocumentationForDecl d _ _))
) = Maybe.isJust d
hasDoc _ = True