diff --git a/doc/markup.rst b/doc/markup.rst index a00caba66a9343d27065d37912af853fea666250..a587948bc4d2d1b6821615f387f3fbcb3f141a68 100644 --- a/doc/markup.rst +++ b/doc/markup.rst @@ -1263,3 +1263,14 @@ subject to change in the future per user feedback. :: -- Some comment -- -- @since 1.2.3 + +Additionally, as of GHC 9.10 ``@since`` in docstrings following export list items: :: + + module Mod + ( wombat -- ^ @since 2.0 + ) where ... + +This has the function of superceding the ``@since`` annotation given at the +definition site of ``wombat`` and can be used to record changes in the +module exports, particularly when a declaration is re-exported from another +module. diff --git a/haddock-api/src/Haddock/Backends/Xhtml/DocMarkup.hs b/haddock-api/src/Haddock/Backends/Xhtml/DocMarkup.hs index 91a5b1201f8602f370b1d9ff739d3027bab2f6dd..d3282ef69bc11afe207593ff3322a64579c4d430 100644 --- a/haddock-api/src/Haddock/Backends/Xhtml/DocMarkup.hs +++ b/haddock-api/src/Haddock/Backends/Xhtml/DocMarkup.hs @@ -198,14 +198,17 @@ hackMarkup fmt' currPkg h' = in (markupAppend fmt x y, m ++ m') renderMeta :: DocMarkup id Html -> Maybe Package -> Meta -> Html -renderMeta fmt currPkg (Meta { _version = Just x, _package = pkg }) = +renderMeta fmt currPkg m = + maybe noHtml (renderMetaSince fmt currPkg) (_metaSince m) + +renderMetaSince :: DocMarkup id Html -> Maybe Package -> MetaSince -> Html +renderMetaSince fmt currPkg (MetaSince { sincePackage = pkg, sinceVersion = ver }) = markupParagraph fmt . markupEmphasis fmt . toHtml $ - "Since: " ++ formatPkgMaybe pkg ++ formatVersion x + "Since: " ++ formatPkgMaybe pkg ++ formatVersion ver where formatVersion v = concat . intersperse "." $ map show v formatPkgMaybe (Just p) | Just p /= currPkg = p ++ "-" formatPkgMaybe _ = "" -renderMeta _ _ _ = noHtml -- | Goes through 'hackMarkup' to generate the 'Html' rather than -- skipping straight to 'markup': this allows us to employ XHtml diff --git a/haddock-api/src/Haddock/Interface/Create.hs b/haddock-api/src/Haddock/Interface/Create.hs index 73a9bdc3411308975c86d9552ad1a4189a3ff71a..29a457d1413b4f5b97a43c87fdb60cc62acd6214 100644 --- a/haddock-api/src/Haddock/Interface/Create.hs +++ b/haddock-api/src/Haddock/Interface/Create.hs @@ -70,7 +70,7 @@ import GHC.Builtin.Names import GHC.Builtin.Types import GHC.Builtin.Types.Prim import GHC.Types.SafeHaskell -import Control.Arrow ((&&&)) +import Control.Arrow ((&&&), first) import GHC.Iface.Syntax createInterface1 @@ -157,6 +157,8 @@ createInterface1 flags unit_state mod_sum mod_iface ifaces inst_ifaces (instance let docsDecls = Map.fromList $ UniqMap.nonDetUniqMapToList mod_iface_docs.docs_decls traverse (processDocStringsParas dflags pkg_name) docsDecls + exportsSinceMap <- mkExportSinceMap dflags pkg_name mod_iface_docs + (argMap :: Map Name (Map Int (MDoc Name))) <- do let docsArgs = Map.fromList $ UniqMap.nonDetUniqMapToList mod_iface_docs.docs_args (result :: Map Name (IntMap (MDoc Name))) <- @@ -188,6 +190,7 @@ createInterface1 flags unit_state mod_sum mod_iface ifaces inst_ifaces (instance pkg_name mdl transitiveWarnings + exportsSinceMap docMap argMap fixities @@ -246,6 +249,29 @@ createInterface1 flags unit_state mod_sum mod_iface ifaces inst_ifaces (instance -- funAvail = [ AvailTC fUNTyConName [fUNTyConName] ] +------------------------------------------------------------------------------- +-- Export @since annotations +------------------------------------------------------------------------------- +mkExportSinceMap + :: forall m. (MonadIO m) + => DynFlags + -> Maybe Package + -> Docs + -> IfM m (Map Name MetaSince) +mkExportSinceMap dflags pkg_name docs = do + Map.unions <$> traverse processExportDoc (UniqMap.nonDetUniqMapToList (docs_exports docs)) + where + processExportDoc :: (Name, HsDoc GhcRn) -> IfM m (Map Name MetaSince) + processExportDoc (nm, doc) = do + mdoc <- processDocStringsParas dflags pkg_name [doc] + case _doc mdoc of + DocEmpty -> return () + _ -> warn "Export docstrings may only contain @since annotations" + case _metaSince (_meta mdoc) of + Nothing -> return mempty + Just since -> return $ Map.singleton nm since + + ------------------------------------------------------------------------------- -- Warnings ------------------------------------------------------------------------------- @@ -294,6 +320,7 @@ parseWarning dflags w = case w of format x bs = DocWarning . DocParagraph . DocAppend (DocString x) <$> foldrM (\doc rest -> docAppend <$> processDocString dflags doc <*> pure rest) DocEmpty bs + ------------------------------------------------------------------------------- -- Doc options -- @@ -352,6 +379,7 @@ mkExportItems -> Maybe Package -- this package -> Module -- this module -> WarningMap + -> Map Name MetaSince -> DocMap Name -> ArgMap Name -> FixMap @@ -362,7 +390,8 @@ mkExportItems -> OccEnv Name -> IfM m [ExportItem GhcRn] mkExportItems - prr modMap pkgName thisMod warnings docMap argMap fixMap namedChunks dsItems + prr modMap pkgName thisMod warnings exportSinceMap + docMap argMap fixMap namedChunks dsItems instIfaceMap dflags defMeths = concat <$> traverse lookupExport dsItems where @@ -395,7 +424,7 @@ mkExportItems availExport :: MonadIO m => AvailInfo -> IfM m [ExportItem GhcRn] availExport avail = - availExportItem prr modMap thisMod warnings + availExportItem prr modMap thisMod warnings exportSinceMap docMap argMap fixMap instIfaceMap dflags avail defMeths unrestrictedModExports @@ -451,6 +480,7 @@ availExportItem -> IfaceMap -> Module -- this module -> WarningMap + -> Map Name MetaSince -- ^ export \@since declarations -> Map Name (MDoc Name) -- docs (keyed by 'Name's) -> ArgMap Name -- docs for arguments (keyed by 'Name's) -> FixMap @@ -460,7 +490,7 @@ availExportItem -> OccEnv Name -- Default methods -> IfM m [ExportItem GhcRn] availExportItem - prr modMap thisMod warnings docMap argMap fixMap instIfaceMap dflags + prr modMap thisMod warnings exportSinceMap docMap argMap fixMap instIfaceMap dflags availInfo defMeths = declWith availInfo @@ -479,7 +509,9 @@ availExportItem then pure (lookupDocs avail warnings docMap argMap defMeths) else case Map.lookup tmod modMap of Just iface -> - pure (lookupDocs avail warnings (ifaceDocMap iface) (ifaceArgMap iface) (mkOccEnv (ifaceDefMeths iface))) + pure + $ first (applyExportSince exportSinceMap t) + $ lookupDocs avail warnings (ifaceDocMap iface) (ifaceArgMap iface) (mkOccEnv (ifaceDefMeths iface)) Nothing -> -- We try to get the subs and docs -- from the installed .haddock file for that package. @@ -493,7 +525,9 @@ availExportItem let subs_ = availNoDocs avail pure (noDocForDecl, subs_) Just instIface -> - pure (lookupDocs avail warnings (instDocMap instIface) (instArgMap instIface) (mkOccEnv (instDefMeths instIface))) + pure + $ first (applyExportSince exportSinceMap t) + $ lookupDocs avail warnings (instDocMap instIface) (instArgMap instIface) (mkOccEnv (instDefMeths instIface)) -- Tries 'extractDecl' first then falls back to 'hiDecl' if that fails availDecl :: Name -> LHsDecl GhcRn -> IfM m (LHsDecl GhcRn) @@ -587,6 +621,22 @@ availNoDocs :: AvailInfo -> [(Name, DocForDecl Name)] availNoDocs avail = zip (availSubordinates avail) (repeat noDocForDecl) +-- | Override 'MetaSince' of a declaration with that of its export if appropriate. +applyExportSince + :: Map Name MetaSince + -> Name + -> DocForDecl Name + -> DocForDecl Name +applyExportSince exportSinceMap nm (dd, argDoc) + | Just since <- Map.lookup nm exportSinceMap = + let dd' = dd { documentationDoc = setMDocSince (documentationDoc dd) } + setMDocSince :: Maybe (MDoc name) -> Maybe (MDoc name) + setMDocSince (Just (MetaDoc meta doc)) = Just $ MetaDoc (meta {_metaSince = Just since}) doc + setMDocSince Nothing = Just $ MetaDoc (Meta {_metaSince = Just since}) DocEmpty + in (dd', argDoc) +applyExportSince _ _ dd = dd + + hiDecl :: MonadIO m => DynFlags @@ -616,6 +666,7 @@ lookupDocs -> ArgMap Name -> OccEnv Name -> (DocForDecl Name, [(Name, DocForDecl Name)]) + -- ^ documentation for declaration and its subordinates lookupDocs avail warningMap docMap argMap def_meths_env = let n = availName avail diff --git a/haddock-api/src/Haddock/Interface/Json.hs b/haddock-api/src/Haddock/Interface/Json.hs index 8b27a9821d18f4f7d6c00966b99c403c05edd1f7..c4cd3b39813c3e0002e762e05458d28d9d92fbcc 100644 --- a/haddock-api/src/Haddock/Interface/Json.hs +++ b/haddock-api/src/Haddock/Interface/Json.hs @@ -56,7 +56,7 @@ jsonMap f g = jsonObject . map (f *** g) . Map.toList jsonMDoc :: MDoc Name -> JsonDoc jsonMDoc MetaDoc{..} = - jsonObject [ ("meta", jsonObject [("version", jsonMaybe (jsonString . show) (_version _meta))]) + jsonObject [ ("meta", jsonObject [("version", jsonMaybe (jsonString . show . sinceVersion) (_metaSince _meta))]) , ("document", jsonDoc _doc) ] diff --git a/haddock-api/src/Haddock/InterfaceFile.hs b/haddock-api/src/Haddock/InterfaceFile.hs index ac6aacaecc71945261f60d7bc155a956b113d8d7..128fa34737d988859d10bd45591d992d413a65d3 100644 --- a/haddock-api/src/Haddock/InterfaceFile.hs +++ b/haddock-api/src/Haddock/InterfaceFile.hs @@ -438,13 +438,20 @@ instance Binary a => Binary (TableCell a) where return (TableCell i j c) instance Binary Meta where - put_ bh (Meta v p) = do + put_ bh (Meta since) = do + put_ bh since + get bh = do + since <- get bh + return (Meta since) + +instance Binary MetaSince where + put_ bh (MetaSince v p) = do put_ bh v put_ bh p get bh = do v <- get bh p <- get bh - return (Meta v p) + return (MetaSince v p) instance (Binary mod, Binary id) => Binary (MetaDoc mod id) where put_ bh MetaDoc { _meta = m, _doc = d } = do diff --git a/haddock-api/src/Haddock/Types.hs b/haddock-api/src/Haddock/Types.hs index 9aa7730740e206fc100c5e04fbe79b0b63416050..997ebb24a954dbc9fe9ab1d1dbb8e4142ada9caa 100644 --- a/haddock-api/src/Haddock/Types.hs +++ b/haddock-api/src/Haddock/Types.hs @@ -594,8 +594,11 @@ type MDoc id = MetaDoc (Wrap (ModuleName, OccName)) (Wrap id) type DocMarkup id a = DocMarkupH (Wrap (ModuleName, OccName)) id a +instance NFData MetaSince where + rnf (MetaSince v p) = v `deepseq` p `deepseq` () + instance NFData Meta where - rnf (Meta v p) = v `deepseq` p `deepseq` () + rnf (Meta since) = since `deepseq` () instance NFData id => NFData (MDoc id) where rnf (MetaDoc m d) = m `deepseq` d `deepseq` () diff --git a/haddock-library/src/Documentation/Haddock/Doc.hs b/haddock-library/src/Documentation/Haddock/Doc.hs index 33988e0b732db4c8d4928ede1676d67aff2e1536..47147e7b30206a0689a15e050bdeb40710d37766 100644 --- a/haddock-library/src/Documentation/Haddock/Doc.hs +++ b/haddock-library/src/Documentation/Haddock/Doc.hs @@ -9,7 +9,7 @@ module Documentation.Haddock.Doc , metaConcat ) where -import Control.Applicative ((<|>), empty) +import Control.Applicative ((<|>)) import Documentation.Haddock.Types import Data.Char (isSpace) @@ -35,13 +35,13 @@ metaDocAppend (MetaDoc { _meta = m, _doc = d }) -- | This is not a monoidal append, it uses '<|>' for the '_version' and -- '_package'. metaAppend :: Meta -> Meta -> Meta -metaAppend (Meta v1 p1) (Meta v2 p2) = Meta (v1 <|> v2) (p1 <|> p2) +metaAppend (Meta v1) (Meta v2) = Meta (v1 <|> v2) emptyMetaDoc :: MetaDoc mod id emptyMetaDoc = MetaDoc { _meta = emptyMeta, _doc = DocEmpty } emptyMeta :: Meta -emptyMeta = Meta empty empty +emptyMeta = Meta Nothing docAppend :: DocH mod id -> DocH mod id -> DocH mod id docAppend (DocDefList ds1) (DocDefList ds2) = DocDefList (ds1++ds2) diff --git a/haddock-library/src/Documentation/Haddock/Parser.hs b/haddock-library/src/Documentation/Haddock/Parser.hs index 19c9272197855042e226a8e217d91dbcf9239378..031de4287f85c96cb47dc019dbf1545085d3924f 100644 --- a/haddock-library/src/Documentation/Haddock/Parser.hs +++ b/haddock-library/src/Documentation/Haddock/Parser.hs @@ -108,11 +108,11 @@ parseParas :: Maybe Package -> String -- ^ String to parse -> MetaDoc mod Identifier parseParas pkg input = case parseParasState input of - (state, a) -> MetaDoc { _meta = Meta { _version = parserStateSince state - , _package = pkg - } - , _doc = a - } + (state, a) -> + let defaultPackage s = s { sincePackage = sincePackage s <|> pkg } + in MetaDoc { _meta = Meta { _metaSince = defaultPackage <$> parserStateSince state } + , _doc = a + } parseParasState :: String -> (ParserState, DocH mod Identifier) parseParasState = parse (emptyLines *> p) . T.pack . (++ "\n") . filter (/= '\r') @@ -529,7 +529,10 @@ tableStepFour rs hdrIndex cells = case hdrIndex of -- | Parse \@since annotations. since :: Parser (DocH mod a) -since = ("@since " *> version <* skipHorizontalSpace <* endOfLine) >>= setSince >> return DocEmpty +since = do + ver <- ("@since " *> version <* skipHorizontalSpace <* endOfLine) + setSince (MetaSince Nothing ver) + return DocEmpty where version = decimal `Parsec.sepBy1` "." diff --git a/haddock-library/src/Documentation/Haddock/Parser/Monad.hs b/haddock-library/src/Documentation/Haddock/Parser/Monad.hs index 8d6e7a1d17d6e4376170a0b58d4566f1c81fc39e..f753c0d7f1374d3f029135231352e0725a636bd7 100644 --- a/haddock-library/src/Documentation/Haddock/Parser/Monad.hs +++ b/haddock-library/src/Documentation/Haddock/Parser/Monad.hs @@ -34,7 +34,7 @@ import Data.Char ( ord ) import Data.List ( foldl' ) import Control.Applicative as App -import Documentation.Haddock.Types ( Version ) +import Documentation.Haddock.Types ( MetaSince(..) ) import Prelude hiding (takeWhile) import CompatPrelude @@ -43,13 +43,13 @@ import CompatPrelude -- through parsing is the version attached to a @\@since@ annotation - if -- the doc even contained one. newtype ParserState = ParserState { - parserStateSince :: Maybe Version + parserStateSince :: Maybe MetaSince } deriving (Eq, Show) initialParserState :: ParserState initialParserState = ParserState Nothing -setSince :: Version -> Parser () +setSince :: MetaSince -> Parser () setSince since = Parsec.modifyState (\st -> st{ parserStateSince = Just since }) type Parser = Parsec.Parsec Text ParserState diff --git a/haddock-library/src/Documentation/Haddock/Types.hs b/haddock-library/src/Documentation/Haddock/Types.hs index d72ab4b44e64034d284d25e584436e1e6cd59138..fc34768c58dd7479021c1889e74f08866409b5fb 100644 --- a/haddock-library/src/Documentation/Haddock/Types.hs +++ b/haddock-library/src/Documentation/Haddock/Types.hs @@ -30,12 +30,18 @@ import Data.Bifoldable import Data.Bitraversable #endif +-- | A @\@since@ declaration. +data MetaSince = + MetaSince { sincePackage :: Maybe Package + -- ^ optional package qualification + , sinceVersion :: Version + } deriving (Eq, Show) + -- | With the advent of 'Version', we may want to start attaching more -- meta-data to comments. We make a structure for this ahead of time -- so we don't have to gut half the core each time we want to add such -- info. -data Meta = Meta { _version :: Maybe Version - , _package :: Maybe Package +data Meta = Meta { _metaSince :: Maybe MetaSince } deriving (Eq, Show) data MetaDoc mod id = diff --git a/haddock-library/test/Documentation/Haddock/ParserSpec.hs b/haddock-library/test/Documentation/Haddock/ParserSpec.hs index 1d227e576e75a887c1ed2694cbe8794ae2596562..005f47f7e34287d9316ac9f931c5517198710cd4 100644 --- a/haddock-library/test/Documentation/Haddock/ParserSpec.hs +++ b/haddock-library/test/Documentation/Haddock/ParserSpec.hs @@ -28,8 +28,7 @@ instance IsString a => IsString (Maybe a) where emptyMeta :: Meta emptyMeta = Meta { - _version = Nothing - , _package = Nothing + _metaSince = Nothing } parseParas :: String -> MetaDoc () String @@ -547,8 +546,11 @@ spec = do "@since 0.5.0" , "@since 0.6.0" , "@since 0.7.0" - ] `shouldBe` MetaDoc { _meta = emptyMeta { _version = Just [0,7,0] } - , _doc = DocEmpty } + ] + `shouldBe` + MetaDoc { _meta = emptyMeta { _metaSince = Just $ MetaSince { sincePackage = Nothing + , sinceVersion = [0,7,0] } } + , _doc = DocEmpty } context "when parsing text paragraphs" $ do diff --git a/html-test/ref/ExportSince1.html b/html-test/ref/ExportSince1.html new file mode 100644 index 0000000000000000000000000000000000000000..e3c21b01a09cd478ca405bbf783383c3be91ae73 --- /dev/null +++ b/html-test/ref/ExportSince1.html @@ -0,0 +1,216 @@ +<html xmlns="http://www.w3.org/1999/xhtml" +><head + ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" + /><meta name="viewport" content="width=device-width, initial-scale=1" + /><title + >ExportSince1</title + ><link href="#" rel="stylesheet" type="text/css" title="Linuwial" + /><link rel="stylesheet" type="text/css" href="#" + /><link rel="stylesheet" type="text/css" href="#" + /><script src="haddock-bundle.min.js" async="async" type="text/javascript" + ></script + ><script type="text/x-mathjax-config" + >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script + ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript" + ></script + ></head + ><body + ><div id="package-header" + ><span class="caption empty" + > </span + ><ul class="links" id="page-menu" + ><li + ><a href="#" + >Contents</a + ></li + ><li + ><a href="#" + >Index</a + ></li + ></ul + ></div + ><div id="content" + ><div id="module-header" + ><table class="info" + ><tr + ><th + >Safe Haskell</th + ><td + >None</td + ></tr + ></table + ><p class="caption" + >ExportSince1</p + ></div + ><div id="synopsis" + ><details id="syn" + ><summary + >Synopsis</summary + ><ul class="details-toggle" data-details-id="syn" + ><li class="src short" + ><a href="#" + >hello1</a + > :: <a href="#" title="Prelude" + >String</a + ></li + ><li class="src short" + ><a href="#" + >hello2</a + > :: <a href="#" title="Prelude" + >String</a + ></li + ><li class="src short" + ><span class="keyword" + >data</span + > <a href="#" + >HelloTy</a + > = <a href="#" + >HelloTy</a + > {<ul class="subs" + ><li + ><a href="#" + >field1</a + > :: <a href="#" title="Prelude" + >String</a + ></li + ></ul + >}</li + ><li class="src short" + ><span class="keyword" + >class</span + > <a href="#" + >HelloClass</a + > a <span class="keyword" + >where</span + ><ul class="subs" + ><li + ><a href="#" + >method1</a + > :: a -> <a href="#" title="Prelude" + >String</a + ></li + ></ul + ></li + ></ul + ></details + ></div + ><div id="interface" + ><h1 + >Documentation</h1 + ><div class="top" + ><p class="src" + ><a id="v:hello1" class="def" + >hello1</a + > :: <a href="#" title="Prelude" + >String</a + > <a href="#" class="selflink" + >#</a + ></p + ><div class="doc" + ><p + ><em + >Since: 1.0</em + ></p + ></div + ></div + ><div class="top" + ><p class="src" + ><a id="v:hello2" class="def" + >hello2</a + > :: <a href="#" title="Prelude" + >String</a + > <a href="#" class="selflink" + >#</a + ></p + ><div class="doc" + ><p + ><em + >Since: 1.0</em + ></p + ></div + ></div + ><div class="top" + ><p class="src" + ><span class="keyword" + >data</span + > <a id="t:HelloTy" class="def" + >HelloTy</a + > <a href="#" class="selflink" + >#</a + ></p + ><div class="doc" + ><p + ><em + >Since: 1.0</em + ></p + ></div + ><div class="subs constructors" + ><p class="caption" + >Constructors</p + ><table + ><tr + ><td class="src" + ><a id="v:HelloTy" class="def" + >HelloTy</a + ></td + ><td class="doc empty" + > </td + ></tr + ><tr + ><td colspan="2" + ><div class="subs fields" + ><p class="caption" + >Fields</p + ><ul + ><li + ><dfn class="src" + ><a id="v:field1" class="def" + >field1</a + > :: <a href="#" title="Prelude" + >String</a + ></dfn + ><div class="doc empty" + > </div + ></li + ></ul + ></div + ></td + ></tr + ></table + ></div + ></div + ><div class="top" + ><p class="src" + ><span class="keyword" + >class</span + > <a id="t:HelloClass" class="def" + >HelloClass</a + > a <span class="keyword" + >where</span + > <a href="#" class="selflink" + >#</a + ></p + ><div class="doc" + ><p + ><em + >Since: 1.0</em + ></p + ></div + ><div class="subs methods" + ><p class="caption" + >Methods</p + ><p class="src" + ><a id="v:method1" class="def" + >method1</a + > :: a -> <a href="#" title="Prelude" + >String</a + > <a href="#" class="selflink" + >#</a + ></p + ></div + ></div + ></div + ></div + ></body + ></html +> diff --git a/html-test/ref/ExportSince2.html b/html-test/ref/ExportSince2.html new file mode 100644 index 0000000000000000000000000000000000000000..32b7d18f7bfd792744982ed6484678e78a95f451 --- /dev/null +++ b/html-test/ref/ExportSince2.html @@ -0,0 +1,156 @@ +<html xmlns="http://www.w3.org/1999/xhtml" +><head + ><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" + /><meta name="viewport" content="width=device-width, initial-scale=1" + /><title + >ExportSince2</title + ><link href="#" rel="stylesheet" type="text/css" title="Linuwial" + /><link rel="stylesheet" type="text/css" href="#" + /><link rel="stylesheet" type="text/css" href="#" + /><script src="haddock-bundle.min.js" async="async" type="text/javascript" + ></script + ><script type="text/x-mathjax-config" + >MathJax.Hub.Config({ tex2jax: { processClass: "mathjax", ignoreClass: ".*" } });</script + ><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript" + ></script + ></head + ><body + ><div id="package-header" + ><span class="caption empty" + > </span + ><ul class="links" id="page-menu" + ><li + ><a href="#" + >Contents</a + ></li + ><li + ><a href="#" + >Index</a + ></li + ></ul + ></div + ><div id="content" + ><div id="module-header" + ><table class="info" + ><tr + ><th + >Safe Haskell</th + ><td + >None</td + ></tr + ></table + ><p class="caption" + >ExportSince2</p + ></div + ><div id="synopsis" + ><details id="syn" + ><summary + >Synopsis</summary + ><ul class="details-toggle" data-details-id="syn" + ><li class="src short" + ><a href="#" + >hello1</a + > :: <a href="#" title="Prelude" + >String</a + ></li + ><li class="src short" + ><a href="#" + >hello2</a + > :: <a href="#" title="Prelude" + >String</a + ></li + ><li class="src short" + ><span class="keyword" + >data</span + > <a href="#" + >HelloTy</a + ></li + ><li class="src short" + ><span class="keyword" + >class</span + > <a href="#" + >HelloClass</a + > a</li + ></ul + ></details + ></div + ><div id="interface" + ><h1 + >Documentation</h1 + ><div class="top" + ><p class="src" + ><a id="v:hello1" class="def" + >hello1</a + > :: <a href="#" title="Prelude" + >String</a + > <a href="#" class="selflink" + >#</a + ></p + ><div class="doc" + ><p + ><em + >Since: 2.0</em + ></p + ></div + ></div + ><div class="top" + ><p class="src" + ><a id="v:hello2" class="def" + >hello2</a + > :: <a href="#" title="Prelude" + >String</a + > <a href="#" class="selflink" + >#</a + ></p + ><div class="doc" + ><p + ><em + >Since: 2.0</em + ></p + ></div + ></div + ><div class="top" + ><p class="src" + ><span class="keyword" + >data</span + > <a id="t:HelloTy" class="def" + >HelloTy</a + > <a href="#" class="selflink" + >#</a + ></p + ><div class="doc" + ><p + ><em + >Since: 2.0</em + ></p + ></div + ></div + ><div class="top" + ><p class="src" + ><span class="keyword" + >class</span + > <a id="t:HelloClass" class="def" + >HelloClass</a + > a <a href="#" class="selflink" + >#</a + ></p + ><div class="doc" + ><p + ><em + >Since: 2.0</em + ></p + ></div + ><div class="subs minimal" + ><p class="caption" + >Minimal complete definition</p + ><p class="src" + ><a href="#" title="ExportSince1" + >method1</a + ></p + ></div + ></div + ></div + ></div + ></body + ></html +> diff --git a/html-test/src/ExportSince1.hs b/html-test/src/ExportSince1.hs new file mode 100644 index 0000000000000000000000000000000000000000..b5425fa5b31fb18045ba49d57e68fc7c65457257 --- /dev/null +++ b/html-test/src/ExportSince1.hs @@ -0,0 +1,21 @@ +module ExportSince1 + ( hello1 + , hello2 + , HelloTy(..) + , HelloClass(..) + ) where + +-- | @since 1.0 +hello1 :: String +hello1 = "Hello" + +-- | @since 1.0 +hello2 :: String +hello2 = "Hello" + +-- | @since 1.0 +data HelloTy = HelloTy { field1 :: String } + +-- | @since 1.0 +class HelloClass a where + method1 :: a -> String diff --git a/html-test/src/ExportSince2.hs b/html-test/src/ExportSince2.hs new file mode 100644 index 0000000000000000000000000000000000000000..eca14fea591d990a7845912e035b7cb4d7f188eb --- /dev/null +++ b/html-test/src/ExportSince2.hs @@ -0,0 +1,8 @@ +module ExportSince2 + ( hello1, -- ^ @since 2.0 + hello2, -- ^ @since 2.0 + HelloTy, -- ^ @since 2.0 + HelloClass, -- ^ @since 2.0 + ) where + +import ExportSince1