diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/HaddockDevHelp.hs | 19 | ||||
| -rw-r--r-- | src/HaddockHtml.hs | 50 | ||||
| -rw-r--r-- | src/HaddockModuleTree.hs | 19 | ||||
| -rw-r--r-- | src/HaddockRename.hs | 8 | ||||
| -rw-r--r-- | src/HaddockTypes.hs | 4 | ||||
| -rw-r--r-- | src/HaddockUtil.hs | 18 | ||||
| -rw-r--r-- | src/Main.hs | 224 | 
7 files changed, 227 insertions, 115 deletions
diff --git a/src/HaddockDevHelp.hs b/src/HaddockDevHelp.hs index adfee1e2..8bf65d1a 100644 --- a/src/HaddockDevHelp.hs +++ b/src/HaddockDevHelp.hs @@ -4,18 +4,18 @@ import HaddockModuleTree  import HaddockTypes  import HaddockUtil -import Module ( moduleString, Module ) -import Name   ( Name, nameModule, getOccString ) +import Module        ( moduleName, moduleNameString, Module, mkModule, mkModuleName ) +import PackageConfig ( stringToPackageId ) +import Name          ( Name, nameModule, getOccString ) -import Data.Maybe ( fromMaybe ) +import Data.Maybe    ( fromMaybe )  import qualified Data.Map as Map  import Text.PrettyPrint  ppDevHelpFile :: FilePath -> String -> Maybe String -> [HaddockModule] -> IO ()  ppDevHelpFile odir doctitle maybe_package modules = do    let devHelpFile = package++".devhelp" -      tree = mkModuleTree [ (hmod_mod mod, hmod_package mod, toDescription mod) -			    | mod <- modules ] +      tree = mkModuleTree True [ (hmod_mod mod, toDescription mod) | mod <- modules ]        doc =          text "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"no\"?>" $$          (text "<book xmlns=\"http://www.devhelp.net/book\" title=\""<>text doctitle<> @@ -37,7 +37,7 @@ ppDevHelpFile odir doctitle maybe_package modules = do      ppModuleTree _  []     = error "HaddockHH.ppHHContents.fn: no module trees given"      ppNode :: [String] -> ModuleTree -> Doc -    ppNode ss (Node s leaf _pkg _short ts) = +    ppNode ss (Node s leaf _ _short ts) =          case ts of            [] -> text "<sub"<+>ppAttribs<>text "/>"            ts ->  @@ -45,7 +45,8 @@ ppDevHelpFile odir doctitle maybe_package modules = do              nest 4 (ppModuleTree (s:ss) ts) $+$              text "</sub>"          where -          ppLink | leaf      = text (moduleHtmlFile mdl) +          ppLink | leaf      = text (moduleHtmlFile (mkModule (stringToPackageId "")  +                                                              (mkModuleName mdl)))                   | otherwise = empty            ppAttribs = text "name="<>doubleQuotes (text s)<+>text "link="<>doubleQuotes ppLink @@ -69,6 +70,6 @@ ppDevHelpFile odir doctitle maybe_package modules = do      ppReference :: Name -> [Module] -> Doc      ppReference name [] = empty -    ppReference name (mod:refs) = let modName = moduleString mod in  -      text "<function name=\""<>text (escapeStr (getOccString name))<>text"\" link=\""<>text (nameHtmlRef modName name)<>text"\"/>" $$ +    ppReference name (mod:refs) =   +      text "<function name=\""<>text (escapeStr (getOccString name))<>text"\" link=\""<>text (nameHtmlRef mod name)<>text"\"/>" $$        ppReference name refs diff --git a/src/HaddockHtml.hs b/src/HaddockHtml.hs index e0c7121b..07d1dca8 100644 --- a/src/HaddockHtml.hs +++ b/src/HaddockHtml.hs @@ -37,6 +37,7 @@ import qualified Data.Map as Map hiding ( Map )  import GHC   import Name  import Module +import PackageConfig ( stringToPackageId )  import RdrName hiding ( Qual )  import SrcLoc     import FastString ( unpackFS ) @@ -73,8 +74,8 @@ ppHtml doctitle maybe_package hmods odir prologue maybe_html_help_format    when (not (isJust maybe_contents_url)) $       ppHtmlContents odir doctitle maybe_package          maybe_html_help_format maybe_index_url maybe_source_url maybe_wiki_url -	[ hmod { hmod_package = Nothing } | hmod <- visible_hmods ] -	-- we don't want to display the packages in a single-package contents +	visible_hmods +	False -- we don't want to display the packages in a single-package contents  	prologue    when (not (isJust maybe_index_url)) $  @@ -137,7 +138,8 @@ copyHtmlBits odir libdir maybe_css = do  	css_destination = pathJoin [odir, cssFile]  	copyLibFile f = do  	   copyFile (pathJoin [libhtmldir, f]) (pathJoin [odir, f]) -  +  print css_file  +  print css_destination    copyFile css_file css_destination    mapM_ copyLibFile [ iconFile, plusFile, minusFile, jsFile ] @@ -167,7 +169,7 @@ spliceURL maybe_file maybe_mod maybe_name url = run url    file = fromMaybe "" maybe_file    mod = case maybe_mod of            Nothing           -> "" -          Just mod -> moduleString mod   +          Just mod -> moduleString mod     (name, kind) =      case maybe_name of @@ -290,13 +292,13 @@ ppHtmlContents     -> Maybe String     -> SourceURLs     -> WikiURLs -   -> [HaddockModule] -> Maybe (GHC.HsDoc GHC.RdrName) +   -> [HaddockModule] -> Bool -> Maybe (GHC.HsDoc GHC.RdrName)     -> IO ()  ppHtmlContents odir doctitle    maybe_package maybe_html_help_format maybe_index_url -  maybe_source_url maybe_wiki_url modules prologue = do -  let tree = mkModuleTree  -         [(hmod_mod mod, hmod_package mod, toDescription mod) | mod <- modules] +  maybe_source_url maybe_wiki_url modules showPkgs prologue = do +  let tree = mkModuleTree showPkgs +         [(hmod_mod mod, toDescription mod) | mod <- modules]        html =   	header   		(documentCharacterEncoding +++ @@ -365,12 +367,14 @@ mkNode ss (Node s leaf pkg short ts) depth id = htmlNode  	Just doc -> tda [theclass "rdoc"] (origDocToHtml doc)      htmlModule  -      | leaf      = ppModule mdl +      | leaf      = ppModule (mkModule (stringToPackageId pkgName)  +                                       (mkModuleName mdl)) ""        | otherwise = toHtml s -    htmlPkg = case pkg of -      Nothing -> td << empty -      Just p  -> td << toHtml p +    -- ehm.. TODO: change the ModuleTree type +    (htmlPkg, pkgName) = case pkg of +      Nothing -> (td << empty, "") +      Just p  -> (td << toHtml p, p)      mdl = foldr (++) "" (s' : map ('.':) ss')      (s':ss') = reverse (s:ss) @@ -540,7 +544,7 @@ ppHtmlModule odir doctitle  	    hmodToHtml maybe_source_url maybe_wiki_url hmod </> s15 </>  	    footer           ) -  writeFile (pathJoin [odir, moduleHtmlFile mdl]) (renderHtml html) +  writeFile (pathJoin [odir, moduleHtmlFile mod]) (renderHtml html)  hmodToHtml :: SourceURLs -> WikiURLs -> HaddockModule -> HtmlTable  hmodToHtml maybe_source_url maybe_wiki_url hmod @@ -633,7 +637,7 @@ processExport summmary _ _ (ExportNoDecl2 _ y subs)  processExport _ _ _ (ExportDoc2 doc)    = docBox (docToHtml doc)  processExport _ _ _ (ExportModule2 mod) -  = declBox (toHtml "module" <+> ppModule (moduleString mod)) +  = declBox (toHtml "module" <+> ppModule mod "")  forSummary :: (ExportItem2 DocName) -> Bool  forSummary (ExportGroup2 _ _ _) = False @@ -716,7 +720,7 @@ ppTyVars tvs = map ppName (tyvarNames tvs)  tyvarNames = map f     where f x = let NoLink n = hsTyVarName (unLoc x) in n -ppFor summary links loc mbDoc (ForeignImport lname ltype _ _) +ppFor summary links loc mbDoc (ForeignImport lname ltype _)    = ppSig summary links loc mbDoc (TypeSig lname ltype)  ppFor _ _ _ _ _ = error "ppFor" @@ -1104,18 +1108,16 @@ ppBinder False nm = linkTarget nm +++ bold << ppBinder' nm  ppBinder' :: Name -> Html  ppBinder' name = toHtml (getOccString name) -linkId :: GHC.Module -> Maybe Name -> Html -> Html +linkId :: Module -> Maybe Name -> Html -> Html  linkId mod mbName = anchor ! [href hr]    where       hr = case mbName of -      Nothing   -> moduleHtmlFile modName -      Just name -> nameHtmlRef modName name -    modName = moduleString mod    +      Nothing   -> moduleHtmlFile mod +      Just name -> nameHtmlRef mod name -ppModule :: String -> Html -ppModule mdl = anchor ! [href ((moduleHtmlFile modname) ++ ref)] << toHtml mdl -  where  -        (modname,ref) = break (== '#') mdl +ppModule :: Module -> String -> Html +ppModule mod ref = anchor ! [href ((moduleHtmlFile mod) ++ ref)]  +                   << toHtml (moduleString mod)  -- -----------------------------------------------------------------------------  -- * Doc Markup @@ -1127,7 +1129,7 @@ parHtmlMarkup ppId = Markup {    markupString        = toHtml,    markupAppend        = (+++),    markupIdentifier    = tt . ppId . head, -  markupModule        = ppModule, +  markupModule        = \m -> ppModule (mkModuleNoPkg m) "",    markupEmphasis      = emphasize . toHtml,    markupMonospaced    = tt . toHtml,    markupUnorderedList = ulist . concatHtml . map (li <<), diff --git a/src/HaddockModuleTree.hs b/src/HaddockModuleTree.hs index ffc8b98e..e32cb960 100644 --- a/src/HaddockModuleTree.hs +++ b/src/HaddockModuleTree.hs @@ -1,15 +1,18 @@  module HaddockModuleTree ( ModuleTree(..), mkModuleTree ) where -import HaddockTypes ( DocName ) -import GHC          ( HsDoc, Name ) -import Module       ( Module, moduleString ) +import HaddockTypes  ( DocName ) +import GHC           ( HsDoc, Name ) +import Module        ( Module, moduleNameString, moduleName, modulePackageId ) +import PackageConfig ( packageIdString )  data ModuleTree = Node String Bool (Maybe String) (Maybe (HsDoc Name)) [ModuleTree] -mkModuleTree :: [(Module, Maybe String, Maybe (HsDoc Name))] -> [ModuleTree] -mkModuleTree mods =  -  foldr fn [] [ (splitModule mod, pkg, short) | (mod,pkg,short) <- mods ] -  where  +mkModuleTree :: Bool -> [(Module, Maybe (HsDoc Name))] -> [ModuleTree] +mkModuleTree showPkgs mods =  +  foldr fn [] [ (splitModule mod, modPkg mod, short) | (mod, short) <- mods ] +  where +    modPkg mod | showPkgs = Just (packageIdString (modulePackageId mod)) +               | otherwise = Nothing      fn (mod,pkg,short) trees = addToTrees mod pkg short trees  addToTrees :: [String] -> Maybe String -> Maybe (HsDoc Name) -> [ModuleTree] -> [ModuleTree] @@ -29,7 +32,7 @@ mkSubTree [s]    pkg short = [Node s True pkg short []]  mkSubTree (s:ss) pkg short = [Node s (null ss) Nothing Nothing (mkSubTree ss pkg short)]  splitModule :: Module -> [String] -splitModule mod = split (moduleString mod) +splitModule mod = split (moduleNameString (moduleName mod))    where split mod0 = case break (== '.') mod0 of       			(s1, '.':s2) -> s1 : split s2       			(s1, _)      -> [s1] diff --git a/src/HaddockRename.hs b/src/HaddockRename.hs index 8f7698ac..65af08e8 100644 --- a/src/HaddockRename.hs +++ b/src/HaddockRename.hs @@ -294,12 +294,12 @@ renameSig sig = case sig of        return (FixitySig lname' x)  -} -renameForD (ForeignImport lname ltype x y) = do +renameForD (ForeignImport lname ltype x) = do    ltype' <- renameLType ltype -  return (ForeignImport (keepL lname) ltype' x y) -renameForD (ForeignExport lname ltype x y) = do +  return (ForeignImport (keepL lname) ltype' x) +renameForD (ForeignExport lname ltype x) = do    ltype' <- renameLType ltype -  return (ForeignExport (keepL lname) ltype' x y) +  return (ForeignExport (keepL lname) ltype' x)  renameExportItem :: ExportItem2 Name -> RnM (ExportItem2 DocName)  renameExportItem item = case item of  diff --git a/src/HaddockTypes.hs b/src/HaddockTypes.hs index 5dace7b8..8eaf14b0 100644 --- a/src/HaddockTypes.hs +++ b/src/HaddockTypes.hs @@ -119,9 +119,7 @@ data HaddockModule = HM {  -- | The instances exported by this module -  hmod_instances          :: [Instance], - -  hmod_package            :: Maybe String +  hmod_instances          :: [Instance]  }  data DocMarkup id a = Markup { diff --git a/src/HaddockUtil.hs b/src/HaddockUtil.hs index 185a4cb7..7fe6f796 100644 --- a/src/HaddockUtil.hs +++ b/src/HaddockUtil.hs @@ -20,6 +20,7 @@ module HaddockUtil (    -- * Miscellaneous utilities    getProgramName, bye, die, dieMsg, noDieMsg, mapSnd, mapMaybeM, escapeStr, +  moduleString, mkModuleNoPkg,    -- * HTML cross reference mapping    html_xrefs_ref, @@ -41,6 +42,8 @@ import SrcLoc  import Name  import OccName  import Binary +import Module +import PackageConfig ( stringToPackageId )  import Control.Monad ( liftM, MonadPlus(..) )  import Data.Char ( isAlpha, isSpace, toUpper, ord ) @@ -144,15 +147,16 @@ isPathSeparator ch =    ch == '/'  #endif -moduleHtmlFile :: String -> FilePath +moduleHtmlFile :: Module -> FilePath  moduleHtmlFile mdl = -  case Map.lookup (mkModule mdl) html_xrefs of +  case Map.lookup mdl html_xrefs of      Nothing  -> mdl' ++ ".html"      Just fp0 -> pathJoin [fp0, mdl' ++ ".html"]    where -   mdl' = map (\c -> if c == '.' then '-' else c) mdl +   mdl' = map (\c -> if c == '.' then '-' else c)  +              (moduleNameString (moduleName mdl)) -nameHtmlRef :: String -> Name -> String	 +nameHtmlRef :: Module -> Name -> String	  nameHtmlRef mdl str = moduleHtmlFile mdl ++ '#':escapeStr (anchorNameStr str)  contentsHtmlFile, indexHtmlFile :: String @@ -224,6 +228,12 @@ escapeStr = flip escapeString unreserved  escapeStr = escapeURIString isUnreserved  #endif +moduleString :: Module -> String +moduleString = moduleNameString . moduleName  + +mkModuleNoPkg :: String -> Module +mkModuleNoPkg str = mkModule (stringToPackageId "") (mkModuleName str) +  -----------------------------------------------------------------------------  -- HTML cross references diff --git a/src/Main.hs b/src/Main.hs index c0e9745f..44d18f25 100644 --- a/src/Main.hs +++ b/src/Main.hs @@ -22,7 +22,7 @@ import Control.Monad ( when, liftM )  import Control.Monad.Writer ( Writer, runWriter, tell )  import Data.Char ( isSpace )  import Data.IORef ( writeIORef ) -import Data.List ( nub, (\\), foldl', sortBy, foldl1 ) +import Data.List ( nub, (\\), foldl', sortBy, foldl1, init, mapAccumL, find )  import Data.Maybe ( isJust, isNothing, maybeToList, listToMaybe )  --import Debug.Trace  import System.Console.GetOpt ( getOpt, usageInfo, ArgOrder(..), OptDescr(..), ArgDescr(..) ) @@ -39,12 +39,13 @@ import Data.Maybe  import Data.List ( nubBy )  import Data.FunctorM ( fmapM ) -import GHC +import qualified GHC ( init ) +import GHC hiding ( init )  import Outputable  import SrcLoc  import qualified Digraph as Digraph  import Name -import Module ( moduleString, mkModule )  +import Module ( mkModule )   import InstEnv  import Class  import TypeRep @@ -54,28 +55,104 @@ import PrelNames  import FastString  #define FSLIT(x) (mkFastString# (x#))  import DynFlags hiding ( Option ) +import StaticFlags ( parseStaticFlags )  import Unique ( mkUnique )  import Packages  -----------------------------------------------------------------------------  -- Top-level stuff -type CheckedMods = [(Module, FullyCheckedMod, FilePath)] +type CheckedMod = (Module, FullyCheckedMod, FilePath)  main :: IO ()  main = do    args <- getArgs    (libDir, rest) <- getLibDir args  -  (session, ghcFlags, nonGHCOpts) <- startGHC libDir rest -  (flags, args) <- parseHaddockOpts nonGHCOpts -  handleEagerFlags flags -  modules <- sortAndCheckModules session ghcFlags args -  (ifaces, htmls) <- getIfacesAndHtmls flags ghcFlags   +  let (isGHCMode, rest') = parseModeFlag rest +  (session, dynflags) <- startGHC libDir + +  (dynflags', rest'') <- if isGHCMode  +    then parseGHCFlags_GHCMode     dynflags rest'    +    else parseGHCFlags_HaddockMode dynflags rest'  + +  (flags, fileArgs) <- parseHaddockOpts rest'' + +  mbPkgName <- handleEagerFlags flags   +  let dynflags'' = case mbPkgName of +        Just name -> setPackageName name dynflags' +        Nothing -> dynflags' + +  setSessionDynFlags session dynflags'' +  +  modules <- sortAndCheckModules session dynflags' fileArgs +  (ifaces, htmls) <- getIfacesAndHtmls flags dynflags'    let (modss, envs) = unzip ifaces -  updateHTMLXRefs htmls modss +  updateHTMLXRefs htmls modss     -- TODO: continue to break up the run function into parts    run flags modules envs +parseModeFlag :: [String] -> (Bool, [String]) +parseModeFlag ("--ghc-flags":rest) = (True, rest) +parseModeFlag rest = (False, rest) + +parseGHCFlags_GHCMode :: DynFlags -> [String] -> IO (DynFlags, [String]) +parseGHCFlags_GHCMode dynflags args = do +  (dynflags', rest) <- parseDynamicFlags dynflags args +  rest' <- parseStaticFlags rest +  return (dynflags', rest') + +parseGHCFlags_HaddockMode = parseGHCFlags + +parseGHCFlags :: DynFlags -> [String] -> IO (DynFlags, [String]) +parseGHCFlags dynflags args = case args of +  [] -> return (dynflags, args) +  ("-g":rest) -> worker rest  +  (('-':'-':'g':'h':'c':'-':'f':'l':'a':'g':[]):rest) -> worker rest +  (x:xs) -> do  +    (flags, rest) <- parseGHCFlags dynflags xs +    return (flags, x:rest) +  where  +    worker rest = do +      (mbFlags, rest') <- parseGHCFlag dynflags rest +      case mbFlags of  +        Just flags -> parseGHCFlags flags rest' +        Nothing -> parseGHCFlags dynflags rest' +  +parseGHCFlag :: DynFlags -> [String] -> IO (Maybe DynFlags, [String]) +parseGHCFlag _ [] = die "No GHC flag supplied\n" +parseGHCFlag dynflags args = do +  mbDyn <- findDynamic +  case mbDyn of  +    Just (dynflags', rest) -> return (Just dynflags', rest)    +    Nothing -> do +      mbStat <- findStatic +      case mbStat of +        Just (_, rest) -> return (Nothing, rest) +        Nothing -> die ("Not a GHC flag: " ++ (head args) ++ "\n") +  where +    findDynamic = findFlag ( +        \xs ->  +        (do  +           (fs, xs') <- parseDynamicFlags dynflags xs +           if xs' /= xs then return (Just fs) else return Nothing +        )  +        `catch` (\_ -> return Nothing)  +      )  +    findStatic = findFlag (\xs -> do  +      xs' <- parseStaticFlags xs +      if xs /= xs' then return (Just ()) else return Nothing) + +    findFlag p = do  +      xs <- (sequence . snd) (mapAccumL (f p) [] args) +      case [ (x, index) | Just x <- xs | index <- [1..] ] of +        ((x, index):_) -> return (Just (x, drop index args)) +        _ -> return Nothing + +    f :: ([String] -> IO a) -> [String] -> String -> ([String], IO a) +    f parser previousArgs arg =  +      let args' = previousArgs ++ [arg] +      in (args', parser args') +  parseHaddockOpts :: [String] -> IO ([Flag], [String])  parseHaddockOpts words =    case getOpt Permute (options True) words of @@ -92,23 +169,20 @@ getLibDir ("-B":dir:rest) = return (dir, rest)  getLibDir (('-':'B':dir):rest) | not (null dir) = return (dir, rest)  getLibDir _ = die "Missing GHC lib dir option: -B <dir>\n" --- | Initialize GHC, parse the passed in strings and set the corresponding --- GHC flags (if any). Also add the -haddock flag. Return the Session handle --- and the strings that were not GHC flags. -startGHC :: String -> [String] -> IO (Session, DynFlags, [String]) -startGHC libDir possibleOpts = do +extractGHCFlags :: [Flag] -> [String] +extractGHCFlags flags = [ flag | Flag_GHCFlag flag <- flags ] + +startGHC :: String -> IO (Session, DynFlags) +startGHC libDir = do    GHC.init (Just libDir)    let ghcMode = JustTypecheck    session <- newSession ghcMode    flags   <- getSessionDynFlags session    flags'  <- initPackages flags -  (flags'', nonOpts) <- parseDynamicFlags flags' possibleOpts -  let flags''' = dopt_set flags'' Opt_Haddock  -  setSessionDynFlags session flags''' -  return (session, flags''', nonOpts) +  let flags'' = dopt_set flags' Opt_Haddock  +  return (session, flags'') -sortAndCheckModules :: Session -> DynFlags -> [FilePath] ->  -                       IO [(Module, FullyCheckedMod, FilePath)] +sortAndCheckModules :: Session -> DynFlags -> [FilePath] -> IO [CheckedMod]  sortAndCheckModules session flags files = defaultErrorHandler flags $ do     targets <- mapM (\s -> guessTarget s Nothing) files    setTargets session targets  @@ -124,7 +198,7 @@ sortAndCheckModules session flags files = defaultErrorHandler flags $ do                        modsum <- sortedModules,                         modSumFile modsum `elem` files ]    checkedMods <- mapM (\(mod, file) -> do -    mbMod <- checkModule session mod +    mbMod <- checkModule session (moduleName mod)      checkedMod <- case mbMod of         Just m  -> return m        Nothing -> die ("Failed to load module: " ++ moduleString mod) @@ -133,7 +207,7 @@ sortAndCheckModules session flags files = defaultErrorHandler flags $ do    where      ensureFullyChecked modules         | length modules' == length modules = return modules' -      | otherwise = die "Fail to check all modules properly\n"  +      | otherwise = die "Failed to check all modules properly\n"         where modules' = [ (mod, (a,b,c,d), f) |                            (mod, CheckedModule a (Just b) (Just c) (Just d), f)                            <- modules ]  @@ -179,6 +253,7 @@ data Flag    | Flag_IgnoreAllExports    | Flag_HideModule String    | Flag_UsePackage String +  | Flag_GHCFlag String    deriving (Eq)  options :: Bool -> [OptDescr Flag] @@ -244,32 +319,35 @@ options backwardsCompat =      Option [] ["hide"] (ReqArg Flag_HideModule "MODULE")  	"behave as if MODULE has the hide attribute",      Option [] ["use-package"] (ReqArg Flag_UsePackage "PACKAGE") -	"the modules being processed depend on PACKAGE" +	"the modules being processed depend on PACKAGE", +    Option ['g'] ["ghc-flag"] (ReqArg Flag_GHCFlag "FLAG") + 	"send a flag to the Glasgow Haskell Compiler"           ]  handleEagerFlags flags = do    whenFlag Flag_Help $ do      prog <- getProgramName      bye (usageInfo (usageHeader prog) (options False)) +    whenFlag Flag_Version $      bye ("Haddock version " ++ projectVersion ++            ", (c) Simon Marlow 2003; port to GHC-api by David Waern 2006\n") +    when ((Flag_GenIndex `elem` flags || Flag_GenContents `elem` flags)          && Flag_Html `elem` flags) $      die ("-h cannot be used with --gen-index or --gen-contents") + +  return (listToMaybe [str | Flag_Package str <- flags])    where       whenFlag flag action = when (flag `elem` flags) action  - -run :: [Flag] -> CheckedMods -> [Map Name Name] -> IO () +run :: [Flag] -> [CheckedMod] -> [Map Name Name] -> IO ()  run flags modules extEnvs = do    let      title = case [str | Flag_Heading str <- flags] of  		[] -> ""  		(t:_) -> t -    package = listToMaybe [str | Flag_Package str <- flags] -      maybe_source_urls = (listToMaybe [str | Flag_SourceBaseURL   str <- flags]                          ,listToMaybe [str | Flag_SourceModuleURL str <- flags]                          ,listToMaybe [str | Flag_SourceEntityURL str <- flags]) @@ -316,7 +394,7 @@ run flags modules extEnvs = do    prologue <- getPrologue flags    let  -    (modMap, messages) = runWriter (pass1 modules flags package)  +    (modMap, messages) = runWriter (pass1 modules flags)       haddockMods = catMaybes [ Map.lookup mod modMap | (mod,_,_) <- modules ]      homeEnv = buildGlobalDocEnv haddockMods      env = Map.unions (homeEnv:extEnvs) @@ -326,25 +404,28 @@ run flags modules extEnvs = do    mapM_ putStrLn messages    mapM_ putStrLn messages' -  let visibleMods = [ m | m <- haddockMods'', OptHide `notElem` (hmod_options m) ] +  let  +    visibleMods = [ m | m <- haddockMods'', OptHide `notElem` (hmod_options m) ] +    packageName = (Just . packageIdString . modulePackageId .  +                   hmod_mod . head) visibleMods    when (Flag_GenIndex `elem` flags) $ do -	ppHtmlIndex odir title package maybe_html_help_format +	ppHtmlIndex odir title packageName maybe_html_help_format                  maybe_contents_url maybe_source_urls maybe_wiki_urls                  visibleMods  	copyHtmlBits odir libdir css_file    when (Flag_GenContents `elem` flags && Flag_GenIndex `elem` flags) $ do -    ppHtmlHelpFiles title package visibleMods odir maybe_html_help_format [] +    ppHtmlHelpFiles title packageName visibleMods odir maybe_html_help_format []    when (Flag_GenContents `elem` flags) $ do -	ppHtmlContents odir title package maybe_html_help_format +	ppHtmlContents odir title packageName maybe_html_help_format  	               maybe_index_url maybe_source_urls maybe_wiki_urls -	               visibleMods prologue +	               visibleMods True prologue  	copyHtmlBits odir libdir css_file    when (Flag_Html `elem` flags) $ do -    ppHtml title package visibleMods odir +    ppHtml title packageName visibleMods odir                  prologue maybe_html_help_format                  maybe_source_urls maybe_wiki_urls                  maybe_contents_url maybe_index_url @@ -355,7 +436,7 @@ run flags modules extEnvs = do    -- dump an interface if requested    case dumpIface of      Nothing -> return () -    Just fn -> dumpInterfaces env (map hmod_mod visibleMods) fn +    Just fn -> dumpInterfaces env (map hmod_mod visibleMods) fn     where      pprList [] = []      pprList [x] = show x @@ -383,10 +464,9 @@ type FullyCheckedMod = (ParsedSource,  printEntity (DocEntity doc) = show doc  printEntity (DeclEntity name) = show $ ppr name defaultUserStyle -pass1 :: [(Module, FullyCheckedMod, FilePath)] -> [Flag] -> Maybe String -> ErrMsgM ModuleMap2 -pass1 modules flags package = worker modules (Map.empty) flags +pass1 :: [CheckedMod] -> [Flag] -> ErrMsgM ModuleMap2 +pass1 modules flags = worker modules (Map.empty) flags    where -    worker :: [(Module, FullyCheckedMod, FilePath)] -> ModuleMap2 -> [Flag] -> ErrMsgM ModuleMap2      worker [] moduleMap _ = return moduleMap      worker ((mod, checked_mod, filename):rest_modules) moduleMap flags = do @@ -405,7 +485,8 @@ pass1 modules flags package = worker modules (Map.empty) flags            theseEntityNames = entityNames entities             subNames = allSubnamesInGroup group            localNames = theseEntityNames ++ subNames -          -- guaranteed to be Just, since the module has been compiled from scratch  +          -- guaranteed to be Just, since the module has been compiled from  +          -- scratch             scopeNames = fromJust $ modInfoTopLevelScope moduleInfo             subMap = mk_sub_map_from_group group @@ -415,13 +496,17 @@ pass1 modules flags package = worker modules (Map.empty) flags            docMap = mkDocMap group             ignoreAllExports = Flag_IgnoreAllExports `elem` flags +   +          packageId = modulePackageId mod        theseVisibleNames <- visibleNames mod moduleMap localNames scopeNames  -                                        subMap exports opts localDeclMap +                                        subMap exports opts localDeclMap  +                                        packageId        exportItems <- mkExportItems moduleMap mod exportedNames -                                   exportedDeclMap localDeclMap subMap entities opts   -                                   exports ignoreAllExports docMap +                                   exportedDeclMap localDeclMap subMap entities  +                                   opts exports ignoreAllExports docMap  +                                   packageId       -- prune the export list to just those declarations that have       -- documentation, if the 'prune' option is on. @@ -447,8 +532,7 @@ pass1 modules flags package = worker modules (Map.empty) flags              hmod_exports            = exportedNames,              hmod_visible_exports    = theseVisibleNames,               hmod_exported_decl_map  = exportedDeclMap, -            hmod_instances          = instances, -            hmod_package            = package +            hmod_instances          = instances            }            moduleMap' = Map.insert mod haddock_module moduleMap @@ -493,7 +577,8 @@ mkDocMap group = Map.fromList (topDeclDocs ++ classMethDocs ++ recordFieldDocs)  collectDocs :: [DocEntity Name] -> [(Name, HsDoc Name)]  collectDocs entities = collect Nothing DocEmpty entities -collect :: Maybe (DocEntity Name) -> HsDoc Name -> [DocEntity Name] -> [(Name, HsDoc Name)] +collect :: Maybe (DocEntity Name) -> HsDoc Name -> [DocEntity Name] ->  +           [(Name, HsDoc Name)]  collect d doc_so_far [] =     case d of          Nothing -> [] @@ -592,8 +677,8 @@ getDeclFromGroup group name =        _      -> Nothing        where          matching = [ for | for <- lfors, forName (unLoc for) == name ] -        forName (ForeignExport n _ _ _) = unLoc n -        forName (ForeignImport n _ _ _) = unLoc n +        forName (ForeignExport n _ _) = unLoc n +        forName (ForeignImport n _ _) = unLoc n  parseIfaceOption :: String -> (FilePath,FilePath)  parseIfaceOption s =  @@ -613,9 +698,9 @@ getPrologue flags  	[filename] -> do  	   str <- readFile filename  	   case parseHaddockComment str of -		Left err -> dieMsg err +		Left err -> die err  		Right doc -> return (Just doc) -	_otherwise -> dieMsg "multiple -p/--prologue options" +	_otherwise -> die "multiple -p/--prologue options"  -- -----------------------------------------------------------------------------  -- Phase 2 @@ -675,10 +760,11 @@ mkExportItems  	-> Maybe [IE Name]  	-> Bool				-- --ignore-all-exports flag          -> Map Name (HsDoc Name) +        -> PackageId  	-> ErrMsgM [ExportItem2 Name]  mkExportItems mod_map this_mod exported_names exportedDeclMap localDeclMap sub_map entities -              opts maybe_exps ignore_all_exports docMap +              opts maybe_exps ignore_all_exports docMap packageId    | isNothing maybe_exps || ignore_all_exports || OptIgnoreExports `elem` opts      = everything_local_exported    | Just specs <- maybe_exps = do  @@ -692,7 +778,7 @@ mkExportItems mod_map this_mod exported_names exportedDeclMap localDeclMap sub_m      lookupExport (IEThingAbs t)        = declWith t      lookupExport (IEThingAll t)        = declWith t      lookupExport (IEThingWith t cs)    = declWith t -    lookupExport (IEModuleContents m)  = fullContentsOf m +    lookupExport (IEModuleContents m)  = fullContentsOf (mkModule packageId m)      lookupExport (IEGroup lev doc)     = return [ ExportGroup2 lev "" doc ]      lookupExport (IEDoc doc)           = return [ ExportDoc2 doc ]       lookupExport (IEDocNamed str) @@ -827,9 +913,10 @@ visibleNames :: Module               -> Maybe [IE Name]               -> [DocOption]               -> Map Name (LHsDecl Name) +             -> PackageId               -> ErrMsgM [Name] -visibleNames mdl modMap localNames scope subMap maybeExps opts declMap +visibleNames mdl modMap localNames scope subMap maybeExps opts declMap packageId    -- if no export list, just return all local names     | Nothing <- maybeExps         = return (filter hasDecl localNames)    | OptIgnoreExports `elem` opts = return localNames @@ -853,18 +940,22 @@ visibleNames mdl modMap localNames scope subMap maybeExps opts declMap      IEThingWith t cs -> return (t : cs)      IEModuleContents m -	| m == mdl -> return localNames  -	| otherwise -> -	  case Map.lookup m modMap of +	| mkModule packageId m == mdl -> return localNames  +	| otherwise -> let m' = mkModule packageId m in +	  case Map.lookup m' modMap of  	    Just mod  		| OptHide `elem` hmod_options mod ->  		    return (filter (`elem` scope) (hmod_exports mod))  		| otherwise -> return []  	    Nothing -		-> tell ["Can not reexport a package module"] >> return [] - +		-> tell (exportModuleMissingErr mdl m') >> return [] +        _ -> return [] +exportModuleMissingErr this mdl  +  = ["Warning: in export list of " ++ show (moduleString this) +	 ++ ": module not found: " ++ show (moduleString mdl)] +  -- for a given entity, find all the names it "owns" (ie. all the  -- constructors and field names of a tycon, or all the methods of a  -- class). @@ -1046,9 +1137,12 @@ type ErrMsgM a = Writer [ErrMsg] a  getPackageFiles :: DynFlags -> IO [(String, String)]  getPackageFiles dynflags = do    packages <- getExplicitPackagesAnd dynflags [] -  mbFiles <- mapM check packages +  mbFiles <- mapM check (filter notRTS packages)    return [ pair | Just pair <- mbFiles ]    where +    -- no better way to do this? +    notRTS p = pkgName (package p) /= packageIdString rtsPackageId   +      check p = (do        pair <- check' p        return (Just pair)) `catch` (\e -> do   @@ -1080,7 +1174,7 @@ getPackageFiles dynflags = do  -- -----------------------------------------------------------------------------  -- The interface file format --- ehhm. this is a hack... +-- ehhm. this is a temporary hack...  thisFormatVersion :: FormatVersion  thisFormatVersion = mkFormatVersion 3 @@ -1155,9 +1249,13 @@ instance Binary OccName where      return (mkOccName (decodeNS ns) string)  instance Binary Module where -  put_ bh m = put_ bh (moduleString m) -  get bh = do m <- get bh; return (mkModule m) - +  put_ bh m = do +    put_ bh (moduleString m) +    put_ bh ((packageIdString . modulePackageId) m) +  get bh = do  +    m <- get bh +    p <- get bh +    return (mkModule (stringToPackageId p) (mkModuleName m))  {-  thisFormatVersion :: FormatVersion  thisFormatVersion = mkFormatVersion 2  | 
