diff options
-rw-r--r-- | src/Haddock/Interface/Create.hs | 68 |
1 files changed, 46 insertions, 22 deletions
diff --git a/src/Haddock/Interface/Create.hs b/src/Haddock/Interface/Create.hs index 9f6e4fa4..02733507 100644 --- a/src/Haddock/Interface/Create.hs +++ b/src/Haddock/Interface/Create.hs @@ -466,7 +466,8 @@ mkExportItems modMap this_mod gre exported_names decls declMap lookupExport (IEThingAbs t) = declWith t lookupExport (IEThingAll t) = declWith t lookupExport (IEThingWith t _) = declWith t - lookupExport (IEModuleContents m) = fullContentsOf m + lookupExport (IEModuleContents m) = + moduleExports this_mod m dflags gre exported_names decls modMap instIfaceMap lookupExport (IEGroup lev docStr) = liftErrMsg $ ifDoc (lexParseRnHaddockComment dflags DocSectionComment gre docStr) (\doc -> return [ ExportGroup lev "" doc ]) @@ -637,27 +638,6 @@ mkExportItems modMap this_mod gre exported_names decls declMap isExported = (`elem` exported_names) - fullContentsOf modname - | m == this_mod = liftErrMsg $ fullContentsOfThisModule dflags gre decls - | otherwise = - case Map.lookup m modMap of - Just iface - | OptHide `elem` ifaceOptions iface -> return (ifaceExportItems iface) - | otherwise -> return [ ExportModule m ] - - Nothing -> -- we have to try to find it in the installed interfaces - -- (external packages) - case Map.lookup modname (Map.mapKeys moduleName instIfaceMap) of - Just iface -> return [ ExportModule (instMod iface) ] - Nothing -> do - liftErrMsg $ - tell ["Warning: " ++ pretty this_mod ++ ": Could not find " ++ - "documentation for exported module: " ++ pretty modname] - return [] - where - m = mkModule packageId modname - packageId = modulePackageId this_mod - findDecl :: Name -> Maybe DeclInfo findDecl n @@ -669,6 +649,50 @@ mkExportItems modMap this_mod gre exported_names decls declMap m = nameModule n +-- | Return all export items produced by an exported module. That is, we're +-- interested in the exports produced by \"module B\" in such a scenario: +-- +-- > module A (module B) where +-- > import B (...) hiding (...) +-- +-- There are three different cases to consider: +-- +-- 1) B is hidden, in which case we return all its exports that are in scope in A. +-- 2) B is visible, but not all its exports are in scope in A, in which case we +-- only return those that are. +-- 3) B is visible and all its exports are in scope, in which case we return +-- a single 'ExportModule' item. +moduleExports :: Module -- ^ Module A + -> ModuleName -- ^ The real name of B, the exported module + -> DynFlags -- ^ The flag used when typechecking A + -> GlobalRdrEnv -- ^ The renaming environment used for A + -> [Name] -- ^ All the exports of A + -> [DeclInfo] -- ^ All the declarations in A + -> IfaceMap -- ^ Already created interfaces + -> InstIfaceMap -- ^ Interfaces in other packages + -> ErrMsgGhc [ExportItem Name] -- ^ Resulting export items +moduleExports thisMod expMod dflags gre exports decls ifaceMap instIfaceMap + | m == thisMod = liftErrMsg $ fullContentsOfThisModule dflags gre decls + | otherwise = + case Map.lookup m ifaceMap of + Just iface + | OptHide `elem` ifaceOptions iface -> return (ifaceExportItems iface) + | otherwise -> return [ ExportModule m ] + + Nothing -> -- we have to try to find it in the installed interfaces + -- (external packages) + case Map.lookup expMod (Map.mapKeys moduleName instIfaceMap) of + Just iface -> return [ ExportModule (instMod iface) ] + Nothing -> do + liftErrMsg $ + tell ["Warning: " ++ pretty thisMod ++ ": Could not find " ++ + "documentation for exported module: " ++ pretty expMod] + return [] + where + m = mkModule packageId expMod + packageId = modulePackageId thisMod + + -- Note [1]: ------------ -- It is unnecessary to document a subordinate by itself at the top level if |