diff options
Diffstat (limited to 'haddock-api/src/Haddock/Backends')
| -rw-r--r-- | haddock-api/src/Haddock/Backends/Hoogle.hs | 126 | ||||
| -rw-r--r-- | haddock-api/src/Haddock/Backends/Hyperlinker.hs | 6 | ||||
| -rw-r--r-- | haddock-api/src/Haddock/Backends/Hyperlinker/Parser.hs | 18 | ||||
| -rw-r--r-- | haddock-api/src/Haddock/Backends/Hyperlinker/Utils.hs | 2 | ||||
| -rw-r--r-- | haddock-api/src/Haddock/Backends/LaTeX.hs | 122 | ||||
| -rw-r--r-- | haddock-api/src/Haddock/Backends/Xhtml/Decl.hs | 149 | ||||
| -rw-r--r-- | haddock-api/src/Haddock/Backends/Xhtml/Utils.hs | 9 | 
7 files changed, 260 insertions, 172 deletions
| diff --git a/haddock-api/src/Haddock/Backends/Hoogle.hs b/haddock-api/src/Haddock/Backends/Hoogle.hs index c114e84d..3bf12477 100644 --- a/haddock-api/src/Haddock/Backends/Hoogle.hs +++ b/haddock-api/src/Haddock/Backends/Hoogle.hs @@ -18,8 +18,9 @@ module Haddock.Backends.Hoogle (      ppHoogle    ) where -import GHC.Types.Basic ( OverlapFlag(..), OverlapMode(..), SourceText(..) -                  , PromotionFlag(..), TopLevelFlag(..) ) +import GHC.Types.Basic ( OverlapFlag(..), OverlapMode(..), +                         PromotionFlag(..), TopLevelFlag(..) ) +import GHC.Types.SourceText  import GHC.Core.InstEnv (ClsInst(..))  import Documentation.Haddock.Markup  import Haddock.GhcUtils @@ -27,8 +28,11 @@ import Haddock.Types hiding (Version)  import Haddock.Utils hiding (out)  import GHC +import GHC.Driver.Ppr  import GHC.Utils.Outputable as Outputable +import GHC.Utils.Panic  import GHC.Parser.Annotation (IsUnicodeSyntax(..)) +import GHC.Unit.State  import Data.Char  import Data.List @@ -37,15 +41,14 @@ import Data.Version  import System.Directory  import System.FilePath -  prefix :: [String]  prefix = ["-- Hoogle documentation, generated by Haddock"           ,"-- See Hoogle, http://www.haskell.org/hoogle/"           ,""] -ppHoogle :: DynFlags -> String -> Version -> String -> Maybe (Doc RdrName) -> [Interface] -> FilePath -> IO () -ppHoogle dflags package version synopsis prologue ifaces odir = do +ppHoogle :: DynFlags -> UnitState -> String -> Version -> String -> Maybe (Doc RdrName) -> [Interface] -> FilePath -> IO () +ppHoogle dflags unit_state package version synopsis prologue ifaces odir = do      let -- Since Hoogle is line based, we want to avoid breaking long lines.          dflags' = dflags{ pprCols = maxBound }          filename = package ++ ".txt" @@ -54,42 +57,46 @@ ppHoogle dflags package version synopsis prologue ifaces odir = do                     ["@package " ++ package] ++                     ["@version " ++ showVersion version                     | not (null (versionBranch version)) ] ++ -                   concat [ppModule dflags' i | i <- ifaces, OptHide `notElem` ifaceOptions i] +                   concat [ppModule dflags' unit_state i | i <- ifaces, OptHide `notElem` ifaceOptions i]      createDirectoryIfMissing True odir      writeUtf8File (odir </> filename) (unlines contents) -ppModule :: DynFlags -> Interface -> [String] -ppModule dflags iface = +ppModule :: DynFlags -> UnitState -> Interface -> [String] +ppModule dflags unit_state iface =    "" : ppDocumentation dflags (ifaceDoc iface) ++    ["module " ++ moduleString (ifaceMod iface)] ++    concatMap (ppExport dflags) (ifaceExportItems iface) ++ -  concatMap (ppInstance dflags) (ifaceInstances iface) +  concatMap (ppInstance dflags unit_state) (ifaceInstances iface)  ---------------------------------------------------------------------  -- Utility functions -dropHsDocTy :: HsType a -> HsType a -dropHsDocTy = f +dropHsDocTy :: HsSigType (GhcPass p) -> HsSigType (GhcPass p) +dropHsDocTy = drop_sig_ty      where -        g (L src x) = L src (f x) -        f (HsForAllTy x a e) = HsForAllTy x a (g e) -        f (HsQualTy x a e) = HsQualTy x a (g e) -        f (HsBangTy x a b) = HsBangTy x a (g b) -        f (HsAppTy x a b) = HsAppTy x (g a) (g b) -        f (HsAppKindTy x a b) = HsAppKindTy x (g a) (g b) -        f (HsFunTy x w a b) = HsFunTy x w (g a) (g b) -        f (HsListTy x a) = HsListTy x (g a) -        f (HsTupleTy x a b) = HsTupleTy x a (map g b) -        f (HsOpTy x a b c) = HsOpTy x (g a) b (g c) -        f (HsParTy x a) = HsParTy x (g a) -        f (HsKindSig x a b) = HsKindSig x (g a) b -        f (HsDocTy _ a _) = f $ unLoc a -        f x = x - -outHsType :: (OutputableBndrId p) -          => DynFlags -> HsType (GhcPass p) -> String -outHsType dflags = out dflags . reparenType . dropHsDocTy +        drop_sig_ty (HsSig x a b)  = HsSig x a (drop_lty b) +        drop_sig_ty x@XHsSigType{} = x + +        drop_lty (L src x) = L src (drop_ty x) + +        drop_ty (HsForAllTy x a e) = HsForAllTy x a (drop_lty e) +        drop_ty (HsQualTy x a e) = HsQualTy x a (drop_lty e) +        drop_ty (HsBangTy x a b) = HsBangTy x a (drop_lty b) +        drop_ty (HsAppTy x a b) = HsAppTy x (drop_lty a) (drop_lty b) +        drop_ty (HsAppKindTy x a b) = HsAppKindTy x (drop_lty a) (drop_lty b) +        drop_ty (HsFunTy x w a b) = HsFunTy x w (drop_lty a) (drop_lty b) +        drop_ty (HsListTy x a) = HsListTy x (drop_lty a) +        drop_ty (HsTupleTy x a b) = HsTupleTy x a (map drop_lty b) +        drop_ty (HsOpTy x a b c) = HsOpTy x (drop_lty a) b (drop_lty c) +        drop_ty (HsParTy x a) = HsParTy x (drop_lty a) +        drop_ty (HsKindSig x a b) = HsKindSig x (drop_lty a) b +        drop_ty (HsDocTy _ a _) = drop_ty $ unL a +        drop_ty x = x + +outHsSigType :: (OutputableBndrId p, NoGhcTcPass p ~ p) +             => DynFlags -> HsSigType (GhcPass p) -> String +outHsSigType dflags = out dflags . reparenSigType . dropHsDocTy  dropComment :: String -> String @@ -106,14 +113,14 @@ outWith p = f . unwords . map (dropWhile isSpace) . lines . p . ppr          f [] = []  out :: Outputable a => DynFlags -> a -> String -out dflags = outWith $ showSDocUnqual dflags +out dflags = outWith $ showSDoc dflags  operator :: String -> String  operator (x:xs) | not (isAlphaNum x) && x `notElem` "_' ([{" = '(' : x:xs ++ ")"  operator x = x  commaSeparate :: Outputable a => DynFlags -> [a] -> String -commaSeparate dflags = showSDocUnqual dflags . interpp'SP +commaSeparate dflags = showSDoc dflags . interpp'SP  ---------------------------------------------------------------------  -- How to print each export @@ -133,8 +140,8 @@ ppExport dflags ExportDecl { expItemDecl    = L _ decl          f (TyClD _ d@SynDecl{})   = ppSynonym dflags d          f (TyClD _ d@ClassDecl{}) = ppClass dflags d subdocs          f (TyClD _ (FamDecl _ d)) = ppFam dflags d -        f (ForD _ (ForeignImport _ name typ _)) = [pp_sig dflags [name] (hsSigType typ)] -        f (ForD _ (ForeignExport _ name typ _)) = [pp_sig dflags [name] (hsSigType typ)] +        f (ForD _ (ForeignImport _ name typ _)) = [pp_sig dflags [name] typ] +        f (ForD _ (ForeignExport _ name typ _)) = [pp_sig dflags [name] typ]          f (SigD _ sig) = ppSig dflags sig          f _ = [] @@ -143,8 +150,8 @@ ppExport _ _ = []  ppSigWithDoc :: DynFlags -> Sig GhcRn -> [(Name, DocForDecl Name)] -> [String]  ppSigWithDoc dflags sig subdocs = case sig of -    TypeSig _ names t -> concatMap (mkDocSig "" (hsSigWcType t)) names -    PatSynSig _ names t -> concatMap (mkDocSig "pattern " (hsSigType t)) names +    TypeSig _ names t -> concatMap (mkDocSig "" (dropWildCards t)) names +    PatSynSig _ names t -> concatMap (mkDocSig "pattern " t) names      _ -> []    where      mkDocSig leader typ n = mkSubdoc dflags n subdocs @@ -153,9 +160,9 @@ ppSigWithDoc dflags sig subdocs = case sig of  ppSig :: DynFlags -> Sig GhcRn -> [String]  ppSig dflags x  = ppSigWithDoc dflags x [] -pp_sig :: DynFlags -> [Located Name] -> LHsType GhcRn -> String +pp_sig :: DynFlags -> [Located Name] -> LHsSigType GhcRn -> String  pp_sig dflags names (L _ typ)  = -    operator prettyNames ++ " :: " ++ outHsType dflags typ +    operator prettyNames ++ " :: " ++ outHsSigType dflags typ      where        prettyNames = intercalate ", " $ map (out dflags) names @@ -173,7 +180,7 @@ ppClass dflags decl subdocs =          ppTyFams              | null $ tcdATs decl = "" -            | otherwise = (" " ++) . showSDocUnqual dflags . whereWrapper $ concat +            | otherwise = (" " ++) . showSDoc dflags . whereWrapper $ concat                  [ map pprTyFam (tcdATs decl)                  , map (pprTyFamInstDecl NotTopLevel . unLoc) (tcdATDefs decl)                  ] @@ -198,9 +205,9 @@ ppFam dflags decl@(FamilyDecl { fdInfo = info })                ClosedTypeFamily{} -> decl { fdInfo = OpenTypeFamily }                _                  -> decl -ppInstance :: DynFlags -> ClsInst -> [String] -ppInstance dflags x = -  [dropComment $ outWith (showSDocForUser dflags alwaysQualify) cls] +ppInstance :: DynFlags -> UnitState -> ClsInst -> [String] +ppInstance dflags unit_state x = +  [dropComment $ outWith (showSDocForUser dflags unit_state alwaysQualify) cls]    where      -- As per #168, we don't want safety information about the class      -- in Hoogle output. The easiest way to achieve this is to set the @@ -234,13 +241,13 @@ lookupCon dflags subdocs (L _ name) = case lookup name subdocs of    _ -> []  ppCtor :: DynFlags -> TyClDecl GhcRn -> [(Name, DocForDecl Name)] -> ConDecl GhcRn -> [String] -ppCtor dflags dat subdocs con@ConDeclH98 {} +ppCtor dflags dat subdocs con@ConDeclH98 { con_args = con_args' }    -- AZ:TODO get rid of the concatMap -   = concatMap (lookupCon dflags subdocs) [con_name con] ++ f (getConArgs con) +   = concatMap (lookupCon dflags subdocs) [con_name con] ++ f con_args'      where -        f (PrefixCon args) = [typeSig name $ (map hsScaledThing args) ++ [resType]] -        f (InfixCon a1 a2) = f $ PrefixCon [a1,a2] -        f (RecCon (L _ recs)) = f (PrefixCon $ map (hsLinear . cd_fld_type . unLoc) recs) ++ concat +        f (PrefixCon _ args) = [typeSig name $ (map hsScaledThing args) ++ [resType]] +        f (InfixCon a1 a2) = f $ PrefixCon [] [a1,a2] +        f (RecCon (L _ recs)) = f (PrefixCon [] $ map (hsLinear . cd_fld_type . unLoc) recs) ++ concat                            [(concatMap (lookupCon dflags subdocs . noLoc . extFieldOcc . unLoc) (cd_fld_names r)) ++                             [out dflags (map (extFieldOcc . unLoc) $ cd_fld_names r) `typeSig` [resType, cd_fld_type r]]                            | r <- map unLoc recs] @@ -248,11 +255,12 @@ ppCtor dflags dat subdocs con@ConDeclH98 {}          funs = foldr1 (\x y -> reL $ HsFunTy noExtField (HsUnrestrictedArrow NormalSyntax) x y)          apps = foldl1 (\x y -> reL $ HsAppTy noExtField x y) -        typeSig nm flds = operator nm ++ " :: " ++ outHsType dflags (unL $ funs flds) +        typeSig nm flds = operator nm ++ " :: " ++ +                          outHsSigType dflags (unL $ mkEmptySigType $ funs flds)          -- We print the constructors as comma-separated list. See GHC          -- docs for con_names on why it is a list to begin with. -        name = commaSeparate dflags . map unLoc $ getConNames con +        name = commaSeparate dflags . map unL $ getConNames con          tyVarArg (UserTyVar _ _ n) = HsTyVar noExtField NotPromoted n          tyVarArg (KindedTyVar _ _ n lty) = HsKindSig noExtField (reL (HsTyVar noExtField NotPromoted n)) lty @@ -262,13 +270,23 @@ ppCtor dflags dat subdocs con@ConDeclH98 {}                          (HsTyVar noExtField NotPromoted (reL (tcdName dat))) :                          map (tyVarArg . unLoc) (hsQTvExplicit $ tyClDeclTyVars dat) -ppCtor dflags _dat subdocs con@(ConDeclGADT { }) -   = concatMap (lookupCon dflags subdocs) (getConNames con) ++ f +ppCtor dflags _dat subdocs (ConDeclGADT { con_names = names +                                        , con_bndrs = L _ outer_bndrs +                                        , con_mb_cxt = mcxt +                                        , con_g_args = args +                                        , con_res_ty = res_ty }) +   = concatMap (lookupCon dflags subdocs) names ++ [typeSig]      where -        f = [typeSig name (getGADTConTypeG con)] - -        typeSig nm ty = operator nm ++ " :: " ++ outHsType dflags (unLoc ty) -        name = out dflags $ map unLoc $ getConNames con +        typeSig = operator name ++ " :: " ++ outHsSigType dflags con_sig_ty +        name = out dflags $ map unL names +        con_sig_ty = HsSig noExtField outer_bndrs theta_ty where +          theta_ty = case mcxt of +            Just theta -> noLoc (HsQualTy { hst_xqual = noExtField, hst_ctxt = theta, hst_body = tau_ty }) +            Nothing -> tau_ty +          tau_ty = foldr mkFunTy res_ty $ +            case args of PrefixConGADT pos_args -> map hsScaledThing pos_args +                         RecConGADT (L _ flds) -> map (cd_fld_type . unL) flds +          mkFunTy a b = noLoc (HsFunTy noExtField (HsUnrestrictedArrow NormalSyntax) a b)  ppFixity :: DynFlags -> (Name, Fixity) -> [String]  ppFixity dflags (name, fixity) = [out dflags ((FixitySig noExtField [noLoc name] fixity) :: FixitySig GhcRn)] diff --git a/haddock-api/src/Haddock/Backends/Hyperlinker.hs b/haddock-api/src/Haddock/Backends/Hyperlinker.hs index 6ef07434..8ecc185b 100644 --- a/haddock-api/src/Haddock/Backends/Hyperlinker.hs +++ b/haddock-api/src/Haddock/Backends/Hyperlinker.hs @@ -18,7 +18,7 @@ import Data.Maybe  import System.Directory  import System.FilePath -import GHC.Iface.Ext.Types  ( HieFile(..), HieASTs(..), HieAST(..), NodeInfo(..), SourcedNodeInfo(..) ) +import GHC.Iface.Ext.Types  import GHC.Iface.Ext.Binary ( readHieFile, hie_file_result, NameCacheUpdater(..))  import GHC.Types.SrcLoc     ( realSrcLocSpan, mkRealSrcLoc )  import Data.Map as M @@ -70,10 +70,10 @@ ppHyperlinkedModuleSource verbosity srcdir pretty srcs iface = case ifaceHieFile          -- Get the AST and tokens corresponding to the source file we want          let fileFs = mkFastString file              mast | M.size asts == 1 = snd <$> M.lookupMin asts -                 | otherwise        = M.lookup fileFs asts +                 | otherwise        = M.lookup (HiePath (mkFastString file)) asts +            tokens = parse df file rawSrc              ast = fromMaybe (emptyHieAst fileFs) mast              fullAst = recoverFullIfaceTypes df types ast -            tokens = parse df file rawSrc          -- Warn if we didn't find an AST, but there were still ASTs          if M.null asts diff --git a/haddock-api/src/Haddock/Backends/Hyperlinker/Parser.hs b/haddock-api/src/Haddock/Backends/Hyperlinker/Parser.hs index 3db3c685..d3f3b79b 100644 --- a/haddock-api/src/Haddock/Backends/Hyperlinker/Parser.hs +++ b/haddock-api/src/Haddock/Backends/Hyperlinker/Parser.hs @@ -10,15 +10,18 @@ import Data.List           ( isPrefixOf, isSuffixOf )  import qualified Data.ByteString as BS -import GHC.Types.Basic     ( IntegralLit(..) ) +import GHC.Types.SourceText  import GHC.Driver.Session  import GHC.Utils.Error     ( pprLocErrMsg )  import GHC.Data.FastString ( mkFastString ) +import GHC.Parser.Errors.Ppr ( pprError )  import GHC.Parser.Lexer    as Lexer                             ( P(..), ParseResult(..), PState(..), Token(..) -                           , mkPStatePure, lexer, mkParserFlags', getErrorMessages) +                           , initParserState, lexer, mkParserOpts, getErrorMessages)  import GHC.Data.Bag         ( bagToList ) -import GHC.Utils.Outputable ( showSDoc, panic, text, ($$) ) +import GHC.Utils.Outputable ( text, ($$) ) +import GHC.Utils.Panic      ( panic ) +import GHC.Driver.Ppr       ( showSDoc )  import GHC.Types.SrcLoc  import GHC.Data.StringBuffer ( StringBuffer, atEnd ) @@ -37,17 +40,16 @@ parse  parse dflags fpath bs = case unP (go False []) initState of      POk _ toks -> reverse toks      PFailed pst -> -      let err:_ = bagToList (getErrorMessages pst dflags) in +      let err:_ = bagToList (fmap pprError (getErrorMessages pst)) in        panic $ showSDoc dflags $          text "Hyperlinker parse error:" $$ pprLocErrMsg err    where -    initState = mkPStatePure pflags buf start +    initState = initParserState pflags buf start      buf = stringBufferFromByteString bs      start = mkRealSrcLoc (mkFastString fpath) 1 1 -    pflags = mkParserFlags' (warningFlags dflags) +    pflags = mkParserOpts   (warningFlags dflags)                              (extensionFlags dflags) -                            (homeUnitId dflags)                              (safeImportsOn dflags)                              False -- lex Haddocks as comment tokens                              True  -- produce comment tokens @@ -240,7 +242,6 @@ classify tok =      ITline_prag         {} -> TkPragma      ITcolumn_prag       {} -> TkPragma      ITscc_prag          {} -> TkPragma -    ITgenerated_prag    {} -> TkPragma      ITunpack_prag       {} -> TkPragma      ITnounpack_prag     {} -> TkPragma      ITann_prag          {} -> TkPragma @@ -381,7 +382,6 @@ inPragma False tok =      ITline_prag         {} -> True      ITcolumn_prag       {} -> True      ITscc_prag          {} -> True -    ITgenerated_prag    {} -> True      ITunpack_prag       {} -> True      ITnounpack_prag     {} -> True      ITann_prag          {} -> True diff --git a/haddock-api/src/Haddock/Backends/Hyperlinker/Utils.hs b/haddock-api/src/Haddock/Backends/Hyperlinker/Utils.hs index b093b5a4..5c3bddef 100644 --- a/haddock-api/src/Haddock/Backends/Hyperlinker/Utils.hs +++ b/haddock-api/src/Haddock/Backends/Hyperlinker/Utils.hs @@ -21,7 +21,7 @@ import GHC  import GHC.Iface.Ext.Types ( HieAST(..), HieType(..), HieArgs(..), TypeIndex, HieTypeFlat )  import GHC.Iface.Type  import GHC.Types.Name      ( getOccFS, getOccString ) -import GHC.Utils.Outputable( showSDoc ) +import GHC.Driver.Ppr      ( showSDoc )  import GHC.Types.Var       ( VarBndr(..) )  import System.FilePath.Posix ((</>), (<.>)) diff --git a/haddock-api/src/Haddock/Backends/LaTeX.hs b/haddock-api/src/Haddock/Backends/LaTeX.hs index df81fd6e..0df7aac3 100644 --- a/haddock-api/src/Haddock/Backends/LaTeX.hs +++ b/haddock-api/src/Haddock/Backends/LaTeX.hs @@ -31,7 +31,7 @@ import GHC.Types.Name        ( nameOccName )  import GHC.Types.Name.Reader ( rdrNameOcc )  import GHC.Core.Type         ( Specificity(..) )  import GHC.Data.FastString   ( unpackFS ) -import GHC.Utils.Outputable  ( panic) +import GHC.Utils.Panic       ( panic)  import qualified Data.Map as Map  import System.Directory @@ -108,7 +108,7 @@ type LaTeX = Pretty.Doc  -- | Default way of rendering a 'LaTeX'. The width is 90 by default (since 100  -- often overflows the line).  latex2String :: LaTeX -> String -latex2String = fullRender PageMode 90 1 txtPrinter "" +latex2String = fullRender (PageMode True) 90 1 txtPrinter ""  ppLaTeXTop     :: String @@ -177,7 +177,7 @@ ppLaTeXModule _title odir iface = do        body = processExports exports    -- -  writeUtf8File (odir </> moduleLaTeXFile mdl) (show tex) +  writeUtf8File (odir </> moduleLaTeXFile mdl) (fullRender (PageMode True) 80 1 txtPrinter "" tex)  -- | Prints out an entry in a module export list.  exportListItem :: ExportItem DocNameI -> LaTeX @@ -215,10 +215,10 @@ processExports (e : es) =    processExport e $$ processExports es -isSimpleSig :: ExportItem DocNameI -> Maybe ([DocName], HsType DocNameI) +isSimpleSig :: ExportItem DocNameI -> Maybe ([DocName], HsSigType DocNameI)  isSimpleSig ExportDecl { expItemDecl = L _ (SigD _ (TypeSig _ lnames t))                         , expItemMbDoc = (Documentation Nothing Nothing, argDocs) } -  | Map.null argDocs = Just (map unLoc lnames, unLoc (hsSigWcType t)) +  | Map.null argDocs = Just (map unLoc lnames, unLoc (dropWildCards t))  isSimpleSig _ = Nothing @@ -301,7 +301,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 Nothing (doc, fnArgsDoc) (map unLoc lnames) (hsSigWcType ty) unicode +  SigD _ (TypeSig _ lnames ty)   -> ppFunSig Nothing (doc, fnArgsDoc) (map unLoc lnames) (dropWildCards ty) unicode    SigD _ (PatSynSig _ lnames ty) -> ppLPatSig (doc, fnArgsDoc) (map unLoc lnames) ty unicode    ForD _ d                       -> ppFor (doc, fnArgsDoc) d unicode    InstD _ _                      -> empty @@ -313,7 +313,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 Nothing doc [name] (hsSigTypeI typ) unicode +  ppFunSig Nothing doc [name] typ unicode  ppFor _ _ _ = error "ppFor error in Haddock.Backends.LaTeX"  --  error "foreign declarations are currently not supported by --latex" @@ -350,9 +350,9 @@ ppFamDecl associated doc instances decl unicode =      -- Individual equations of a closed type family      ppFamDeclEqn :: TyFamInstEqn DocNameI -> LaTeX -    ppFamDeclEqn (HsIB { hsib_body = FamEqn { feqn_tycon = L _ n -                                            , feqn_rhs = rhs -                                            , feqn_pats = ts } }) +    ppFamDeclEqn (FamEqn { feqn_tycon = L _ n +                         , feqn_rhs = rhs +                         , feqn_pats = ts })        = hsep [ ppAppNameTypeArgs n ts unicode               , equals               , ppType unicode (unLoc rhs) @@ -407,7 +407,7 @@ ppTySyn :: DocForDecl DocName -> TyClDecl DocNameI -> Bool -> LaTeX  ppTySyn doc (SynDecl { tcdLName = L _ name, tcdTyVars = ltyvars                           , tcdRhs = ltype }) unicode -  = ppTypeOrFunSig (unLoc ltype) doc (full, hdr, char '=') unicode +  = ppTypeOrFunSig (mkHsImplicitSigTypeI ltype) doc (full, hdr, char '=') unicode    where      hdr  = hsep (keyword "type"                   : ppDocBinder name @@ -426,7 +426,7 @@ 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 +  -> LHsSigType DocNameI -- ^ type of the pattern synonym    -> Bool                -- ^ unicode    -> LaTeX  ppFunSig leader doc docnames (L _ typ) unicode = @@ -447,11 +447,11 @@ ppLPatSig :: DocForDecl DocName  -- ^ documentation            -> Bool                -- ^ unicode            -> LaTeX  ppLPatSig doc docnames ty unicode -  = ppFunSig (Just (keyword "pattern")) doc docnames (hsSigTypeI ty) unicode +  = ppFunSig (Just (keyword "pattern")) doc docnames ty unicode  -- | Pretty-print a type, adding documentation to the whole type and its  -- arguments as needed. -ppTypeOrFunSig :: HsType DocNameI +ppTypeOrFunSig :: HsSigType DocNameI                 -> DocForDecl DocName  -- ^ documentation                 -> ( LaTeX             --   first-line (no-argument docs only)                    , LaTeX             --   first-line (argument docs only) @@ -471,13 +471,24 @@ ppTypeOrFunSig typ (doc, argDocs) (pref1, pref2, sep0) unicode  -- to the arguments. The output is a list of (leader/seperator, argument and  -- its doc)  ppSubSigLike :: Bool                  -- ^ unicode -             -> HsType DocNameI       -- ^ type signature +             -> HsSigType DocNameI    -- ^ type signature               -> FnArgsDoc DocName     -- ^ docs to add               -> [(DocName, DocForDecl DocName)] -- ^ all subdocs (useful when we have `HsRecTy`)               -> LaTeX                 -- ^ seperator (beginning of first line)               -> [(LaTeX, LaTeX)]      -- ^ arguments (leader/sep, type) -ppSubSigLike unicode typ argDocs subdocs leader = do_args 0 leader typ +ppSubSigLike unicode typ argDocs subdocs leader = do_sig_args 0 leader typ    where +    do_sig_args :: Int -> LaTeX -> HsSigType DocNameI -> [(LaTeX, LaTeX)] +    do_sig_args n leader (HsSig { sig_bndrs = outer_bndrs, sig_body = ltype }) = +      case outer_bndrs of +        HsOuterExplicit{hso_bndrs = bndrs} -> +          [ ( decltt leader +            , decltt (ppHsForAllTelescope (mkHsForAllInvisTeleI bndrs) unicode) +                <+> ppLType unicode ltype +            ) ] +        HsOuterImplicit{} -> do_largs n leader ltype + +    do_largs :: Int -> LaTeX -> LHsType DocNameI -> [(LaTeX, LaTeX)]      do_largs n leader (L _ t) = do_args n leader t      arg_doc n = rDoc . fmap _doc $ Map.lookup n argDocs @@ -515,12 +526,16 @@ ppSubSigLike unicode typ argDocs subdocs leader = do_args 0 leader typ      gadtOpen = char '{' -ppTypeSig :: [Name] -> HsType DocNameI  -> Bool -> LaTeX +ppTypeSig :: [Name] -> HsSigType DocNameI  -> Bool -> LaTeX  ppTypeSig nms ty unicode =    hsep (punctuate comma $ map ppSymName nms)      <+> dcolon unicode -    <+> ppType unicode ty +    <+> ppSigType unicode ty +ppHsOuterTyVarBndrs :: HsOuterTyVarBndrs flag DocNameI -> Bool -> LaTeX +ppHsOuterTyVarBndrs (HsOuterImplicit{}) _ = empty +ppHsOuterTyVarBndrs (HsOuterExplicit{hso_bndrs = bndrs}) unicode = +    hsep (forallSymbol unicode : ppTyVars bndrs) <> dot  ppHsForAllTelescope :: HsForAllTelescope DocNameI -> Bool -> LaTeX  ppHsForAllTelescope tele unicode = case tele of @@ -635,7 +650,7 @@ ppClassDecl instances doc subdocs      methodTable =        text "\\haddockpremethods{}" <> emph (text "Methods") $$ -      vcat  [ ppFunSig leader doc names (hsSigTypeI typ) unicode +      vcat  [ ppFunSig leader doc names typ unicode              | L _ (ClassOpSig _ is_def lnames typ) <- lsigs              , let doc | is_def = noDocForDecl                        | otherwise = lookupAnySubdoc (head names) subdocs @@ -795,7 +810,7 @@ ppSideBySideConstr subdocs unicode leader (L _ con) =                           header_ = ppConstrHdr forall_ tyVars context unicode                       in case det of          -- Prefix constructor, e.g. 'Just a' -        PrefixCon args +        PrefixCon _ args            | hasArgDocs -> header_ <+> ppOcc            | otherwise -> hsep [ header_                                , ppOcc @@ -819,23 +834,25 @@ ppSideBySideConstr subdocs unicode leader (L _ con) =          | otherwise -> hsep [ ppOcc                              , dcolon unicode                              -- ++AZ++ make this prepend "{..}" when it is a record style GADT -                            , ppLType unicode (getGADTConType con) +                            , ppLSigType unicode (getGADTConType con)                              ] -    fieldPart = case (con, getConArgsI con) of -        -- Record style GADTs -        (ConDeclGADT{}, RecCon _)            -> doConstrArgsWithDocs [] - -        -- Regular record declarations -        (_, RecCon (L _ fields))             -> doRecordFields fields - -        -- Any GADT or a regular H98 prefix data constructor -        (_, PrefixCon args)     | hasArgDocs -> doConstrArgsWithDocs (map hsScaledThing args) - -        -- An infix H98 data constructor -        (_, InfixCon arg1 arg2) | hasArgDocs -> doConstrArgsWithDocs (map hsScaledThing [arg1,arg2]) - -        _ -> empty +    fieldPart = case con of +        ConDeclGADT{con_g_args = con_args'} -> case con_args' of +          -- GADT record declarations +          RecConGADT _                    -> doConstrArgsWithDocs [] +          -- GADT prefix data constructors +          PrefixConGADT args | hasArgDocs -> doConstrArgsWithDocs (map hsScaledThing args) +          _                               -> empty + +        ConDeclH98{con_args = con_args'} -> case con_args' of +          -- H98 record declarations +          RecCon (L _ fields)             -> doRecordFields fields +          -- H98 prefix data constructors +          PrefixCon _ args | hasArgDocs   -> doConstrArgsWithDocs (map hsScaledThing args) +          -- H98 infix data constructor +          InfixCon arg1 arg2 | hasArgDocs -> doConstrArgsWithDocs (map hsScaledThing [arg1,arg2]) +          _                               -> empty      doRecordFields fields =        vcat [ empty <-> tt (text begin) <+> ppSideBySideField subdocs unicode field <+> nl @@ -892,18 +909,16 @@ ppSideBySidePat lnames typ (doc, argDocs) unicode =           | otherwise = hsep [ keyword "pattern"                              , ppOcc                              , dcolon unicode -                            , ppLType unicode (hsSigTypeI typ) +                            , ppLSigType unicode typ                              ]      fieldPart        | not hasArgDocs = empty        | otherwise = vcat            [ empty <-> text "\\qquad" <+> l <+> text "\\enspace" <+> r -          | (l,r) <- ppSubSigLike unicode (unLoc patTy) argDocs [] (dcolon unicode) +          | (l,r) <- ppSubSigLike unicode (unLoc typ) argDocs [] (dcolon unicode)            ] -    patTy = hsSigTypeI typ -      mDoc = fmap _doc $ combineDocumentation doc @@ -1024,12 +1039,18 @@ ppLType       unicode y = ppType unicode (unLoc y)  ppLParendType unicode y = ppParendType unicode (unLoc y)  ppLFunLhType  unicode y = ppFunLhType unicode (unLoc y) +ppLSigType :: Bool -> LHsSigType DocNameI -> LaTeX +ppLSigType unicode y = ppSigType unicode (unLoc y) +  ppType, ppParendType, ppFunLhType, ppCtxType :: Bool -> HsType DocNameI -> LaTeX  ppType       unicode ty = ppr_mono_ty (reparenTypePrec PREC_TOP ty) unicode -ppParendType unicode ty = ppr_mono_ty (reparenTypePrec PREC_CON ty) unicode +ppParendType unicode ty = ppr_mono_ty (reparenTypePrec PREC_TOP ty) unicode  ppFunLhType  unicode ty = ppr_mono_ty (reparenTypePrec PREC_FUN ty) unicode  ppCtxType    unicode ty = ppr_mono_ty (reparenTypePrec PREC_CTX ty) unicode +ppSigType :: Bool -> HsSigType DocNameI -> LaTeX +ppSigType unicode sig_ty = ppr_sig_ty (reparenSigType sig_ty) unicode +  ppLHsTypeArg :: Bool -> LHsTypeArg DocNameI -> LaTeX  ppLHsTypeArg unicode (HsValArg ty) = ppLParendType unicode ty  ppLHsTypeArg unicode (HsTypeArg _ ki) = atSign unicode <> @@ -1061,6 +1082,11 @@ ppKind unicode ki = ppr_mono_ty (reparenTypePrec PREC_TOP ki) unicode  -- Drop top-level for-all type variables in user style  -- since they are implicit in Haskell +ppr_sig_ty :: HsSigType DocNameI -> Bool -> LaTeX +ppr_sig_ty (HsSig { sig_bndrs = outer_bndrs, sig_body = ltype }) unicode +  = sep [ ppHsOuterTyVarBndrs outer_bndrs unicode +        , ppr_mono_lty ltype unicode ] +  ppr_mono_lty :: LHsType DocNameI -> Bool -> LaTeX  ppr_mono_lty ty unicode = ppr_mono_ty (unLoc ty) unicode @@ -1072,9 +1098,13 @@ ppr_mono_ty (HsForAllTy _ tele ty) unicode  ppr_mono_ty (HsQualTy _ ctxt ty) unicode    = sep [ ppLContext ctxt unicode          , ppr_mono_lty ty unicode ] -ppr_mono_ty (HsFunTy _ _ ty1 ty2)   u +ppr_mono_ty (HsFunTy _ mult ty1 ty2)   u    = sep [ ppr_mono_lty ty1 u -        , arrow u <+> ppr_mono_lty ty2 u ] +        , arr <+> ppr_mono_lty ty2 u ] +   where arr = case mult of +                 HsLinearArrow _ -> lollipop u +                 HsUnrestrictedArrow _ -> arrow u +                 HsExplicitMult _ m -> multAnnotation <> ppr_mono_lty m u <+> arrow u  ppr_mono_ty (HsBangTy _ b ty)     u = ppBang b <> ppLParendType u ty  ppr_mono_ty (HsTyVar _ NotPromoted (L _ name)) _ = ppDocName name @@ -1086,7 +1116,7 @@ ppr_mono_ty (HsListTy _ ty)       u = brackets (ppr_mono_lty ty u)  ppr_mono_ty (HsIParamTy _ (L _ n) ty) u = ppIPName n <+> dcolon u <+> ppr_mono_lty ty u  ppr_mono_ty (HsSpliceTy v _)    _ = absurd v  ppr_mono_ty (HsRecTy {})        _ = text "{..}" -ppr_mono_ty (XHsType (NHsCoreTy {}))  _ = error "ppr_mono_ty HsCoreTy" +ppr_mono_ty (XHsType {})        _ = error "ppr_mono_ty HsCoreTy"  ppr_mono_ty (HsExplicitListTy _ IsPromoted tys) u = Pretty.quote $ brackets $ hsep $ punctuate comma $ map (ppLType u) tys  ppr_mono_ty (HsExplicitListTy _ NotPromoted tys) u = brackets $ hsep $ punctuate comma $ map (ppLType u) tys  ppr_mono_ty (HsExplicitTupleTy _ tys) u = Pretty.quote $ parenList $ map (ppLType u) tys @@ -1363,14 +1393,18 @@ quote :: LaTeX -> LaTeX  quote doc = text "\\begin{quote}" $$ doc $$ text "\\end{quote}" -dcolon, arrow, darrow, forallSymbol, starSymbol, atSign :: Bool -> LaTeX +dcolon, arrow, lollipop, darrow, forallSymbol, starSymbol, atSign :: Bool -> LaTeX  dcolon unicode = text (if unicode then "∷" else "::")  arrow  unicode = text (if unicode then "→" else "->") +lollipop unicode = text (if unicode then "⊸" else "%1 ->")  darrow unicode = text (if unicode then "⇒" else "=>")  forallSymbol unicode = text (if unicode then "∀" else "forall")  starSymbol unicode = text (if unicode then "★" else "*")  atSign unicode = text (if unicode then "@" else "@") +multAnnotation :: LaTeX +multAnnotation = text "%" +  dot :: LaTeX  dot = char '.' diff --git a/haddock-api/src/Haddock/Backends/Xhtml/Decl.hs b/haddock-api/src/Haddock/Backends/Xhtml/Decl.hs index eeb9fa94..ccfb7a1e 100644 --- a/haddock-api/src/Haddock/Backends/Xhtml/Decl.hs +++ b/haddock-api/src/Haddock/Backends/Xhtml/Decl.hs @@ -63,9 +63,9 @@ ppDecl summ links (L loc decl) pats (mbDoc, fnArgsDoc) instances fixities subdoc    TyClD _ d@(SynDecl {})         -> ppTySyn summ links fixities loc (mbDoc, fnArgsDoc) d splice unicode pkg qual    TyClD _ d@(ClassDecl {})       -> ppClassDecl summ links instances fixities loc mbDoc subdocs d splice unicode pkg qual    SigD _ (TypeSig _ lnames lty)  -> ppLFunSig summ links loc (mbDoc, fnArgsDoc) lnames -                                         (hsSigWcType lty) fixities splice unicode pkg qual +                                         (dropWildCards lty) fixities splice unicode pkg qual    SigD _ (PatSynSig _ lnames lty) -> ppLPatSig summ links loc (mbDoc, fnArgsDoc) lnames -                                         (hsSigTypeI lty) fixities splice unicode pkg qual +                                         lty fixities splice unicode pkg qual    ForD _ d                       -> ppFor summ links loc (mbDoc, fnArgsDoc) d fixities splice unicode pkg qual    InstD _ _                      -> noHtml    DerivD _ _                     -> noHtml @@ -73,25 +73,25 @@ ppDecl summ links (L loc decl) pats (mbDoc, fnArgsDoc) instances fixities subdoc  ppLFunSig :: Bool -> LinksInfo -> SrcSpan -> DocForDecl DocName -> -             [Located DocName] -> LHsType DocNameI -> [(DocName, Fixity)] -> +             [Located DocName] -> LHsSigType 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 noHtml doc (map unLoc lnames) lty fixities             splice unicode pkg qual  ppFunSig :: Bool -> LinksInfo -> SrcSpan -> Html -> DocForDecl DocName -> -            [DocName] -> LHsType DocNameI -> [(DocName, Fixity)] -> +            [DocName] -> LHsSigType DocNameI -> [(DocName, Fixity)] ->              Splice -> Unicode -> Maybe Package -> Qualification -> Html  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 +    pp_typ = ppLSigType unicode qual HideEmptyContexts typ  -- | Pretty print a pattern synonym  ppLPatSig :: Bool -> LinksInfo -> SrcSpan -> DocForDecl DocName            -> [Located DocName]     -- ^ names of patterns in declaration -          -> LHsType DocNameI      -- ^ type of patterns in declaration +          -> LHsSigType DocNameI   -- ^ type of patterns in declaration            -> [(DocName, Fixity)]            -> Splice -> Unicode -> Maybe Package -> Qualification -> Html  ppLPatSig summary links loc doc lnames typ fixities splice unicode pkg qual = @@ -102,7 +102,7 @@ ppLPatSig summary links loc doc lnames typ fixities splice unicode pkg qual =  ppSigLike :: Bool -> LinksInfo -> SrcSpan -> Html -> DocForDecl DocName -> -             [DocName] -> [(DocName, Fixity)] -> (HsType DocNameI, Html) -> +             [DocName] -> [(DocName, Fixity)] -> (HsSigType DocNameI, Html) ->               Splice -> Unicode -> Maybe Package -> Qualification -> HideEmptyContexts -> Html  ppSigLike summary links loc leader doc docnames fixities (typ, pp_typ)            splice unicode pkg qual emptyCtxts = @@ -119,7 +119,7 @@ ppSigLike summary links loc leader doc docnames fixities (typ, pp_typ)        | otherwise = html <+> ppFixities fixities qual -ppTypeOrFunSig :: Bool -> LinksInfo -> SrcSpan -> [DocName] -> HsType DocNameI +ppTypeOrFunSig :: Bool -> LinksInfo -> SrcSpan -> [DocName] -> HsSigType DocNameI                 -> DocForDecl DocName -> (Html, Html, Html)                 -> Splice -> Unicode -> Maybe Package -> Qualification                 -> HideEmptyContexts -> Html @@ -140,15 +140,24 @@ ppTypeOrFunSig summary links loc docnames typ (doc, argDocs) (pref1, pref2, sep)  -- If one passes in a list of the available subdocs, any top-level `HsRecTy`  -- found will be expanded out into their fields.  ppSubSigLike :: Unicode -> Qualification -             -> HsType DocNameI                  -- ^ type signature +             -> HsSigType DocNameI               -- ^ type signature               -> FnArgsDoc DocName                -- ^ docs to add               -> [(DocName, DocForDecl DocName)]  -- ^ all subdocs (useful when                                                   -- we expand an `HsRecTy`)               -> Html -> HideEmptyContexts -> [SubDecl] -ppSubSigLike unicode qual typ argDocs subdocs sep emptyCtxts = do_args 0 sep typ +ppSubSigLike unicode qual typ argDocs subdocs sep emptyCtxts = do_sig_args 0 sep typ    where +    do_sig_args :: Int -> Html -> HsSigType DocNameI -> [SubDecl] +    do_sig_args n leader (HsSig { sig_bndrs = outer_bndrs, sig_body = ltype }) = +      case outer_bndrs of +        HsOuterExplicit{hso_bndrs = bndrs} -> do_largs n (leader' bndrs) ltype +        HsOuterImplicit{}                  -> do_largs n leader          ltype +      where +        leader' bndrs = leader <+> ppForAllPart unicode qual (mkHsForAllInvisTeleI bndrs) +      argDoc n = Map.lookup n argDocs +    do_largs :: Int -> Html -> LHsType DocNameI -> [SubDecl]      do_largs n leader (L _ t) = do_args n leader t      do_args :: Int -> Html -> HsType DocNameI -> [SubDecl] @@ -222,7 +231,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 noHtml doc [name] (hsSigTypeI typ) fixities splice unicode pkg qual +  = ppFunSig summary links loc noHtml doc [name] typ fixities splice unicode pkg qual  ppFor _ _ _ _ _ _ _ _ _ _ = error "ppFor" @@ -233,13 +242,14 @@ ppTySyn :: Bool -> LinksInfo -> [(DocName, Fixity)] -> SrcSpan  ppTySyn summary links fixities loc doc (SynDecl { tcdLName = L _ name, tcdTyVars = ltyvars                                                  , tcdRhs = ltype })          splice unicode pkg qual -  = ppTypeOrFunSig summary links loc [name] (unLoc ltype) doc +  = ppTypeOrFunSig summary links loc [name] sig_type doc                     (full <+> fixs, hdr <+> fixs, spaceHtml +++ equals)                     splice unicode pkg qual ShowEmptyToplevelContexts    where +    sig_type = mkHsImplicitSigTypeI ltype      hdr  = hsep ([keyword "type", ppBinder summary occ]                   ++ ppTyVars unicode qual (hsQTvExplicit ltyvars)) -    full = hdr <+> equals <+> ppPatSigType unicode qual ltype +    full = hdr <+> equals <+> ppPatSigType unicode qual (noLoc sig_type)      occ  = nameOccName . getName $ name      fixs        | summary   = noHtml @@ -253,15 +263,14 @@ ppTypeSig summary nms pp_ty unicode =    where      htmlNames = intersperse (stringToHtml ", ") $ map (ppBinder summary) nms -  ppSimpleSig :: LinksInfo -> Splice -> Unicode -> Qualification -> HideEmptyContexts -> SrcSpan -            -> [DocName] -> HsType DocNameI +            -> [DocName] -> HsSigType DocNameI              -> Html  ppSimpleSig links splice unicode qual emptyCtxts loc names typ =      topDeclElem' names $ ppTypeSig True occNames ppTyp unicode    where      topDeclElem' = topDeclElem links loc splice -    ppTyp = ppType unicode qual emptyCtxts typ +    ppTyp = ppSigType unicode qual emptyCtxts typ      occNames = map getOccName names @@ -301,9 +310,9 @@ ppFamDecl summary associated links instances fixities loc doc decl splice unicod      -- Individual equation of a closed type family      ppFamDeclEqn :: TyFamInstEqn DocNameI -> SubDecl -    ppFamDeclEqn (HsIB { hsib_body = FamEqn { feqn_tycon = L _ n -                                            , feqn_rhs = rhs -                                            , feqn_pats = ts } }) +    ppFamDeclEqn (FamEqn { feqn_tycon = L _ n +                         , feqn_rhs = rhs +                         , feqn_pats = ts })        = ( ppAppNameTypeArgs n ts unicode qual            <+> equals <+> ppType unicode qual HideEmptyContexts (unLoc rhs)          , Nothing @@ -497,7 +506,7 @@ ppShortClassDecl summary links (ClassDecl { tcdCtxt = lctxt, tcdLName = lname, t                  -- ToDo: add associated type defaults -            [ ppFunSig summary links loc noHtml doc names (hsSigTypeI typ) +            [ ppFunSig summary links loc noHtml doc names typ                         [] splice unicode pkg qual                | L _ (ClassOpSig _ False lnames typ) <- sigs                , let doc = lookupAnySubdoc (head names) subdocs @@ -561,14 +570,14 @@ ppClassDecl summary links instances fixities loc d subdocs      lookupDAT name = Map.lookup (getName name) defaultAssocTys      defaultAssocTys = Map.fromList        [ (getName name, (vs, typ)) -      | L _ (TyFamInstDecl (HsIB _ (FamEqn { feqn_rhs = typ -                                           , feqn_tycon = L _ name -                                           , feqn_pats = vs }))) <- atsDefs +      | L _ (TyFamInstDecl (FamEqn { feqn_rhs = typ +                                   , feqn_tycon = L _ name +                                   , feqn_pats = vs })) <- atsDefs        ]      -- Methods      methodBit = subMethods -      [ ppFunSig summary links loc noHtml doc [name] (hsSigTypeI typ) +      [ ppFunSig summary links loc noHtml doc [name] typ                   subfixs splice unicode pkg qual            <+>          subDefaults (maybeToList defSigs) @@ -583,7 +592,7 @@ ppClassDecl summary links instances fixities loc d subdocs      -- Default methods      ppDefaultFunSig n (t, d') = ppFunSig summary links loc (keyword "default") -      d' [n] (hsSigTypeI t) [] splice unicode pkg qual +      d' [n] t [] splice unicode pkg qual      lookupDM name = Map.lookup (getOccString name) defaultMethods      defaultMethods = Map.fromList @@ -709,7 +718,7 @@ ppInstanceSigs :: LinksInfo -> Splice -> Unicode -> Qualification  ppInstanceSigs links splice unicode qual sigs = do      TypeSig _ lnames typ <- sigs      let names = map unLoc lnames -        L _ rtyp = hsSigWcType typ +        L _ rtyp = dropWildCards typ      -- Instance methods signatures are synified and thus don't have a useful      -- SrcSpan value. Use the methods name location instead.      return $ ppSimpleSig links splice unicode qual HideEmptyContexts (getLoc $ head $ lnames) names rtyp @@ -772,7 +781,7 @@ ppShortDataDecl summary dataInst dataDecl pats unicode qual      pats1 = [ hsep [ keyword "pattern"                     , hsep $ punctuate comma $ map (ppBinder summary . getOccName) lnames                     , dcolon unicode -                   , ppPatSigType unicode qual (hsSigTypeI typ) +                   , ppPatSigType unicode qual typ                     ]              | (SigD _ (PatSynSig _ lnames typ),_) <- pats              ] @@ -851,7 +860,7 @@ ppShortConstrParts summary dataInst con unicode qual                       in case det of          -- Prefix constructor, e.g. 'Just a' -        PrefixCon args -> +        PrefixCon _ args ->            ( header_ <+> hsep (ppOcc : map (ppLParendType unicode qual HideEmptyContexts . hsScaledThing) args)            , noHtml            , noHtml @@ -878,7 +887,7 @@ ppShortConstrParts summary dataInst con unicode qual        -- GADT constructor, e.g. 'Foo :: Int -> Foo'        ConDeclGADT {} -> -          ( hsep [ ppOcc, dcolon unicode, ppLType unicode qual HideEmptyContexts (getGADTConType con) ] +          ( hsep [ ppOcc, dcolon unicode, ppLSigType unicode qual HideEmptyContexts (getGADTConType con) ]            , noHtml            , noHtml            ) @@ -922,7 +931,7 @@ ppSideBySideConstr subdocs fixities unicode pkg qual (L _ con)                           header_ = ppConstrHdr forall_ tyVars context unicode qual                       in case det of          -- Prefix constructor, e.g. 'Just a' -        PrefixCon args +        PrefixCon _ args            | hasArgDocs -> header_ <+> ppOcc <+> fixity            | otherwise -> hsep [ header_ <+> ppOcc                                , hsep (map (ppLParendType unicode qual HideEmptyContexts . hsScaledThing) args) @@ -947,24 +956,26 @@ ppSideBySideConstr subdocs fixities unicode pkg qual (L _ con)            | otherwise -> hsep [ ppOcc                                , dcolon unicode                                -- ++AZ++ make this prepend "{..}" when it is a record style GADT -                              , ppLType unicode qual HideEmptyContexts (getGADTConType con) +                              , ppLSigType unicode qual HideEmptyContexts (getGADTConType con)                                , fixity                                ] -    fieldPart = case (con, getConArgsI con) of -        -- Record style GADTs -        (ConDeclGADT{}, RecCon _)            -> [ doConstrArgsWithDocs [] ] - -        -- Regular record declarations -        (_, RecCon (L _ fields))             -> [ doRecordFields fields ] - -        -- Any GADT or a regular H98 prefix data constructor -        (_, PrefixCon args)     | hasArgDocs -> [ doConstrArgsWithDocs args ] - -        -- An infix H98 data constructor -        (_, InfixCon arg1 arg2) | hasArgDocs -> [ doConstrArgsWithDocs [arg1,arg2] ] - -        _ -> [] +    fieldPart = case con of +        ConDeclGADT{con_g_args = con_args'} -> case con_args' of +          -- GADT record declarations +          RecConGADT _                    -> [ doConstrArgsWithDocs [] ] +          -- GADT prefix data constructors +          PrefixConGADT args | hasArgDocs -> [ doConstrArgsWithDocs args ] +          _                               -> [] + +        ConDeclH98{con_args = con_args'} -> case con_args' of +          -- H98 record declarations +          RecCon (L _ fields)             -> [ doRecordFields fields ] +          -- H98 prefix data constructors +          PrefixCon _ args | hasArgDocs   -> [ doConstrArgsWithDocs args ] +          -- H98 infix data constructor +          InfixCon arg1 arg2 | hasArgDocs -> [ doConstrArgsWithDocs [arg1,arg2] ] +          _                               -> []      doRecordFields fields = subFields pkg qual        (map (ppSideBySideField subdocs unicode qual) (map unLoc fields)) @@ -1049,18 +1060,17 @@ ppSideBySidePat fixities unicode qual lnames typ (doc, argDocs) =           | otherwise = hsep [ keyword "pattern"                              , ppOcc                              , dcolon unicode -                            , ppPatSigType unicode qual (hsSigTypeI typ) +                            , ppPatSigType unicode qual typ                              , fixity                              ]      fieldPart        | not hasArgDocs = [] -      | otherwise = [ subFields Nothing qual (ppSubSigLike unicode qual (unLoc patTy) +      | otherwise = [ subFields Nothing qual (ppSubSigLike unicode qual (unLoc typ)                                                          argDocs [] (dcolon unicode)                                                          emptyCtxt) ] -    patTy = hsSigTypeI typ -    emptyCtxt = patSigContext patTy +    emptyCtxt = patSigContext typ  -- | Print the LHS of a data\/newtype declaration. @@ -1114,6 +1124,9 @@ ppLType       unicode qual emptyCtxts y = ppType unicode qual emptyCtxts (unLoc  ppLParendType unicode qual emptyCtxts y = ppParendType unicode qual emptyCtxts (unLoc y)  ppLFunLhType  unicode qual emptyCtxts y = ppFunLhType unicode qual emptyCtxts (unLoc y) +ppLSigType ::  Unicode -> Qualification -> HideEmptyContexts -> LHsSigType DocNameI -> Html +ppLSigType unicode qual emptyCtxts y = ppSigType unicode qual emptyCtxts (unLoc y) +  ppCtxType :: Unicode -> Qualification -> HsType DocNameI -> Html  ppCtxType unicode qual ty = ppr_mono_ty (reparenTypePrec PREC_CTX ty) unicode qual HideEmptyContexts @@ -1122,6 +1135,9 @@ ppType       unicode qual emptyCtxts ty = ppr_mono_ty (reparenTypePrec PREC_TOP  ppParendType unicode qual emptyCtxts ty = ppr_mono_ty (reparenTypePrec PREC_CON ty) unicode qual emptyCtxts  ppFunLhType  unicode qual emptyCtxts ty = ppr_mono_ty (reparenTypePrec PREC_FUN ty) unicode qual emptyCtxts +ppSigType ::  Unicode -> Qualification -> HideEmptyContexts -> HsSigType DocNameI -> Html +ppSigType unicode qual emptyCtxts sig_ty = ppr_sig_ty (reparenSigType sig_ty) unicode qual emptyCtxts +  ppLHsTypeArg :: Unicode -> Qualification -> HideEmptyContexts -> LHsTypeArg DocNameI -> Html  ppLHsTypeArg unicode qual emptyCtxts (HsValArg ty) = ppLParendType unicode qual emptyCtxts ty  ppLHsTypeArg unicode qual emptyCtxts (HsTypeArg _ ki) = atSign unicode <> @@ -1156,18 +1172,18 @@ ppLKind unicode qual y = ppKind unicode qual (unLoc y)  ppKind :: Unicode -> Qualification -> HsKind DocNameI -> Html  ppKind unicode qual ki = ppr_mono_ty (reparenTypePrec PREC_TOP ki) unicode qual HideEmptyContexts -patSigContext :: LHsType name -> HideEmptyContexts -patSigContext typ | hasNonEmptyContext typ && isFirstContextEmpty typ =  ShowEmptyToplevelContexts -                  | otherwise = HideEmptyContexts +patSigContext :: LHsSigType DocNameI -> HideEmptyContexts +patSigContext sig_typ | hasNonEmptyContext typ && isFirstContextEmpty typ =  ShowEmptyToplevelContexts +                      | otherwise = HideEmptyContexts    where -    hasNonEmptyContext :: LHsType name -> Bool +    typ = sig_body (unLoc sig_typ) +      hasNonEmptyContext t =        case unLoc t of          HsForAllTy _ _ s -> hasNonEmptyContext s          HsQualTy _ cxt s -> if null (unLoc cxt) then hasNonEmptyContext s else True          HsFunTy _ _ _ s    -> hasNonEmptyContext s          _ -> False -    isFirstContextEmpty :: LHsType name -> Bool      isFirstContextEmpty t =        case unLoc t of          HsForAllTy _ _ s -> isFirstContextEmpty s @@ -1178,10 +1194,16 @@ patSigContext typ | hasNonEmptyContext typ && isFirstContextEmpty typ =  ShowEmp  -- | Pretty-print a pattern signature (all this does over 'ppLType' is slot in  -- the right 'HideEmptyContext' value) -ppPatSigType :: Unicode -> Qualification -> LHsType DocNameI -> Html +ppPatSigType :: Unicode -> Qualification -> LHsSigType DocNameI -> Html  ppPatSigType unicode qual typ = -  let emptyCtxts = patSigContext typ in ppLType unicode qual emptyCtxts typ +  let emptyCtxts = patSigContext typ in ppLSigType unicode qual emptyCtxts typ +ppHsOuterTyVarBndrs :: RenderableBndrFlag flag +                    => Unicode -> Qualification -> HsOuterTyVarBndrs flag DocNameI -> Html +ppHsOuterTyVarBndrs unicode qual outer_bndrs = case outer_bndrs of +  HsOuterImplicit{} -> noHtml +  HsOuterExplicit{hso_bndrs = bndrs} -> +    hsep (forallSymbol unicode : ppTyVars unicode qual bndrs) +++ dot  ppForAllPart :: Unicode -> Qualification -> HsForAllTelescope DocNameI -> Html  ppForAllPart unicode qual tele = case tele of @@ -1191,6 +1213,10 @@ ppForAllPart unicode qual tele = case tele of    HsForAllInvis { hsf_invis_bndrs = bndrs } ->      hsep (forallSymbol unicode : ppTyVars unicode qual bndrs) +++ dot +ppr_sig_ty :: HsSigType DocNameI -> Unicode -> Qualification -> HideEmptyContexts -> Html +ppr_sig_ty (HsSig { sig_bndrs = outer_bndrs, sig_body = ltype }) unicode qual emptyCtxts +  = ppHsOuterTyVarBndrs unicode qual outer_bndrs <+> ppr_mono_lty ltype unicode qual emptyCtxts +  ppr_mono_lty :: LHsType DocNameI -> Unicode -> Qualification -> HideEmptyContexts -> Html  ppr_mono_lty ty = ppr_mono_ty (unLoc ty) @@ -1213,10 +1239,15 @@ ppr_mono_ty (HsTyVar _ prom (L _ name)) _ q _    | otherwise = ppDocName q Prefix True name  ppr_mono_ty (HsStarTy _ isUni) u _ _ =    toHtml (if u || isUni then "★" else "*") -ppr_mono_ty (HsFunTy _ _ ty1 ty2) u q e = +ppr_mono_ty (HsFunTy _ mult ty1 ty2) u q e =    hsep [ ppr_mono_lty ty1 u q HideEmptyContexts -       , arrow u <+> ppr_mono_lty ty2 u q e +       , arr <+> ppr_mono_lty ty2 u q e         ] +   where arr = case mult of +                 HsLinearArrow _ -> lollipop u +                 HsUnrestrictedArrow _ -> arrow u +                 HsExplicitMult _ m -> multAnnotation <> ppr_mono_lty m u q e <+> arrow u +  ppr_mono_ty (HsTupleTy _ con tys) u q _ =    tupleParens con (map (ppLType u q HideEmptyContexts) tys)  ppr_mono_ty (HsSumTy _ tys) u q _ = @@ -1231,7 +1262,7 @@ ppr_mono_ty (HsRecTy {})        _ _ _ = toHtml "{..}"         -- Can now legally occur in ConDeclGADT, the output here is to provide a         -- placeholder in the signature, which is followed by the field         -- declarations. -ppr_mono_ty (XHsType (NHsCoreTy {})) _ _ _ = error "ppr_mono_ty HsCoreTy" +ppr_mono_ty (XHsType {})        _ _ _ = error "ppr_mono_ty HsCoreTy"  ppr_mono_ty (HsExplicitListTy _ IsPromoted tys) u q _ = promoQuote $ brackets $ hsep $ punctuate comma $ map (ppLType u q HideEmptyContexts) tys  ppr_mono_ty (HsExplicitListTy _ NotPromoted tys) u q _ = brackets $ hsep $ punctuate comma $ map (ppLType u q HideEmptyContexts) tys  ppr_mono_ty (HsExplicitTupleTy _ tys) u q _ = promoQuote $ parenList $ map (ppLType u q HideEmptyContexts) tys diff --git a/haddock-api/src/Haddock/Backends/Xhtml/Utils.hs b/haddock-api/src/Haddock/Backends/Xhtml/Utils.hs index f5f64f51..238f0046 100644 --- a/haddock-api/src/Haddock/Backends/Xhtml/Utils.hs +++ b/haddock-api/src/Haddock/Backends/Xhtml/Utils.hs @@ -21,7 +21,8 @@ module Haddock.Backends.Xhtml.Utils (    keyword, punctuate,    braces, brackets, pabrackets, parens, parenList, ubxParenList, ubxSumList, -  arrow, comma, dcolon, dot, darrow, equals, forallSymbol, quote, promoQuote, +  arrow, lollipop, comma, dcolon, dot, darrow, equals, forallSymbol, quote, promoQuote, +  multAnnotation,    atSign,    hsep, vcat, @@ -187,13 +188,17 @@ ubxparens :: Html -> Html  ubxparens h = toHtml "(#" <+> h <+> toHtml "#)" -dcolon, arrow, darrow, forallSymbol, atSign :: Bool -> Html +dcolon, arrow, lollipop, darrow, forallSymbol, atSign :: Bool -> Html  dcolon unicode = toHtml (if unicode then "∷" else "::")  arrow  unicode = toHtml (if unicode then "→" else "->") +lollipop unicode = toHtml (if unicode then "⊸" else "%1 ->")  darrow unicode = toHtml (if unicode then "⇒" else "=>")  forallSymbol unicode = if unicode then toHtml "∀" else keyword "forall"  atSign unicode = toHtml (if unicode then "@" else "@") +multAnnotation :: Html +multAnnotation = toHtml "%" +  dot :: Html  dot = toHtml "." | 
