diff options
| author | Alec Theriault <alec.theriault@gmail.com> | 2019-03-08 13:23:37 -0800 | 
|---|---|---|
| committer | Alec Theriault <alec.theriault@gmail.com> | 2019-03-09 11:22:55 -0800 | 
| commit | abb448ff120d6f09b6d070806de1d0eb334bc23b (patch) | |
| tree | 85ae5ea96f3c8b990ae5a2a7dac01230a33c1507 | |
| parent | 50cf001765123a6c787795dda50aaefa5f2beed7 (diff) | |
Better support for default methods in classes
  * default methods now get rendered differently
  * default associated types get rendered
  * fix a forgotten `s/TypeSig/ClassOpSig/` refactor in LaTeX backend
  * LaTeX backend now renders default method signatures
NB: there is still no way to document default class members and the
NB: LaTeX backend still crashes on associated types
| -rw-r--r-- | CHANGES.md | 3 | ||||
| -rw-r--r-- | haddock-api/src/Haddock/Backends/LaTeX.hs | 47 | ||||
| -rw-r--r-- | haddock-api/src/Haddock/Backends/Xhtml/Decl.hs | 99 | ||||
| -rw-r--r-- | haddock-api/src/Haddock/Backends/Xhtml/Layout.hs | 4 | ||||
| -rw-r--r-- | haddock-api/src/Haddock/Types.hs | 3 | ||||
| -rw-r--r-- | html-test/ref/DefaultAssociatedTypes.html | 158 | ||||
| -rw-r--r-- | html-test/ref/DefaultSignatures.html | 182 | ||||
| -rw-r--r-- | html-test/src/DefaultAssociatedTypes.hs | 14 | ||||
| -rw-r--r-- | html-test/src/DefaultSignatures.hs | 19 | ||||
| -rw-r--r-- | latex-test/ref/DefaultSignatures/DefaultSignatures.tex | 41 | ||||
| -rw-r--r-- | latex-test/ref/DefaultSignatures/haddock.sty | 57 | ||||
| -rw-r--r-- | latex-test/ref/DefaultSignatures/main.tex | 11 | ||||
| -rw-r--r-- | latex-test/src/DefaultSignatures/DefaultSignatures.hs | 19 | 
13 files changed, 606 insertions, 51 deletions
@@ -23,6 +23,9 @@   * `--show-interface` now outputs to stdout (instead of stderr) + * Render associated type defaults and also improve rendering of +   default method signatures +  ## Changes in version 2.22.0   * Make `--package-version` optional for `--hoogle` (#899) diff --git a/haddock-api/src/Haddock/Backends/LaTeX.hs b/haddock-api/src/Haddock/Backends/LaTeX.hs index 119bbc01..d2baefac 100644 --- a/haddock-api/src/Haddock/Backends/LaTeX.hs +++ b/haddock-api/src/Haddock/Backends/LaTeX.hs @@ -295,7 +295,7 @@ ppDecl decl pats (doc, fnArgsDoc) instances subdocs _fxts = case unLoc decl of  --    | Just _  <- tcdTyPats d    -> ppTyInst False loc doc d unicode  -- Family instances happen via FamInst now    TyClD _ d@ClassDecl{}          -> ppClassDecl instances doc subdocs d unicode -  SigD _ (TypeSig _ lnames ty)   -> ppFunSig (doc, fnArgsDoc) (map unLoc lnames) (hsSigWcType ty) unicode +  SigD _ (TypeSig _ lnames ty)   -> ppFunSig Nothing (doc, fnArgsDoc) (map unLoc lnames) (hsSigWcType ty) unicode    SigD _ (PatSynSig _ lnames ty) -> ppLPatSig (doc, fnArgsDoc) (map unLoc lnames) ty unicode    ForD _ d                       -> ppFor (doc, fnArgsDoc) d unicode    InstD _ _                      -> empty @@ -307,7 +307,7 @@ ppDecl decl pats (doc, fnArgsDoc) instances subdocs _fxts = case unLoc decl of  ppFor :: DocForDecl DocName -> ForeignDecl DocNameI -> Bool -> LaTeX  ppFor doc (ForeignImport _ (L _ name) typ _) unicode = -  ppFunSig doc [name] (hsSigType typ) unicode +  ppFunSig Nothing doc [name] (hsSigType typ) unicode  ppFor _ _ _ = error "ppFor error in Haddock.Backends.LaTeX"  --  error "foreign declarations are currently not supported by --latex" @@ -414,17 +414,23 @@ ppTySyn _ _ _ = error "declaration not supported by ppTySyn"  ------------------------------------------------------------------------------- -ppFunSig :: DocForDecl DocName -> [DocName] -> LHsType DocNameI -         -> Bool -> LaTeX -ppFunSig doc docnames (L _ typ) unicode = +ppFunSig +  :: Maybe LaTeX         -- ^ a prefix to put right before the signature +  -> DocForDecl DocName  -- ^ documentation +  -> [DocName]           -- ^ pattern names in the pattern signature +  -> LHsType DocNameI    -- ^ type of the pattern synonym +  -> Bool                -- ^ unicode +  -> LaTeX +ppFunSig leader doc docnames (L _ typ) unicode =    ppTypeOrFunSig typ doc -    ( ppTypeSig names typ False -    , hsep . punctuate comma $ map ppSymName names +    ( lead $ ppTypeSig names typ False +    , lead $ hsep . punctuate comma $ map ppSymName names      , dcolon unicode      )      unicode   where     names = map getName docnames +   lead = maybe id (<+>) leader  -- | Pretty-print a pattern synonym  ppLPatSig :: DocForDecl DocName  -- ^ documentation @@ -433,15 +439,7 @@ ppLPatSig :: DocForDecl DocName  -- ^ documentation            -> Bool                -- ^ unicode            -> LaTeX  ppLPatSig doc docnames ty unicode -  = ppTypeOrFunSig typ doc -      ( keyword "pattern" <+> ppTypeSig names typ False -      , keyword "pattern" <+> (hsep . punctuate comma $ map ppSymName names) -      , dcolon unicode -      ) -      unicode -  where -    typ = unLoc (hsSigType ty) -    names = map getName docnames +  = ppFunSig (Just (keyword "pattern")) doc docnames (hsSigType ty) unicode  -- | Pretty-print a type, adding documentation to the whole type and its  -- arguments as needed. @@ -585,6 +583,7 @@ ppFds fds unicode =                             hsep (map (ppDocName . unLoc) vars2) +-- TODO: associated types, associated type defaults, docs on default methods  ppClassDecl :: [DocInstance DocNameI]              -> Documentation DocName -> [(DocName, DocForDecl DocName)]              -> TyClDecl DocNameI -> Bool -> LaTeX @@ -610,13 +609,15 @@ ppClassDecl instances doc subdocs      methodTable =        text "\\haddockpremethods{}" <> emph (text "Methods") $$ -      vcat  [ ppFunSig doc names (hsSigWcType typ) unicode -            | L _ (TypeSig _ lnames typ) <- lsigs -            , let doc = lookupAnySubdoc (head names) subdocs -                  names = map unLoc lnames ] -              -- FIXME: is taking just the first name ok? Is it possible that -              -- there are different subdocs for different names in a single -              -- type signature? +      vcat  [ ppFunSig leader doc names (hsSigType typ) unicode +            | L _ (ClassOpSig _ is_def lnames typ) <- lsigs +            , let doc | is_def = noDocForDecl +                      | otherwise = lookupAnySubdoc (head names) subdocs +                  names = map unLoc lnames +                  leader = if is_def then Just (keyword "default") else Nothing +            ] +            -- N.B. taking just the first name is ok. Signatures with multiple +            -- names are expanded so that each name gets its own signature.      instancesBit = ppDocInstances unicode instances diff --git a/haddock-api/src/Haddock/Backends/Xhtml/Decl.hs b/haddock-api/src/Haddock/Backends/Xhtml/Decl.hs index f2cab635..56a79d57 100644 --- a/haddock-api/src/Haddock/Backends/Xhtml/Decl.hs +++ b/haddock-api/src/Haddock/Backends/Xhtml/Decl.hs @@ -36,6 +36,7 @@ import           Text.XHtml hiding     ( name, title, p, quote )  import BasicTypes (PromotionFlag(..), isPromoted)  import GHC hiding (LexicalFixity(..)) +import qualified GHC  import GHC.Exts  import Name  import BooleanFormula @@ -75,14 +76,14 @@ ppLFunSig :: Bool -> LinksInfo -> SrcSpan -> DocForDecl DocName ->               [Located DocName] -> LHsType DocNameI -> [(DocName, Fixity)] ->               Splice -> Unicode -> Maybe Package -> Qualification -> Html  ppLFunSig summary links loc doc lnames lty fixities splice unicode pkg qual = -  ppFunSig summary links loc doc (map unLoc lnames) lty fixities +  ppFunSig summary links loc noHtml doc (map unLoc lnames) lty fixities             splice unicode pkg qual -ppFunSig :: Bool -> LinksInfo -> SrcSpan -> DocForDecl DocName -> +ppFunSig :: Bool -> LinksInfo -> SrcSpan -> Html -> DocForDecl DocName ->              [DocName] -> LHsType DocNameI -> [(DocName, Fixity)] ->              Splice -> Unicode -> Maybe Package -> Qualification -> Html -ppFunSig summary links loc doc docnames typ fixities splice unicode pkg qual = -  ppSigLike summary links loc mempty doc docnames fixities (unLoc typ, pp_typ) +ppFunSig summary links loc leader doc docnames typ fixities splice unicode pkg qual = +  ppSigLike summary links loc leader doc docnames fixities (unLoc typ, pp_typ)              splice unicode pkg qual HideEmptyContexts    where      pp_typ = ppLType unicode qual HideEmptyContexts typ @@ -218,7 +219,7 @@ ppFor :: Bool -> LinksInfo -> SrcSpan -> DocForDecl DocName        -> Splice -> Unicode -> Maybe Package -> Qualification -> Html  ppFor summary links loc doc (ForeignImport _ (L _ name) typ _) fixities        splice unicode pkg qual -  = ppFunSig summary links loc doc [name] (hsSigType typ) fixities splice unicode pkg qual +  = ppFunSig summary links loc noHtml doc [name] (hsSigType typ) fixities splice unicode pkg qual  ppFor _ _ _ _ _ _ _ _ _ _ = error "ppFor" @@ -496,7 +497,7 @@ ppShortClassDecl summary links (ClassDecl { tcdCtxt = lctxt, tcdLName = lname, t                  -- ToDo: add associated type defaults -            [ ppFunSig summary links loc doc names (hsSigType typ) +            [ ppFunSig summary links loc noHtml doc names (hsSigType typ)                         [] splice unicode pkg qual                | L _ (ClassOpSig _ False lnames typ) <- sigs                , let doc = lookupAnySubdoc (head names) subdocs @@ -517,8 +518,9 @@ ppClassDecl :: Bool -> LinksInfo -> [DocInstance DocNameI] -> [(DocName, Fixity)              -> [(DocName, DocForDecl DocName)] -> TyClDecl DocNameI              -> Splice -> Unicode -> Maybe Package -> Qualification -> Html  ppClassDecl summary links instances fixities loc d subdocs -        decl@(ClassDecl { tcdCtxt = lctxt, tcdLName = lname, tcdTyVars = ltyvars -                        , tcdFDs = lfds, tcdSigs = lsigs, tcdATs = ats }) +        decl@(ClassDecl { tcdCtxt = lctxt, tcdLName = lname@(L _ nm) +                        , tcdTyVars = ltyvars, tcdFDs = lfds, tcdSigs = lsigs +                        , tcdATs = ats, tcdATDefs = atsDefs })              splice unicode pkg qual    | summary = ppShortClassDecl summary links decl loc subdocs splice unicode pkg qual    | otherwise = classheader +++ docSection curname pkg qual d @@ -535,28 +537,68 @@ ppClassDecl summary links instances fixities loc d subdocs      -- Only the fixity relevant to the class header      fixs = ppFixities [ f | f@(n,_) <- fixities, n == unLoc lname ] qual -    nm   = tcdName decl -      hdr = ppClassHdr summary lctxt (unLoc lname) ltyvars lfds -    -- ToDo: add assocatied typ defaults -    atBit = subAssociatedTypes [ ppAssocType summary links doc at subfixs splice unicode pkg qual -                      | at <- ats -                      , let n = unL . fdLName $ unL at -                            doc = lookupAnySubdoc (unL $ fdLName $ unL at) subdocs -                            subfixs = [ f | f@(n',_) <- fixities, n == n' ] ] - -    methodBit = subMethods [ ppFunSig summary links loc doc [name] (hsSigType typ) -                                      subfixs splice unicode pkg qual -                           | L _ (ClassOpSig _ _ lnames typ) <- lsigs -                           , name <- map unLoc lnames -                           , let doc = lookupAnySubdoc name subdocs -                                 subfixs = [ f | f@(n',_) <- fixities -                                               , name == n' ] -                           ] -                           -- N.B. taking just the first name is ok. Signatures with multiple names -                           -- are expanded so that each name gets its own signature. +    -- Associated types +    atBit = subAssociatedTypes +      [ ppAssocType summary links doc at subfixs splice unicode pkg qual +          <+> +        subDefaults (maybeToList defTys) +      | at <- ats +      , let name = unL . fdLName $ unL at +            doc = lookupAnySubdoc name subdocs +            subfixs = filter ((== name) . fst) fixities +            defTys = ppDefaultAssocTy name <$> lookupDAT name +      ] + +    -- Default associated types +    ppDefaultAssocTy n (vs,t,d') = ppTySyn summary links [] loc d' synDecl +      splice unicode pkg qual +      where +        synDecl = SynDecl { tcdSExt = noExt +                          , tcdLName = noLoc n +                          , tcdTyVars = vs +                          , tcdFixity = GHC.Prefix +                          , tcdRhs = t } + +    lookupDAT name = Map.lookup (getName name) defaultAssocTys +    defaultAssocTys = Map.fromList +      [ (getName name, (vs, typ, doc)) +      | L _ (FamEqn { feqn_rhs = typ +                    , feqn_tycon = L _ name +                    , feqn_pats = vs }) <- atsDefs +      , let doc = noDocForDecl -- TODO: get docs for associated type defaults +      ] + +    -- Methods +    methodBit = subMethods +      [ ppFunSig summary links loc noHtml doc [name] (hsSigType typ) +                 subfixs splice unicode pkg qual +          <+> +        subDefaults (maybeToList defSigs) +      | ClassOpSig _ False lnames typ <- sigs +      , name <- map unLoc lnames +      , let doc = lookupAnySubdoc name subdocs +            subfixs = filter ((== name)  . fst) fixities +            defSigs = ppDefaultFunSig name <$> lookupDM name +      ] +      -- N.B. taking just the first name is ok. Signatures with multiple names +      -- are expanded so that each name gets its own signature. + +    -- Default methods +    ppDefaultFunSig n (t, d') = ppFunSig summary links loc (keyword "default") +      d' [n] (hsSigType t) [] splice unicode pkg qual + +    lookupDM name = Map.lookup (getOccString name) defaultMethods +    defaultMethods = Map.fromList +      [ (nameStr, (typ, doc)) +      | ClassOpSig _ True lnames typ <- sigs +      , name <- map unLoc lnames +      , let doc = noDocForDecl -- TODO: get docs for method defaults +            nameStr = getOccString name +      ] +    -- Minimal complete definition      minimalBit = case [ s | MinimalSig _ _ (L _ s) <- sigs ] of        -- Miminal complete definition = every shown method        And xs : _ | sort [getName n | L _ (Var (L _ n)) <- xs] == @@ -565,7 +607,7 @@ ppClassDecl summary links instances fixities loc d subdocs        -- Minimal complete definition = the only shown method        Var (L _ n) : _ | [getName n] == -                        [getName n' | L _ (ClassOpSig _ _ ns _) <- lsigs, L _ n' <- ns] +                        [getName n' | ClassOpSig _ _ ns _ <- sigs, L _ n' <- ns]          -> noHtml        -- Minimal complete definition = nothing @@ -580,6 +622,7 @@ ppClassDecl summary links instances fixities loc d subdocs        where wrap | p = parens | otherwise = id      ppMinimal p (Parens x) = ppMinimal p (unLoc x) +    -- Instances      instancesBit = ppInstances links (OriginClass nm) instances          splice unicode pkg qual diff --git a/haddock-api/src/Haddock/Backends/Xhtml/Layout.hs b/haddock-api/src/Haddock/Backends/Xhtml/Layout.hs index 25d8b07a..4535b897 100644 --- a/haddock-api/src/Haddock/Backends/Xhtml/Layout.hs +++ b/haddock-api/src/Haddock/Backends/Xhtml/Layout.hs @@ -35,6 +35,7 @@ module Haddock.Backends.Xhtml.Layout (    subInstances, subOrphanInstances,    subInstHead, subInstDetails, subFamInstDetails,    subMethods, +  subDefaults,    subMinimal,    topDeclElem, declElem, @@ -259,6 +260,9 @@ instAnchorId iid = makeAnchorId $ "i:" ++ iid  subMethods :: [Html] -> Html  subMethods = divSubDecls "methods" "Methods" . subBlock +subDefaults :: [Html] -> Html +subDefaults = divSubDecls "default" "" . subBlock +  subMinimal :: Html -> Html  subMinimal = divSubDecls "minimal" "Minimal complete definition" . Just . declElem diff --git a/haddock-api/src/Haddock/Types.hs b/haddock-api/src/Haddock/Types.hs index cd4ac1a1..a72247e6 100644 --- a/haddock-api/src/Haddock/Types.hs +++ b/haddock-api/src/Haddock/Types.hs @@ -355,6 +355,9 @@ showWrapped f (Unadorned n) = f n  showWrapped f (Parenthesized n) = "(" ++ f n ++ ")"  showWrapped f (Backticked n) = "`" ++ f n ++ "`" +instance HasOccName DocName where + +    occName = occName . getName  -----------------------------------------------------------------------------  -- * Instances diff --git a/html-test/ref/DefaultAssociatedTypes.html b/html-test/ref/DefaultAssociatedTypes.html new file mode 100644 index 00000000..d456815f --- /dev/null +++ b/html-test/ref/DefaultAssociatedTypes.html @@ -0,0 +1,158 @@ +<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 +    >DefaultAssociatedTypes</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 +	    >Safe</td +	    ></tr +	  ></table +	><p class="caption" +	>DefaultAssociatedTypes</p +	></div +      ><div id="synopsis" +      ><details id="syn" +	><summary +	  >Synopsis</summary +	  ><ul class="details-toggle" data-details-id="syn" +	  ><li class="src short" +	    ><span class="keyword" +	      >class</span +	      > <a href="#" +	      >Foo</a +	      > a <span class="keyword" +	      >where</span +	      ><ul class="subs" +	      ><li +		><span class="keyword" +		  >type</span +		  > <a href="#" +		  >Qux</a +		  > a :: *</li +		><li +		><a href="#" +		  >bar</a +		  >, <a href="#" +		  >baz</a +		  > :: a -> <a href="#" title="Data.String" +		  >String</a +		  ></li +		></ul +	      ></li +	    ></ul +	  ></details +	></div +      ><div id="interface" +      ><h1 +	>Documentation</h1 +	><div class="top" +	><p class="src" +	  ><span class="keyword" +	    >class</span +	    > <a id="t:Foo" class="def" +	    >Foo</a +	    > a <span class="keyword" +	    >where</span +	    > <a href="#" class="selflink" +	    >#</a +	    ></p +	  ><div class="doc" +	  ><p +	    >Documentation for Foo.</p +	    ></div +	  ><div class="subs associated-types" +	  ><p class="caption" +	    >Associated Types</p +	    ><p class="src" +	    ><span class="keyword" +	      >type</span +	      > <a id="t:Qux" class="def" +	      >Qux</a +	      > a :: * <a href="#" class="selflink" +	      >#</a +	      ></p +	    ><div class="doc" +	    ><p +	      >Doc for Qux</p +	      ></div +	    > <div class="subs default" +	    ><p class="caption" +	      ></p +	      ><p class="src" +	      ><span class="keyword" +		>type</span +		> <a id="t:Qux" class="def" +		>Qux</a +		> a = [a] <a href="#" class="selflink" +		>#</a +		></p +	      ></div +	    ></div +	  ><div class="subs methods" +	  ><p class="caption" +	    >Methods</p +	    ><p class="src" +	    ><a id="v:bar" class="def" +	      >bar</a +	      > :: a -> <a href="#" title="Data.String" +	      >String</a +	      > <a href="#" class="selflink" +	      >#</a +	      ></p +	    ><div class="doc" +	    ><p +	      >Documentation for bar and baz.</p +	      ></div +	    ><p class="src" +	    ><a id="v:baz" class="def" +	      >baz</a +	      > :: a -> <a href="#" title="Data.String" +	      >String</a +	      > <a href="#" class="selflink" +	      >#</a +	      ></p +	    ><div class="doc" +	    ><p +	      >Documentation for bar and baz.</p +	      ></div +	    ></div +	  ></div +	></div +      ></div +    ><div id="footer" +    ></div +    ></body +  ></html +>
\ No newline at end of file diff --git a/html-test/ref/DefaultSignatures.html b/html-test/ref/DefaultSignatures.html new file mode 100644 index 00000000..4bf261f7 --- /dev/null +++ b/html-test/ref/DefaultSignatures.html @@ -0,0 +1,182 @@ +<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 +    >DefaultSignatures</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 +	    >Safe</td +	    ></tr +	  ></table +	><p class="caption" +	>DefaultSignatures</p +	></div +      ><div id="synopsis" +      ><details id="syn" +	><summary +	  >Synopsis</summary +	  ><ul class="details-toggle" data-details-id="syn" +	  ><li class="src short" +	    ><span class="keyword" +	      >class</span +	      > <a href="#" +	      >Foo</a +	      > a <span class="keyword" +	      >where</span +	      ><ul class="subs" +	      ><li +		><a href="#" +		  >bar</a +		  >, <a href="#" +		  >baz</a +		  > :: a -> <a href="#" title="Data.String" +		  >String</a +		  ></li +		><li +		><a href="#" +		  >baz'</a +		  > :: <a href="#" title="Data.String" +		  >String</a +		  > -> a</li +		></ul +	      ></li +	    ></ul +	  ></details +	></div +      ><div id="interface" +      ><h1 +	>Documentation</h1 +	><div class="top" +	><p class="src" +	  ><span class="keyword" +	    >class</span +	    > <a id="t:Foo" class="def" +	    >Foo</a +	    > a <span class="keyword" +	    >where</span +	    > <a href="#" class="selflink" +	    >#</a +	    ></p +	  ><div class="doc" +	  ><p +	    >Documentation for Foo.</p +	    ></div +	  ><div class="subs minimal" +	  ><p class="caption" +	    >Minimal complete definition</p +	    ><p class="src" +	    ><a href="#" title="DefaultSignatures" +	      >baz</a +	      ></p +	    ></div +	  ><div class="subs methods" +	  ><p class="caption" +	    >Methods</p +	    ><p class="src" +	    ><a id="v:bar" class="def" +	      >bar</a +	      > :: a -> <a href="#" title="Data.String" +	      >String</a +	      > <a href="#" class="selflink" +	      >#</a +	      ></p +	    ><div class="doc" +	    ><p +	      >Documentation for bar and baz.</p +	      ></div +	    > <div class="subs default" +	    ><p class="caption" +	      ></p +	      ><p class="src" +	      ><span class="keyword" +		>default</span +		> <a id="v:bar" class="def" +		>bar</a +		> :: <a href="#" title="Text.Show" +		>Show</a +		> a => a -> <a href="#" title="Data.String" +		>String</a +		> <a href="#" class="selflink" +		>#</a +		></p +	      ></div +	    ><p class="src" +	    ><a id="v:baz" class="def" +	      >baz</a +	      > :: a -> <a href="#" title="Data.String" +	      >String</a +	      > <a href="#" class="selflink" +	      >#</a +	      ></p +	    ><div class="doc" +	    ><p +	      >Documentation for bar and baz.</p +	      ></div +	    ><p class="src" +	    ><a id="v:baz-39-" class="def" +	      >baz'</a +	      > :: <a href="#" title="Data.String" +	      >String</a +	      > -> a <a href="#" class="selflink" +	      >#</a +	      ></p +	    ><div class="doc" +	    ><p +	      >Documentation for baz'.</p +	      ></div +	    > <div class="subs default" +	    ><p class="caption" +	      ></p +	      ><p class="src" +	      ><span class="keyword" +		>default</span +		> <a id="v:baz-39-" class="def" +		>baz'</a +		> :: <a href="#" title="Text.Read" +		>Read</a +		> a => <a href="#" title="Data.String" +		>String</a +		> -> a <a href="#" class="selflink" +		>#</a +		></p +	      ></div +	    ></div +	  ></div +	></div +      ></div +    ><div id="footer" +    ></div +    ></body +  ></html +>
\ No newline at end of file diff --git a/html-test/src/DefaultAssociatedTypes.hs b/html-test/src/DefaultAssociatedTypes.hs new file mode 100644 index 00000000..6ad197d3 --- /dev/null +++ b/html-test/src/DefaultAssociatedTypes.hs @@ -0,0 +1,14 @@ +{-# LANGUAGE DefaultSignatures, TypeFamilies #-} + +module DefaultAssociatedTypes where + +-- | Documentation for Foo. +class Foo a where +  -- | Documentation for bar and baz. +  bar, baz :: a -> String + +  -- | Doc for Qux +  type Qux a :: * + +  -- | Doc for default Qux +  type Qux a = [a] diff --git a/html-test/src/DefaultSignatures.hs b/html-test/src/DefaultSignatures.hs new file mode 100644 index 00000000..52d68a96 --- /dev/null +++ b/html-test/src/DefaultSignatures.hs @@ -0,0 +1,19 @@ +{-# LANGUAGE DefaultSignatures #-} + +module DefaultSignatures where + +-- | Documentation for Foo. +class Foo a where +  -- | Documentation for bar and baz. +  bar, baz :: a -> String + +  -- | Documentation for the default signature of bar. +  default bar :: Show a => a -> String +  bar = show + +  -- | Documentation for baz'. +  baz' :: String -> a + +  -- | Documentation for the default signature of baz'. +  default baz' :: Read a => String -> a +  baz' = read diff --git a/latex-test/ref/DefaultSignatures/DefaultSignatures.tex b/latex-test/ref/DefaultSignatures/DefaultSignatures.tex new file mode 100644 index 00000000..4dbcda49 --- /dev/null +++ b/latex-test/ref/DefaultSignatures/DefaultSignatures.tex @@ -0,0 +1,41 @@ +\haddockmoduleheading{DefaultSignatures} +\label{module:DefaultSignatures} +\haddockbeginheader +{\haddockverb\begin{verbatim} +module DefaultSignatures ( +    Foo(baz', baz, bar) +  ) where\end{verbatim}} +\haddockendheader + +\begin{haddockdesc} +\item[\begin{tabular}{@{}l} +class\ Foo\ a\ where +\end{tabular}]\haddockbegindoc +Documentation for Foo.\par + +\haddockpremethods{}\emph{Methods} +\begin{haddockdesc} +\item[\begin{tabular}{@{}l} +bar,\ baz\ ::\ a\ ->\ String +\end{tabular}]\haddockbegindoc +Documentation for bar and baz.\par + +\end{haddockdesc} +\begin{haddockdesc} +\item[\begin{tabular}{@{}l} +default\ bar\ ::\ Show\ a\ =>\ a\ ->\ String +\end{tabular}] +\end{haddockdesc} +\begin{haddockdesc} +\item[\begin{tabular}{@{}l} +baz'\ ::\ String\ ->\ a +\end{tabular}]\haddockbegindoc +Documentation for baz'.\par + +\end{haddockdesc} +\begin{haddockdesc} +\item[\begin{tabular}{@{}l} +default\ baz'\ ::\ Read\ a\ =>\ String\ ->\ a +\end{tabular}] +\end{haddockdesc} +\end{haddockdesc}
\ No newline at end of file diff --git a/latex-test/ref/DefaultSignatures/haddock.sty b/latex-test/ref/DefaultSignatures/haddock.sty new file mode 100644 index 00000000..6e031a98 --- /dev/null +++ b/latex-test/ref/DefaultSignatures/haddock.sty @@ -0,0 +1,57 @@ +% Default Haddock style definitions.  To use your own style, invoke +% Haddock with the option --latex-style=mystyle. + +\usepackage{tabulary} % see below + +% make hyperlinks in the PDF, and add an expandabale index +\usepackage[pdftex,bookmarks=true]{hyperref} + +\newenvironment{haddocktitle} +  {\begin{center}\bgroup\large\bfseries} +  {\egroup\end{center}} +\newenvironment{haddockprologue}{\vspace{1in}}{} + +\newcommand{\haddockmoduleheading}[1]{\chapter{\texttt{#1}}} + +\newcommand{\haddockbeginheader}{\hrulefill} +\newcommand{\haddockendheader}{\noindent\hrulefill} + +% a little gap before the ``Methods'' header +\newcommand{\haddockpremethods}{\vspace{2ex}} + +% inserted before \\begin{verbatim} +\newcommand{\haddockverb}{\small} + +% an identifier: add an index entry +\newcommand{\haddockid}[1]{\haddocktt{#1}\index{#1@\texttt{#1}}} + +% The tabulary environment lets us have a column that takes up ``the +% rest of the space''.  Unfortunately it doesn't allow +% the \end{tabulary} to be in the expansion of a macro, it must appear +% literally in the document text, so Haddock inserts +% the \end{tabulary} itself. +\newcommand{\haddockbeginconstrs}{\begin{tabulary}{\linewidth}{@{}llJ@{}}} +\newcommand{\haddockbeginargs}{\begin{tabulary}{\linewidth}{@{}llJ@{}}} + +\newcommand{\haddocktt}[1]{{\small \texttt{#1}}} +\newcommand{\haddockdecltt}[1]{{\small\bfseries \texttt{#1}}} + +\makeatletter +\newenvironment{haddockdesc} +               {\list{}{\labelwidth\z@ \itemindent-\leftmargin +                        \let\makelabel\haddocklabel}} +               {\endlist} +\newcommand*\haddocklabel[1]{\hspace\labelsep\haddockdecltt{#1}} +\makeatother + +% after a declaration, start a new line for the documentation. +% Otherwise, the documentation starts right after the declaration, +% because we're using the list environment and the declaration is the +% ``label''.  I tried making this newline part of the label, but +% couldn't get that to work reliably (the space seemed to stretch +% sometimes). +\newcommand{\haddockbegindoc}{\hfill\\[1ex]} + +% spacing between paragraphs and no \parindent looks better +\parskip=10pt plus2pt minus2pt +\setlength{\parindent}{0cm} diff --git a/latex-test/ref/DefaultSignatures/main.tex b/latex-test/ref/DefaultSignatures/main.tex new file mode 100644 index 00000000..d30eb008 --- /dev/null +++ b/latex-test/ref/DefaultSignatures/main.tex @@ -0,0 +1,11 @@ +\documentclass{book} +\usepackage{haddock} +\begin{document} +\begin{titlepage} +\begin{haddocktitle} + +\end{haddocktitle} +\end{titlepage} +\tableofcontents +\input{DefaultSignatures} +\end{document}
\ No newline at end of file diff --git a/latex-test/src/DefaultSignatures/DefaultSignatures.hs b/latex-test/src/DefaultSignatures/DefaultSignatures.hs new file mode 100644 index 00000000..52d68a96 --- /dev/null +++ b/latex-test/src/DefaultSignatures/DefaultSignatures.hs @@ -0,0 +1,19 @@ +{-# LANGUAGE DefaultSignatures #-} + +module DefaultSignatures where + +-- | Documentation for Foo. +class Foo a where +  -- | Documentation for bar and baz. +  bar, baz :: a -> String + +  -- | Documentation for the default signature of bar. +  default bar :: Show a => a -> String +  bar = show + +  -- | Documentation for baz'. +  baz' :: String -> a + +  -- | Documentation for the default signature of baz'. +  default baz' :: Read a => String -> a +  baz' = read  | 
