diff options
-rw-r--r-- | src/Haddock/Interface.hs | 11 | ||||
-rw-r--r-- | src/Haddock/Interface/AttachInstances.hs | 22 |
2 files changed, 23 insertions, 10 deletions
diff --git a/src/Haddock/Interface.hs b/src/Haddock/Interface.hs index e27aefb1..4b178bf4 100644 --- a/src/Haddock/Interface.hs +++ b/src/Haddock/Interface.hs @@ -41,12 +41,15 @@ createInterfaces modules externalLinks flags = (interfaces, homeLinks, messages) -- part 1, create the interfaces interfaces <- createInterfaces' modules flags - -- part 2, attach the instances - let interfaces' = attachInstances interfaces - - -- part 3, rename the interfaces + -- part 2, build the link environment let homeLinks = buildHomeLinks interfaces let links = homeLinks `Map.union` externalLinks + let allNames = Map.keys links + + -- part 3, attach the instances + let interfaces' = attachInstances interfaces allNames + + -- part 3, rename the interfaces interfaces'' <- mapM (renameInterface links) interfaces' return (interfaces'', homeLinks) diff --git a/src/Haddock/Interface/AttachInstances.hs b/src/Haddock/Interface/AttachInstances.hs index 8e81d8a6..f5140401 100644 --- a/src/Haddock/Interface/AttachInstances.hs +++ b/src/Haddock/Interface/AttachInstances.hs @@ -28,10 +28,13 @@ import FastString #define FSLIT(x) (mkFastString# (x#)) -attachInstances :: [Interface] -> [Interface] -attachInstances modules = map attach modules +attachInstances :: [Interface] -> [Name] -> [Interface] +attachInstances modules filterNames = map attach modules where - instMap = fmap (map toHsInstHead . sortImage instHead) $ collectInstances modules + instMap = + fmap (map toHsInstHead . sortImage instHead) $ + collectInstances modules filterNames + attach mod = mod { ifaceExportItems = newItems } where newItems = map attachExport (ifaceExportItems mod) @@ -43,6 +46,11 @@ attachInstances modules = map attach modules attachExport otherExport = otherExport +-------------------------------------------------------------------------------- +-- Collecting and sorting instances +-------------------------------------------------------------------------------- + + -- | Simplified type for sorting types, ignoring qualification (not visible -- in Haddock output) and unifying special tycons with normal ones. data SimpleType = SimpleType Name [SimpleType] deriving (Eq,Ord) @@ -50,17 +58,19 @@ data SimpleType = SimpleType Name [SimpleType] deriving (Eq,Ord) collectInstances :: [Interface] + -> [Name] -> Map Name [([TyVar], [PredType], Class, [Type])] -- maps class/type names to instances -collectInstances modules +collectInstances modules filterNames = Map.fromListWith (flip (++)) tyInstPairs `Map.union` Map.fromListWith (flip (++)) classInstPairs where allInstances = concat (map ifaceInstances modules) classInstPairs = [ (is_cls inst, [instanceHead inst]) | - inst <- allInstances ] + inst <- allInstances, Just n <- nub (is_tcs inst), + n `elem` filterNames ] tyInstPairs = [ (tycon, [instanceHead inst]) | inst <- allInstances, - Just tycon <- nub (is_tcs inst) ] + Just tycon <- nub (is_tcs inst) ] instHead :: ([TyVar], [PredType], Class, [Type]) -> ([Int], Name, [SimpleType]) |