diff options
| author | Niklas Haas <git@nand.wakku.to> | 2014-03-08 09:42:00 +0100 | 
|---|---|---|
| committer | Niklas Haas <git@nand.wakku.to> | 2014-03-08 09:43:26 +0100 | 
| commit | 17970e6b6aa22962c498ce02ead8dbadad31a733 (patch) | |
| tree | 0c9232390bce92d8b393214a2d2131a17bc3f07e /src/Haddock/Backends/Xhtml | |
| parent | e5bd27b5edf533054513871dc475a54a8b1bee23 (diff) | |
Render fixity information
Affects functions, type synonyms, type families, class names, data type
names, constructors, data families, associated TFs/DFs, type synonyms,
pattern synonyms and everything else I could think of.
Diffstat (limited to 'src/Haddock/Backends/Xhtml')
| -rw-r--r-- | src/Haddock/Backends/Xhtml/Decl.hs | 175 | ||||
| -rw-r--r-- | src/Haddock/Backends/Xhtml/Utils.hs | 17 | 
2 files changed, 121 insertions, 71 deletions
diff --git a/src/Haddock/Backends/Xhtml/Decl.hs b/src/Haddock/Backends/Xhtml/Decl.hs index 9e72d4ad..20db5df1 100644 --- a/src/Haddock/Backends/Xhtml/Decl.hs +++ b/src/Haddock/Backends/Xhtml/Decl.hs @@ -37,50 +37,53 @@ import GHC  import Name -ppDecl :: Bool -> LinksInfo -> LHsDecl DocName -> -          DocForDecl DocName -> [DocInstance DocName] -> [(DocName, DocForDecl DocName)] -> -          Bool -> Qualification -> Html -ppDecl summ links (L loc decl) (mbDoc, fnArgsDoc) instances subdocs unicode qual = case decl of -  TyClD (FamDecl d)         -> ppTyFam summ False links instances loc mbDoc d unicode qual -  TyClD d@(DataDecl {})     -> ppDataDecl summ links instances subdocs loc mbDoc d unicode qual -  TyClD d@(SynDecl {})      -> ppTySyn summ links loc (mbDoc, fnArgsDoc) d unicode qual -  TyClD d@(ClassDecl {})    -> ppClassDecl summ links instances loc mbDoc subdocs d unicode qual -  SigD (TypeSig lnames lty) -> ppLFunSig summ links loc (mbDoc, fnArgsDoc) lnames lty unicode qual +ppDecl :: Bool -> LinksInfo -> LHsDecl DocName +       -> DocForDecl DocName -> [DocInstance DocName] -> [(DocName, Fixity)] +       -> [(DocName, DocForDecl DocName)] -> Bool -> Qualification -> Html +ppDecl summ links (L loc decl) (mbDoc, fnArgsDoc) instances fixities subdocs unicode qual = case decl of +  TyClD (FamDecl d)         -> ppTyFam summ False links instances fixities loc mbDoc d unicode qual +  TyClD d@(DataDecl {})     -> ppDataDecl summ links instances fixities subdocs loc mbDoc d unicode qual +  TyClD d@(SynDecl {})      -> ppTySyn summ links fixities loc (mbDoc, fnArgsDoc) d unicode qual +  TyClD d@(ClassDecl {})    -> ppClassDecl summ links instances fixities loc mbDoc subdocs d unicode qual +  SigD (TypeSig lnames lty) -> ppLFunSig summ links loc (mbDoc, fnArgsDoc) lnames lty fixities unicode qual    SigD (PatSynSig lname args ty prov req) -> -      ppLPatSig summ links loc (mbDoc, fnArgsDoc) lname args ty prov req unicode qual -  ForD d                         -> ppFor summ links loc (mbDoc, fnArgsDoc) d unicode qual +      ppLPatSig summ links loc (mbDoc, fnArgsDoc) lname args ty prov req fixities unicode qual +  ForD d                         -> ppFor summ links loc (mbDoc, fnArgsDoc) d fixities unicode qual    InstD _                        -> noHtml    _                              -> error "declaration not supported by ppDecl"  ppLFunSig :: Bool -> LinksInfo -> SrcSpan -> DocForDecl DocName -> -             [Located DocName] -> LHsType DocName -> Bool -> Qualification -> Html -ppLFunSig summary links loc doc lnames lty unicode qual = -  ppFunSig summary links loc doc (map unLoc lnames) (unLoc lty) unicode qual +             [Located DocName] -> LHsType DocName -> [(DocName, Fixity)] -> +             Bool -> Qualification -> Html +ppLFunSig summary links loc doc lnames lty fixities unicode qual = +  ppFunSig summary links loc doc (map unLoc lnames) (unLoc lty) fixities unicode qual  ppFunSig :: Bool -> LinksInfo -> SrcSpan -> DocForDecl DocName -> -            [DocName] -> HsType DocName -> Bool -> Qualification -> Html -ppFunSig summary links loc doc docnames typ unicode qual = -  ppSigLike summary links loc mempty doc docnames (typ, pp_typ) unicode qual +            [DocName] -> HsType DocName -> [(DocName, Fixity)] -> +            Bool -> Qualification -> Html +ppFunSig summary links loc doc docnames typ fixities unicode qual = +  ppSigLike summary links loc mempty doc docnames fixities (typ, pp_typ) unicode qual    where      pp_typ = ppType unicode qual typ  ppLPatSig :: Bool -> LinksInfo -> SrcSpan -> DocForDecl DocName ->               Located DocName ->               HsPatSynDetails (LHsType DocName) -> LHsType DocName -> -             LHsContext DocName -> LHsContext DocName -> +             LHsContext DocName -> LHsContext DocName -> [(DocName, Fixity)] ->               Bool -> Qualification -> Html -ppLPatSig summary links loc doc lname args typ prov req unicode qual = -    ppPatSig summary links loc doc (unLoc lname) (fmap unLoc args) (unLoc typ) (unLoc prov) (unLoc req) unicode qual +ppLPatSig summary links loc doc lname args typ prov req fixities unicode qual = +    ppPatSig summary links loc doc (unLoc lname) (fmap unLoc args) (unLoc typ) (unLoc prov) (unLoc req) fixities unicode qual  ppPatSig :: Bool -> LinksInfo -> SrcSpan -> DocForDecl DocName ->              DocName ->              HsPatSynDetails (HsType DocName) -> HsType DocName -> -            HsContext DocName -> HsContext DocName -> +            HsContext DocName -> HsContext DocName -> [(DocName, Fixity)] ->              Bool -> Qualification -> Html -ppPatSig summary links loc (doc, _argDocs) docname args typ prov req unicode qual +ppPatSig summary links loc (doc, _argDocs) docname args typ prov req fixities unicode qual    | summary = pref1 -  | otherwise = topDeclElem links loc [docname] pref1 +++ docSection qual doc +  | otherwise = topDeclElem links loc [docname] (ppFixities fixities qual <=> pref1) +                +++ docSection qual doc    where      pref1 = hsep [ toHtml "pattern"                   , pp_cxt prov @@ -99,16 +102,20 @@ ppPatSig summary links loc (doc, _argDocs) docname args typ prov req unicode qua      occname = nameOccName . getName $ docname  ppSigLike :: Bool -> LinksInfo -> SrcSpan -> Html -> DocForDecl DocName -> -            [DocName] -> (HsType DocName, Html) -> Bool -> Qualification -> Html -ppSigLike summary links loc leader doc docnames (typ, pp_typ) unicode qual = +             [DocName] -> [(DocName, Fixity)] -> (HsType DocName, Html) -> +             Bool -> Qualification -> Html +ppSigLike summary links loc leader doc docnames fixities (typ, pp_typ) unicode qual =    ppTypeOrFunSig summary links loc docnames typ doc -    ( leader <+> ppTypeSig summary occnames pp_typ unicode -    , concatHtml . punctuate comma $ map (ppBinder False) occnames +    ( addFixities $ leader <+> ppTypeSig summary occnames pp_typ unicode +    , addFixities . concatHtml . punctuate comma $ map (ppBinder False) occnames      , dcolon unicode      )      unicode qual    where      occnames = map (nameOccName . getName) docnames +    addFixities html +      | summary   = html +      | otherwise = ppFixities fixities qual <=> html  ppTypeOrFunSig :: Bool -> LinksInfo -> SrcSpan -> [DocName] -> HsType DocName @@ -144,6 +151,16 @@ ppTypeOrFunSig summary links loc docnames typ (doc, argDocs) (pref1, pref2, sep)      do_args n leader t        = [(leader <+> ppType unicode qual t, argDoc n, [])] +ppFixities :: [(DocName, Fixity)] -> Qualification -> Html +ppFixities fs qual = vcat $ map ppFix fs +  where +    ppFix (n, Fixity p d) = toHtml (ppDir d) <+> toHtml (show p) +                            <+> ppDocName qual Infix False n + +    ppDir InfixR = "infixr" +    ppDir InfixL = "infixl" +    ppDir InfixN = "infix" +  ppTyVars :: LHsTyVarBndrs DocName -> [Html]  ppTyVars tvs = map ppTyName (tyvarNames tvs) @@ -154,25 +171,28 @@ tyvarNames = map getName . hsLTyVarNames  ppFor :: Bool -> LinksInfo -> SrcSpan -> DocForDecl DocName -      -> ForeignDecl DocName -> Bool -> Qualification -> Html -ppFor summary links loc doc (ForeignImport (L _ name) (L _ typ) _ _) unicode qual -  = ppFunSig summary links loc doc [name] typ unicode qual -ppFor _ _ _ _ _ _ _ = error "ppFor" +      -> ForeignDecl DocName -> [(DocName, Fixity)] -> Bool -> Qualification -> Html +ppFor summary links loc doc (ForeignImport (L _ name) (L _ typ) _ _) fixities unicode qual +  = ppFunSig summary links loc doc [name] typ fixities unicode qual +ppFor _ _ _ _ _ _ _ _ = error "ppFor"  -- we skip type patterns for now -ppTySyn :: Bool -> LinksInfo -> SrcSpan -> DocForDecl DocName -> TyClDecl DocName -> Bool +ppTySyn :: Bool -> LinksInfo -> [(DocName, Fixity)] -> SrcSpan -> DocForDecl DocName -> TyClDecl DocName -> Bool          -> Qualification -> Html -ppTySyn summary links loc doc (SynDecl { tcdLName = L _ name, tcdTyVars = ltyvars -                                       , tcdRhs = ltype }) +ppTySyn summary links fixities loc doc (SynDecl { tcdLName = L _ name, tcdTyVars = ltyvars +                                                , tcdRhs = ltype })          unicode qual    = ppTypeOrFunSig summary links loc [name] (unLoc ltype) doc -                   (full, hdr, spaceHtml +++ equals) unicode qual +                   (fixs <=> full, fixs <=> hdr, spaceHtml +++ equals) unicode qual    where      hdr  = hsep ([keyword "type", ppBinder summary occ] ++ ppTyVars ltyvars)      full = hdr <+> equals <+> ppLType unicode qual ltype      occ  = nameOccName . getName $ name -ppTySyn _ _ _ _ _ _ _ = error "declaration not supported by ppTySyn" +    fixs +      | summary   = noHtml +      | otherwise = ppFixities fixities qual +ppTySyn _ _ _ _ _ _ _ _ = error "declaration not supported by ppTySyn"  ppTypeSig :: Bool -> [OccName] -> Html  -> Bool -> Html @@ -212,9 +232,10 @@ ppTyFamHeader summary associated d@(FamilyDecl { fdInfo = info      Nothing   -> noHtml    ) -ppTyFam :: Bool -> Bool -> LinksInfo -> [DocInstance DocName] -> SrcSpan -> Documentation DocName -> -              FamilyDecl DocName -> Bool -> Qualification -> Html -ppTyFam summary associated links instances loc doc decl unicode qual +ppTyFam :: Bool -> Bool -> LinksInfo -> [DocInstance DocName] -> +           [(DocName, Fixity)] -> SrcSpan -> Documentation DocName -> +           FamilyDecl DocName -> Bool -> Qualification -> Html +ppTyFam summary associated links instances fixities loc doc decl unicode qual    | summary   = ppTyFamHeader True associated decl unicode qual    | otherwise = header_ +++ docSection qual doc +++ instancesBit @@ -222,7 +243,8 @@ ppTyFam summary associated links instances loc doc decl unicode qual    where      docname = unLoc $ fdLName decl -    header_ = topDeclElem links loc [docname] (ppTyFamHeader summary associated decl unicode qual) +    header_ = topDeclElem links loc [docname] $ +      ppFixities fixities qual <=> ppTyFamHeader summary associated decl unicode qual      instancesBit        | FamilyDecl { fdInfo = ClosedTypeFamily eqns } <- decl @@ -244,10 +266,10 @@ ppTyFam summary associated links instances loc doc decl unicode qual  -------------------------------------------------------------------------------- -ppAssocType :: Bool -> LinksInfo -> DocForDecl DocName -> LFamilyDecl DocName -> Bool -            -> Qualification -> Html -ppAssocType summ links doc (L loc decl) unicode qual = -   ppTyFam summ True links [] loc (fst doc) decl unicode qual +ppAssocType :: Bool -> LinksInfo -> DocForDecl DocName -> LFamilyDecl DocName +            -> [(DocName, Fixity)] -> Bool -> Qualification -> Html +ppAssocType summ links doc (L loc decl) fixities unicode qual = +   ppTyFam summ True links [] fixities loc (fst doc) decl unicode qual  -------------------------------------------------------------------------------- @@ -363,12 +385,12 @@ ppShortClassDecl summary links (ClassDecl { tcdCtxt = lctxt, tcdLName = lname, t      else (if summary then id else topDeclElem links loc [nm]) (hdr <+> keyword "where")        +++ shortSubDecls            ( -            [ ppAssocType summary links doc at unicode qual | at <- ats +            [ ppAssocType summary links doc at [] unicode qual | at <- ats                , let doc = lookupAnySubdoc (unL $ fdLName $ unL at) subdocs ]  ++                  -- ToDo: add associated type defaults -            [ ppFunSig summary links loc doc names typ unicode qual +            [ ppFunSig summary links loc doc names typ [] unicode qual                | L _ (TypeSig lnames (L _ typ)) <- sigs                , let doc = lookupAnySubdoc (head names) subdocs                      names = map unLoc lnames ] @@ -383,10 +405,11 @@ ppShortClassDecl _ _ _ _ _ _ _ = error "declaration type not supported by ppShor -ppClassDecl :: Bool -> LinksInfo -> [DocInstance DocName] -> SrcSpan -            -> Documentation DocName -> [(DocName, DocForDecl DocName)] -            -> TyClDecl DocName -> Bool -> Qualification -> Html -ppClassDecl summary links instances loc d subdocs +ppClassDecl :: Bool -> LinksInfo -> [DocInstance DocName] -> [(DocName, Fixity)] +            -> SrcSpan -> Documentation DocName +            -> [(DocName, DocForDecl DocName)] -> TyClDecl DocName +            -> Bool -> Qualification -> Html +ppClassDecl summary links instances fixities loc d subdocs          decl@(ClassDecl { tcdCtxt = lctxt, tcdLName = lname, tcdTyVars = ltyvars                          , tcdFDs = lfds, tcdSigs = lsigs, tcdATs = ats }) unicode qual    | summary = ppShortClassDecl summary links decl loc subdocs unicode qual @@ -394,21 +417,29 @@ ppClassDecl summary links instances loc d subdocs                    +++ atBit +++ methodBit  +++ instancesBit    where      classheader -      | null lsigs = topDeclElem links loc [nm] (hdr unicode qual) -      | otherwise  = topDeclElem links loc [nm] (hdr unicode qual <+> keyword "where") +      | null lsigs = topDeclElem links loc [nm] (fixs <=> hdr unicode qual) +      | otherwise  = topDeclElem links loc [nm] (fixs <=> hdr unicode qual <+> keyword "where") + +    -- 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 unicode qual +    atBit = subAssociatedTypes [ ppAssocType summary links doc at subfixs unicode qual                        | at <- ats -                      , let doc = lookupAnySubdoc (unL $ fdLName $ unL at) subdocs ] +                      , 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 names typ unicode qual +    methodBit = subMethods [ ppFunSig summary links loc doc names typ subfixs unicode qual                             | L _ (TypeSig lnames (L _ typ)) <- lsigs                             , let doc = lookupAnySubdoc (head names) subdocs +                                 subfixs = [ f | n <- names +                                               , f@(n',_) <- fixities +                                               , n == n' ]                                   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 @@ -416,7 +447,7 @@ ppClassDecl summary links instances loc d subdocs      instancesBit = ppInstances instances nm unicode qual -ppClassDecl _ _ _ _ _ _ _ _ _ = error "declaration type not supported by ppShortClassDecl" +ppClassDecl _ _ _ _ _ _ _ _ _ _ = error "declaration type not supported by ppShortClassDecl"  ppInstances :: [DocInstance DocName] -> DocName -> Bool -> Qualification -> Html @@ -471,11 +502,11 @@ ppShortDataDecl summary dataInst dataDecl unicode qual      resTy     = (con_res . unLoc . head) cons -ppDataDecl :: Bool -> LinksInfo -> [DocInstance DocName] -> +ppDataDecl :: Bool -> LinksInfo -> [DocInstance DocName] -> [(DocName, Fixity)] ->                [(DocName, DocForDecl DocName)] ->                SrcSpan -> Documentation DocName -> TyClDecl DocName -> Bool ->                Qualification -> Html -ppDataDecl summary links instances subdocs loc doc dataDecl unicode qual +ppDataDecl summary links instances fixities subdocs loc doc dataDecl unicode qual    | summary   = ppShortDataDecl summary False dataDecl unicode qual    | otherwise = header_ +++ docSection qual doc +++ constrBit +++ instancesBit @@ -485,8 +516,10 @@ ppDataDecl summary links instances subdocs loc doc dataDecl unicode qual      cons      = dd_cons (tcdDataDefn dataDecl)      resTy     = (con_res . unLoc . head) cons -    header_ = topDeclElem links loc [docname] (ppDataHeader summary dataDecl unicode qual -             <+> whereBit) +    header_ = topDeclElem links loc [docname] (fix +             <=> ppDataHeader summary dataDecl unicode qual <+> whereBit) + +    fix = ppFixities (filter (\(n,_) -> n == docname) fixities) qual      whereBit        | null cons = noHtml @@ -495,7 +528,10 @@ ppDataDecl summary links instances subdocs loc doc dataDecl unicode qual          _ -> noHtml      constrBit = subConstructors qual -      (map (ppSideBySideConstr subdocs unicode qual) cons) +      [ ppSideBySideConstr subdocs subfixs unicode qual c +      | c  <- cons +      , let subfixs = filter (\(n,_) -> n == unLoc (con_name (unLoc c))) fixities +      ]      instancesBit = ppInstances instances docname unicode qual @@ -568,20 +604,20 @@ ppConstrHdr forall_ tvs ctxt unicode qual        Implicit -> noHtml -ppSideBySideConstr :: [(DocName, DocForDecl DocName)] -> Bool -> Qualification -                   -> LConDecl DocName -> SubDecl -ppSideBySideConstr subdocs unicode qual (L _ con) = (decl, mbDoc, fieldPart) +ppSideBySideConstr :: [(DocName, DocForDecl DocName)] -> [(DocName, Fixity)] +                   -> Bool -> Qualification -> LConDecl DocName -> SubDecl +ppSideBySideConstr subdocs fixities unicode qual (L _ con) = (decl, mbDoc, fieldPart)   where      decl = case con_res con of        ResTyH98 -> case con_details con of          PrefixCon args -> -          hsep ((header_ unicode qual +++ ppBinder False occ) +          hsep ((header_ +++ ppBinder False occ)              : map (ppLParendType unicode qual) args) -        RecCon _ -> header_ unicode qual +++ ppBinder False occ +        RecCon _ -> header_ +++ ppBinder False occ          InfixCon arg1 arg2 -> -          hsep [header_ unicode qual +++ ppLParendType unicode qual arg1, +          hsep [header_ +++ ppLParendType unicode qual arg1,              ppBinderInfix False occ,              ppLParendType unicode qual arg2] @@ -599,12 +635,13 @@ ppSideBySideConstr subdocs unicode qual (L _ con) = (decl, mbDoc, fieldPart)      doRecordFields fields = subFields qual        (map (ppSideBySideField subdocs unicode qual) fields)      doGADTCon :: [LHsType DocName] -> Located (HsType DocName) -> Html -    doGADTCon args resTy = +    doGADTCon args resTy = fixity <=>        ppBinder False occ <+> dcolon unicode          <+> hsep [ppForAll forall_ ltvs (con_cxt con) unicode qual,                    ppLType unicode qual (foldr mkFunTy resTy args) ] -    header_ = ppConstrHdr forall_ tyVars context +    fixity  = ppFixities fixities qual +    header_ = fixity <=> ppConstrHdr forall_ tyVars context unicode qual      occ     = nameOccName . getName . unLoc . con_name $ con      ltvs    = con_qvars con      tyVars  = tyvarNames (con_qvars con) diff --git a/src/Haddock/Backends/Xhtml/Utils.hs b/src/Haddock/Backends/Xhtml/Utils.hs index 232e18cc..cbcbbd6d 100644 --- a/src/Haddock/Backends/Xhtml/Utils.hs +++ b/src/Haddock/Backends/Xhtml/Utils.hs @@ -17,13 +17,13 @@ module Haddock.Backends.Xhtml.Utils (    spliceURL,    groupId, -  (<+>), char, +  (<+>), (<=>), char,    keyword, punctuate,    braces, brackets, pabrackets, parens, parenList, ubxParenList,    arrow, comma, dcolon, dot, darrow, equals, forallSymbol, quote, -  hsep, +  hsep, vcat,    collapseSection, collapseToggle, collapseControl,  ) where @@ -100,6 +100,11 @@ hsep :: [Html] -> Html  hsep [] = noHtml  hsep htmls = foldr1 (\a b -> a+++" "+++b) htmls +-- | Concatenate a series of 'Html' values vertically, with linebreaks in between. +vcat :: [Html] -> Html +vcat [] = noHtml +vcat htmls = foldr1 (\a b -> a+++br+++b) htmls +  infixr 8 <+>  (<+>) :: Html -> Html -> Html @@ -107,6 +112,14 @@ a <+> b = a +++ sep +++ b    where      sep = if isNoHtml a || isNoHtml b then noHtml else toHtml " " +-- | Join two 'Html' values together with a linebreak in between. +--   Has 'noHtml' as left identity. +infixr 8 <=> +(<=>) :: Html -> Html -> Html +a <=> b = a +++ sep +++ b +  where +    sep = if isNoHtml a then noHtml else br +  keyword :: String -> Html  keyword s = thespan ! [theclass "keyword"] << toHtml s  | 
