diff options
-rw-r--r-- | src/Haddock/InterfaceFile.hs | 16 | ||||
-rw-r--r-- | src/Haddock/Options.hs | 21 | ||||
-rw-r--r-- | src/Haddock/Packages.hs | 22 | ||||
-rw-r--r-- | src/Main.hs | 17 |
4 files changed, 60 insertions, 16 deletions
diff --git a/src/Haddock/InterfaceFile.hs b/src/Haddock/InterfaceFile.hs index 6441c503..7f2fd6f4 100644 --- a/src/Haddock/InterfaceFile.hs +++ b/src/Haddock/InterfaceFile.hs @@ -45,15 +45,19 @@ data InterfaceMod = InterfaceMod { } data InterfaceFile = InterfaceFile { - ifLinkEnv :: LinkEnv --- ifModules :: [InterfaceMod] + ifLinkEnv :: LinkEnv, + ifModules :: [Module] } instance Binary InterfaceFile where - put_ bh (InterfaceFile x) = put_ bh (Map.toList x) - get bh = do - env <- get bh - return (InterfaceFile (Map.fromList env)) + put_ bh (InterfaceFile env mods) = do + put_ bh (Map.toList env) + put_ bh mods + + get bh = do + env <- get bh + mods <- get bh + return (InterfaceFile (Map.fromList env) mods) iface2interface iface = InterfaceMod { imModule = ifaceMod iface, diff --git a/src/Haddock/Options.hs b/src/Haddock/Options.hs index 89850f9c..152b30d4 100644 --- a/src/Haddock/Options.hs +++ b/src/Haddock/Options.hs @@ -9,7 +9,8 @@ module Haddock.Options ( parseHaddockOpts, Flag(..), getUsage, - makeGhcFlags + getGhcFlags, + getIfacePairs ) where @@ -36,14 +37,26 @@ parseHaddockOpts words = throwE (concat errors ++ usage) -makeGhcFlags :: [Flag] -> [String] -makeGhcFlags flags = [ option | Flag_OptGhc option <- flags ] +getGhcFlags :: [Flag] -> [String] +getGhcFlags flags = [ option | Flag_OptGhc option <- flags ] + + +getIfacePairs :: [Flag] -> [(FilePath, FilePath)] +getIfacePairs flags = [ parseIfaceOption s | Flag_ReadInterface s <- flags ] + + +parseIfaceOption :: String -> (FilePath, FilePath) +parseIfaceOption s = + case break (==',') s of + (fpath,',':file) -> (fpath, file) + (file, _) -> ("", file) data Flag = Flag_CSS String | Flag_Debug -- | Flag_DocBook + | Flag_ReadInterface String | Flag_DumpInterface String | Flag_Heading String | Flag_Html @@ -83,6 +96,8 @@ options backwardsCompat = "directory in which to put the output files", Option ['l'] ["lib"] (ReqArg Flag_Lib "DIR") "location of Haddock's auxiliary files", + Option ['i'] ["read-interface"] (ReqArg Flag_ReadInterface "FILE") + "read an interface from FILE", Option ['D'] ["dump-interface"] (ReqArg Flag_DumpInterface "FILE") "interface file name", -- Option ['S'] ["docbook"] (NoArg Flag_DocBook) diff --git a/src/Haddock/Packages.hs b/src/Haddock/Packages.hs index d722bdfe..ba3ee841 100644 --- a/src/Haddock/Packages.hs +++ b/src/Haddock/Packages.hs @@ -8,6 +8,7 @@ module Haddock.Packages ( HaddockPackage(..), getHaddockPackages, + getHaddockPackages', combineLinkEnvs ) where @@ -15,6 +16,7 @@ module Haddock.Packages ( import Haddock.Types import Haddock.Exception import Haddock.InterfaceFile +import qualified Distribution.Haddock as D import Data.Maybe import qualified Data.Map as Map @@ -38,6 +40,24 @@ data HaddockPackage = HaddockPackage { } +getHaddockPackages' :: [(FilePath, FilePath)] -> IO [HaddockPackage] +getHaddockPackages' pairs = do + mbPackages <- mapM tryReadIface pairs + return (catMaybes mbPackages) + where + -- try to get a HaddockPackage, warn if we can't + tryReadIface (html, iface) = do + eIface <- D.readInterfaceFile iface + case eIface of + Left err -> do + putStrLn ("Warning: Cannot read " ++ iface ++ ":") + putStrLn (" " ++ show err) + putStrLn "Skipping this interface." + return Nothing + Right iface -> return $ Just $ + HaddockPackage (ifModules iface) (ifLinkEnv iface) html + + -- | Try to read the installed Haddock information for the given packages, -- if it exists. Print a warning on stdout if it couldn't be found for a -- package. @@ -65,7 +85,7 @@ getPackage pkgInfo = do iface <- readInterfaceFile ifacePath return $ HaddockPackage { - pdModules = packageModules pkgInfo, + pdModules = ifModules iface, pdLinkEnv = ifLinkEnv iface, pdHtmlPath = html } diff --git a/src/Main.hs b/src/Main.hs index c900529c..8ddea3e9 100644 --- a/src/Main.hs +++ b/src/Main.hs @@ -105,14 +105,18 @@ main = handleTopExceptions $ do libDir <- handleEasyFlags flags fileArgs -- initialize GHC - let ghcFlags = makeGhcFlags flags + let ghcFlags = getGhcFlags flags (session, dynflags) <- startGhc libDir ghcFlags -- get the -use-package packages, load them in GHC, -- and try to get the corresponding installed HaddockPackages let usePackages = [ pkg | Flag_UsePackage pkg <- flags ] pkgInfos <- loadPackages session usePackages - packages <- getHaddockPackages pkgInfos + packages'' <- getHaddockPackages pkgInfos + + -- get packages via --read-interface + packages' <- getHaddockPackages' (getIfacePairs flags) + let packages = packages'' ++ packages' -- typecheck argument modules using GHC modules <- typecheckFiles session fileArgs @@ -129,7 +133,7 @@ main = handleTopExceptions $ do render flags interfaces -- last but not least, dump the interface file! - dumpInterfaceFile homeLinks flags + dumpInterfaceFile (map ghcModule modules) homeLinks flags ------------------------------------------------------------------------------- @@ -217,14 +221,15 @@ render flags interfaces = do ------------------------------------------------------------------------------- -dumpInterfaceFile :: LinkEnv -> [Flag] -> IO () -dumpInterfaceFile homeLinks flags = +dumpInterfaceFile :: [Module] -> LinkEnv -> [Flag] -> IO () +dumpInterfaceFile modules homeLinks flags = case [str | Flag_DumpInterface str <- flags] of [] -> return () fs -> let filename = last fs in writeInterfaceFile filename ifaceFile where ifaceFile = InterfaceFile { - ifLinkEnv = homeLinks + ifModules = modules, + ifLinkEnv = homeLinks } |