diff options
Diffstat (limited to 'haddock-api')
| -rw-r--r-- | haddock-api/haddock-api.cabal | 1 | ||||
| -rw-r--r-- | haddock-api/src/Haddock.hs | 7 | ||||
| -rw-r--r-- | haddock-api/src/Haddock/Interface/Json.hs | 109 | ||||
| -rw-r--r-- | haddock-api/src/Haddock/Options.hs | 6 | 
4 files changed, 123 insertions, 0 deletions
| diff --git a/haddock-api/haddock-api.cabal b/haddock-api/haddock-api.cabal index ef4bb98c..d38e9149 100644 --- a/haddock-api/haddock-api.cabal +++ b/haddock-api/haddock-api.cabal @@ -73,6 +73,7 @@ library      Haddock.Interface.Rename      Haddock.Interface.Create      Haddock.Interface.AttachInstances +    Haddock.Interface.Json      Haddock.Interface.LexParseRn      Haddock.Interface.ParseModuleHeader      Haddock.Interface.Specialize diff --git a/haddock-api/src/Haddock.hs b/haddock-api/src/Haddock.hs index 57ea5fea..554cb416 100644 --- a/haddock-api/src/Haddock.hs +++ b/haddock-api/src/Haddock.hs @@ -32,6 +32,7 @@ import Haddock.Backends.LaTeX  import Haddock.Backends.Hoogle  import Haddock.Backends.Hyperlinker  import Haddock.Interface +import Haddock.Interface.Json  import Haddock.Parser  import Haddock.Types  import Haddock.Version @@ -68,6 +69,7 @@ import System.Directory (doesDirectoryExist)  import GHC hiding (verbosity)  import Config  import DynFlags hiding (projectVersion, verbosity) +import ErrUtils  import Packages  import Panic (handleGhcException)  import Module @@ -164,6 +166,11 @@ haddockWithGhc ghc args = handleTopExceptions $ do      dflags <- getDynFlags +    forM_ (optShowInterfaceFile flags) $ \path -> liftIO $ do +      mIfaceFile <- readInterfaceFiles freshNameCache [(("", Nothing), path)] +      forM_ mIfaceFile $ \(_, ifaceFile) -> do +        putMsg dflags (renderJson (jsonInterfaceFile ifaceFile)) +      if not (null files) then do        (packages, ifaces, homeLinks) <- readPackagesAndProcessModules flags files diff --git a/haddock-api/src/Haddock/Interface/Json.hs b/haddock-api/src/Haddock/Interface/Json.hs new file mode 100644 index 00000000..9a569204 --- /dev/null +++ b/haddock-api/src/Haddock/Interface/Json.hs @@ -0,0 +1,109 @@ +{-# LANGUAGE RecordWildCards #-} +module Haddock.Interface.Json ( +    jsonInstalledInterface +  , jsonInterfaceFile +  , renderJson +  ) where + +import BasicTypes +import Json +import Module +import Name +import Outputable + +import Control.Arrow +import Data.Map (Map) +import Data.Bifunctor +import qualified Data.Map as Map + +import Haddock.Types +import Haddock.InterfaceFile + +jsonInterfaceFile :: InterfaceFile -> JsonDoc +jsonInterfaceFile InterfaceFile{..} = +  jsonObject [ ("link_env" , jsonMap nameStableString (jsonString . moduleNameString . moduleName) ifLinkEnv) +             , ("inst_ifaces", jsonArray (map jsonInstalledInterface ifInstalledIfaces)) +             ] + +jsonInstalledInterface :: InstalledInterface -> JsonDoc +jsonInstalledInterface InstalledInterface{..} = jsonObject properties +  where +    properties = +      [ ("module"          , jsonModule instMod) +      , ("is_sig"          , jsonBool instIsSig) +      , ("info"            , jsonHaddockModInfo instInfo) +      , ("doc_map"         , jsonMap nameStableString jsonMDoc instDocMap) +      , ("arg_map"         , jsonMap nameStableString (jsonMap show jsonMDoc) instArgMap) +      , ("exports"         , jsonArray (map jsonName instExports)) +      , ("visible_exports" , jsonArray (map jsonName instVisibleExports)) +      , ("options"         , jsonArray (map (jsonString . show) instOptions)) +      , ("sub_map"         , jsonMap nameStableString (jsonArray . map jsonName) instSubMap) +      , ("bundled_patsyns" , jsonMap nameStableString (jsonArray . map jsonName) instBundledPatSynMap) +      , ("fix_map"         , jsonMap nameStableString jsonFixity instFixMap) +      ] + +jsonHaddockModInfo :: HaddockModInfo Name -> JsonDoc +jsonHaddockModInfo HaddockModInfo{..} = +  jsonObject [ ("description" , jsonMaybe jsonDoc hmi_description) +             , ("copyright"   , jsonMaybe jsonString hmi_copyright) +             , ("maintainer"  , jsonMaybe jsonString hmi_maintainer) +             , ("stability"   , jsonMaybe jsonString hmi_stability) +             , ("protability" , jsonMaybe jsonString hmi_portability) +             , ("safety"      , jsonMaybe jsonString hmi_safety) +             , ("language"    , jsonMaybe (jsonString . show) hmi_language) +             , ("extensions"  , jsonArray (map (jsonString . show) hmi_extensions)) +             ] + +jsonMap :: (a -> String) -> (b -> JsonDoc) -> Map a b -> JsonDoc +jsonMap f g = jsonObject . map (f *** g) . Map.toList + +jsonMDoc :: MDoc Name -> JsonDoc +jsonMDoc MetaDoc{..} = +  jsonObject [ ("meta", jsonObject [("version", jsonMaybe (jsonString . show) (_version _meta))]) +             , ("doc",  jsonDoc _doc) +             ] + +jsonDoc :: Doc Name -> JsonDoc +jsonDoc doc = jsonString (show (bimap (moduleNameString . fst) nameStableString doc)) + +jsonModule :: Module -> JsonDoc +jsonModule = JSString . moduleStableString + +jsonName :: Name -> JsonDoc +jsonName = JSString . nameStableString + +jsonFixity :: Fixity -> JsonDoc +jsonFixity (Fixity _ prec dir) = +  jsonObject [ ("prec"      , jsonInt prec) +             , ("direction" , jsonFixityDirection dir) +             ] + +jsonFixityDirection :: FixityDirection -> JsonDoc +jsonFixityDirection InfixL = jsonString "infixl" +jsonFixityDirection InfixR = jsonString "infixr" +jsonFixityDirection InfixN = jsonString "infix" + +renderJson :: JsonDoc -> SDoc +renderJson = renderJSON + +jsonMaybe :: (a -> JsonDoc) -> Maybe a -> JsonDoc +jsonMaybe = maybe jsonNull + +jsonString :: String -> JsonDoc +jsonString = JSString + +jsonObject :: [(String, JsonDoc)] -> JsonDoc +jsonObject = JSObject + +jsonArray :: [JsonDoc] -> JsonDoc +jsonArray = JSArray + +jsonNull :: JsonDoc +jsonNull = JSNull + +jsonInt :: Int -> JsonDoc +jsonInt = JSInt + +jsonBool :: Bool -> JsonDoc +jsonBool = JSBool + diff --git a/haddock-api/src/Haddock/Options.hs b/haddock-api/src/Haddock/Options.hs index 0449c829..d73d1a79 100644 --- a/haddock-api/src/Haddock/Options.hs +++ b/haddock-api/src/Haddock/Options.hs @@ -25,6 +25,7 @@ module Haddock.Options (    sourceUrls,    wikiUrls,    optDumpInterfaceFile, +  optShowInterfaceFile,    optLaTeXStyle,    optMathjax,    qualification, @@ -53,6 +54,7 @@ data Flag  --  | Flag_DocBook    | Flag_ReadInterface String    | Flag_DumpInterface String +  | Flag_ShowInterface String    | Flag_Heading String    | Flag_Html    | Flag_Hoogle @@ -112,6 +114,8 @@ options backwardsCompat =        "read an interface from FILE",      Option ['D']  ["dump-interface"] (ReqArg Flag_DumpInterface "FILE")        "write the resulting interface to FILE", +    Option []     ["show-interface"] (ReqArg Flag_ShowInterface "FILE") +      "print the interface in a human readable form",  --    Option ['S']  ["docbook"]  (NoArg Flag_DocBook)  --  "output in DocBook XML",      Option ['h']  ["html"]     (NoArg Flag_Html) @@ -270,6 +274,8 @@ wikiUrls flags =  optDumpInterfaceFile :: [Flag] -> Maybe FilePath  optDumpInterfaceFile flags = optLast [ str | Flag_DumpInterface str <- flags ] +optShowInterfaceFile :: [Flag] -> Maybe FilePath +optShowInterfaceFile flags = optLast [ str | Flag_ShowInterface str <- flags ]  optLaTeXStyle :: [Flag] -> Maybe String  optLaTeXStyle flags = optLast [ str | Flag_LaTeXStyle str <- flags ] | 
