
Marge Bot pushed to branch master at Glasgow Haskell Compiler / GHC Commits: a26243fd by Ryan Hendrickson at 2025-07-07T20:43:07-04:00 haddock: Document instances from other packages When attaching instances to `Interface`s, it isn't enough just to look for instances in the list of `Interface`s being processed. We also need to look in the modules on which they depend, including those outside of this package. Fixes #25147. Fixes #26079. - - - - - 6 changed files: - utils/haddock/CHANGES.md - utils/haddock/haddock-api/src/Haddock/Interface/AttachInstances.hs - utils/haddock/haddock-api/src/Haddock/Interface/Create.hs - utils/haddock/haddock-api/src/Haddock/Types.hs - utils/haddock/haddock-test/src/Test/Haddock/Config.hs - utils/haddock/html-test/ref/Bug1004.html Changes: ===================================== utils/haddock/CHANGES.md ===================================== @@ -1,6 +1,8 @@ ## Changes in 2.32.0 * Add highlighting for inline-code-blocks (sections enclosed in @'s) + * Fix missing documentation for orphan instances from other packages. + * Add incremental mode to support rendering documentation one module at a time. * The flag `--no-compilation` has been added. This flag causes Haddock to avoid ===================================== utils/haddock/haddock-api/src/Haddock/Interface/AttachInstances.hs ===================================== @@ -88,7 +88,10 @@ attachInstances expInfo ifaces instIfaceMap isOneShot = do , fromOrig == Just True || not (null reExp) ] mods_to_load = moduleSetElts mods - mods_visible = mkModuleSet $ map ifaceMod ifaces + -- We need to ensure orphans in modules outside of this package are included. + -- See https://gitlab.haskell.org/ghc/ghc/-/issues/25147 + -- and https://gitlab.haskell.org/ghc/ghc/-/issues/26079 + mods_visible = mkModuleSet $ concatMap (liftA2 (:) ifaceMod ifaceOrphanDeps) ifaces (_msgs, mb_index) <- do hsc_env <- getSession ===================================== utils/haddock/haddock-api/src/Haddock/Interface/Create.hs ===================================== @@ -59,6 +59,7 @@ import GHC.Types.Name.Set import GHC.Types.SafeHaskell import qualified GHC.Types.SrcLoc as SrcLoc import qualified GHC.Types.Unique.Map as UniqMap +import GHC.Unit.Module.Deps (dep_orphs) import GHC.Unit.Module.ModIface import GHC.Unit.State (PackageName (..), UnitState) import GHC.Utils.Outputable (SDocContext) @@ -270,6 +271,7 @@ createInterface1' flags unit_state dflags hie_file mod_iface ifaces inst_ifaces , ifaceVisibleExports = visible_names , ifaceFixMap = fixities , ifaceInstances = instances + , ifaceOrphanDeps = dep_orphs $ mi_deps mod_iface , ifaceOrphanInstances = [] -- Filled in attachInstances , ifaceRnOrphanInstances = [] -- Filled in renameInterfaceRn , ifaceHaddockCoverage = coverage ===================================== utils/haddock/haddock-api/src/Haddock/Types.hs ===================================== @@ -134,6 +134,9 @@ data Interface = Interface -- Names from modules that are entirely re-exported don't count as visible. , ifaceInstances :: [ClsInst] -- ^ Instances exported by the module. + , ifaceOrphanDeps :: [Module] + -- ^ The list of modules to check for orphan instances if this module is + -- imported. , ifaceOrphanInstances :: [DocInstance GhcRn] -- ^ Orphan instances , ifaceRnOrphanInstances :: [DocInstance DocNameI] ===================================== utils/haddock/haddock-test/src/Test/Haddock/Config.hs ===================================== @@ -262,6 +262,7 @@ baseDependencies ghcPath = do pkgs = [ "array" , "base" + , "deepseq" , "ghc-prim" , "process" , "template-haskell" ===================================== utils/haddock/html-test/ref/Bug1004.html ===================================== @@ -833,7 +833,61 @@ ><tr ><td class="src clearfix" > (NFData1 f, NFData1 g) => NFData1 (Product f g) #
Since: deepseq-1.4.3.0
Defined in Control.DeepSeq
<tr ><td class="src clearfix" ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:Product:Applicative:10" ></span > <span class="breakable" >(</tr ><tr >
<tr ><td class="src clearfix" ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:Product:Functor:11" ></span > <span class="breakable" >(</tr ><tr >
<tr ><td class="src clearfix" ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:Product:Monad:12" ></span > <span class="breakable" >(</tr ><tr >
<tr ><td class="src clearfix" ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:Product:MonadPlus:13" ></span > <span class="breakable" >(</tr ><tr >
<tr ><td class="src clearfix" ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:Product:MonadFix:14" ></span > <span class="breakable" >(</tr ><tr >
<tr ><td class="src clearfix" ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:Product:MonadZip:15" ></span > <span class="breakable" >(</tr ><tr >
<tr ><td class="src clearfix" ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:Product:Foldable:16" ></span > <span class="breakable" >(</tr ><tr >
<tr ><td class="src clearfix" ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:Product:Traversable:17" ></span > <span class="breakable" >(</tr ><tr >
Note: in deepseq-1.5.0.0
this instance's superclasses were changed.
Since: deepseq-1.4.3.0
Defined in Control.DeepSeq
<tr ><td class="src clearfix" ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:Product:Semigroup:20" ></span > <span class="breakable" >(</tr ><tr >
<tr ><td class="src clearfix" ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:Product:Eq:21" ></span > <span class="breakable" >(</tr ><tr >
<tr ><td class="src clearfix" ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:Product:Ord:22" ></span > <span class="breakable" >(</tr ><tr >
<tr ><td class="src clearfix" ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:Product:Data:23" ></span > <span class="breakable" >(</tr ><tr >
<tr ><td class="src clearfix" ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:Product:Generic:24" ></span > <a href="#" title="GHC.Generics" >Generic</tr ><tr >
<tr ><td class="src clearfix" ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:Product:Read:25" ></span > <span class="breakable" >(</tr ><tr >
<tr ><td class="src clearfix" ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:Product:Show:26" ></span > <span class="breakable" >(</tr ><tr >
<tr ><td class="src clearfix" ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:Product:Rep1:27" ></span > <span class="keyword" >type</tr ><tr >
<tr ><td class="src clearfix" ><span class="instance details-toggle-control details-toggle" data-details-id="i:id:Product:Rep:28" ></span > <span class="keyword" >type</tr ><tr >