diff options
22 files changed, 228 insertions, 157 deletions
| diff --git a/haddock-api/haddock-api.cabal b/haddock-api/haddock-api.cabal index 8fe4c3b1..620fd981 100644 --- a/haddock-api/haddock-api.cabal +++ b/haddock-api/haddock-api.cabal @@ -37,7 +37,7 @@ library        Haskell2010    build-depends: -      base >= 4.3 && < 4.10 +      base >= 4.3 && < 4.11      , bytestring      , filepath      , directory diff --git a/haddock-api/src/Haddock.hs b/haddock-api/src/Haddock.hs index 28974d19..bbaea359 100644 --- a/haddock-api/src/Haddock.hs +++ b/haddock-api/src/Haddock.hs @@ -68,7 +68,6 @@ import System.Directory (doesDirectoryExist)  import GHC hiding (verbosity)  import Config  import DynFlags hiding (projectVersion, verbosity) -import StaticFlags (discardStaticFlags)  import Packages  import Panic (handleGhcException)  import Module @@ -410,18 +409,9 @@ withGhc' libDir flags ghcActs = runGhc (Just libDir) $ do      parseGhcFlags dynflags = do        -- TODO: handle warnings? -      -- NOTA BENE: We _MUST_ discard any static flags here, because we cannot -      -- rely on Haddock to parse them, as it only parses the DynFlags. Yet if -      -- we pass any, Haddock will fail. Since StaticFlags are global to the -      -- GHC invocation, there's also no way to reparse/save them to set them -      -- again properly. -      -- -      -- This is a bit of a hack until we get rid of the rest of the remaining -      -- StaticFlags. See GHC issue #8276. -      let flags' = discardStaticFlags flags -      (dynflags', rest, _) <- parseDynamicFlags dynflags (map noLoc flags') +      (dynflags', rest, _) <- parseDynamicFlags dynflags (map noLoc flags)        if not (null rest) -        then throwE ("Couldn't parse GHC options: " ++ unwords flags') +        then throwE ("Couldn't parse GHC options: " ++ unwords flags)          else return dynflags'  ------------------------------------------------------------------------------- @@ -576,7 +566,15 @@ getExecDir = try_size 2048 -- plenty, PATH_MAX is 512 under Win32.            _ | ret < size -> fmap (Just . dropFileName) $ peekCWString buf              | otherwise  -> try_size (size * 2) -foreign import stdcall unsafe "windows.h GetModuleFileNameW" +# if defined(i386_HOST_ARCH) +#  define WINDOWS_CCONV stdcall +# elif defined(x86_64_HOST_ARCH) +#  define WINDOWS_CCONV ccall +# else +#  error Unknown mingw32 arch +# endif + +foreign import WINDOWS_CCONV unsafe "windows.h GetModuleFileNameW"    c_GetModuleFileName :: Ptr () -> CWString -> Word32 -> IO Word32  #else  getExecDir = return Nothing diff --git a/haddock-api/src/Haddock/Backends/Hoogle.hs b/haddock-api/src/Haddock/Backends/Hoogle.hs index 9a15c7b3..86a73c33 100644 --- a/haddock-api/src/Haddock/Backends/Hoogle.hs +++ b/haddock-api/src/Haddock/Backends/Hoogle.hs @@ -1,3 +1,4 @@ +{-# LANGUAGE FlexibleContexts #-}  -----------------------------------------------------------------------------  -- |  -- Module      :  Haddock.Backends.Hoogle @@ -15,7 +16,7 @@ module Haddock.Backends.Hoogle (      ppHoogle    ) where -import BasicTypes (OverlapFlag(..), OverlapMode(..)) +import BasicTypes (OverlapFlag(..), OverlapMode(..), SourceText(..))  import InstEnv (ClsInst(..))  import Haddock.GhcUtils  import Haddock.Types hiding (Version) @@ -84,7 +85,8 @@ dropHsDocTy = f          f (HsDocTy a _) = f $ unL a          f x = x -outHsType :: OutputableBndr a => DynFlags -> HsType a -> String +outHsType :: (OutputableBndrId a) +          => DynFlags -> HsType a -> String  outHsType dflags = out dflags . dropHsDocTy @@ -180,6 +182,7 @@ ppClass dflags decl subdocs = (out dflags decl{tcdSigs=[]} ++ ppTyFams) :  ppMet          tyFamEqnToSyn tfe = SynDecl              { tcdLName = tfe_tycon tfe              , tcdTyVars = tfe_pats tfe +            , tcdFixity = tfe_fixity tfe              , tcdRhs = tfe_rhs tfe              , tcdFVs = emptyNameSet              } @@ -194,7 +197,7 @@ ppInstance dflags x =      -- safety information to a state where the Outputable instance      -- produces no output which means no overlap and unsafe (or [safe]      -- is generated). -    cls = x { is_flag = OverlapFlag { overlapMode = NoOverlap mempty +    cls = x { is_flag = OverlapFlag { overlapMode = NoOverlap NoSourceText                                      , isSafeOverlap = False } }  ppSynonym :: DynFlags -> TyClDecl Name -> [String] @@ -202,7 +205,7 @@ ppSynonym dflags x = [out dflags x]  ppData :: DynFlags -> TyClDecl Name -> [(Name, DocForDecl Name)] -> [String]  ppData dflags decl@(DataDecl { tcdDataDefn = defn }) subdocs -    = showData decl{ tcdDataDefn = defn { dd_cons=[],dd_derivs=Nothing }} : +    = showData decl{ tcdDataDefn = defn { dd_cons=[],dd_derivs=noLoc [] }} :        concatMap (ppCtor dflags decl subdocs . unL) (dd_cons defn)      where @@ -242,7 +245,7 @@ ppCtor dflags dat subdocs con@ConDeclH98 {}          -- docs for con_names on why it is a list to begin with.          name = commaSeparate dflags . map unL $ getConNames con -        resType = apps $ map (reL . HsTyVar . reL) $ +        resType = apps $ map (reL . HsTyVar NotPromoted . reL) $                          (tcdName dat) : [hsTyVarName v | L _ v@(UserTyVar _) <- hsQTvExplicit $ tyClDeclTyVars dat]  ppCtor dflags _dat subdocs con@ConDeclGADT {} diff --git a/haddock-api/src/Haddock/Backends/Hyperlinker/Ast.hs b/haddock-api/src/Haddock/Backends/Hyperlinker/Ast.hs index be17cb8b..b97f0ead 100644 --- a/haddock-api/src/Haddock/Backends/Hyperlinker/Ast.hs +++ b/haddock-api/src/Haddock/Backends/Hyperlinker/Ast.hs @@ -72,7 +72,7 @@ types =      everything (<|>) ty    where      ty term = case cast term of -        (Just (GHC.L sspan (GHC.HsTyVar name))) -> +        (Just (GHC.L sspan (GHC.HsTyVar _ name))) ->              pure (sspan, RtkType (GHC.unLoc name))          _ -> empty @@ -118,7 +118,7 @@ decls (group, _, _, _) = concatMap ($ group)    where      typ (GHC.L _ t) = case t of          GHC.DataDecl { tcdLName = name } -> pure . decl $ name -        GHC.SynDecl name _ _ _ -> pure . decl $ name +        GHC.SynDecl name _ _ _ _ -> pure . decl $ name          GHC.FamDecl fam -> pure . decl $ GHC.fdLName fam          GHC.ClassDecl{..} -> [decl tcdLName] ++ concatMap sig tcdSigs      fun term = case cast term of @@ -152,11 +152,11 @@ imports src@(_, imps, _, _) =      everything (<|>) ie src ++ mapMaybe (imp . GHC.unLoc) imps    where      ie term = case cast term of -        (Just (GHC.IEVar v)) -> pure $ var v -        (Just (GHC.IEThingAbs t)) -> pure $ typ t -        (Just (GHC.IEThingAll t)) -> pure $ typ t +        (Just (GHC.IEVar v)) -> pure $ var $ GHC.ieLWrappedName v +        (Just (GHC.IEThingAbs t)) -> pure $ typ $ GHC.ieLWrappedName t +        (Just (GHC.IEThingAll t)) -> pure $ typ $ GHC.ieLWrappedName t          (Just (GHC.IEThingWith t _ vs _fls)) -> -          [typ t] ++ map var vs +          [typ $ GHC.ieLWrappedName t] ++ map (var . GHC.ieLWrappedName) vs          _ -> empty      typ (GHC.L sspan name) = (sspan, RtkType name)      var (GHC.L sspan name) = (sspan, RtkVar name) diff --git a/haddock-api/src/Haddock/Backends/Hyperlinker/Parser.hs b/haddock-api/src/Haddock/Backends/Hyperlinker/Parser.hs index e206413e..e4345602 100644 --- a/haddock-api/src/Haddock/Backends/Hyperlinker/Parser.hs +++ b/haddock-api/src/Haddock/Backends/Hyperlinker/Parser.hs @@ -31,12 +31,20 @@ chunk str@(c:_)  chunk str      | "--" `isPrefixOf` str = chunk' $ spanToNewline str      | "{-" `isPrefixOf` str = chunk' $ chunkComment 0 str -    | otherwise = case lex str of +    | otherwise = case lex' str of          (tok:_) -> chunk' tok          [] -> [str]    where      chunk' (c, rest) = c:(chunk rest) +-- | A bit better lexer then the default, i.e. handles DataKinds quotes +lex' :: ReadS String +lex' ('\'' : '\'' : rest)              = [("''", rest)] +lex' str@('\'' : '\\' : _ : '\'' : _)  = lex str +lex' str@('\'' : _ : '\'' : _)         = lex str +lex' ('\'' : rest)                     = [("'", rest)] +lex' str                               = lex str +  -- | Split input to "first line" string and the rest of it.  --  -- Ideally, this should be done simply with @'break' (== '\n')@. However, @@ -124,6 +132,8 @@ classify str      | "--" `isPrefixOf` str = TkComment      | "{-#" `isPrefixOf` str = TkPragma      | "{-" `isPrefixOf` str = TkComment +classify "''" = TkSpecial +classify "'"  = TkSpecial  classify str@(c:_)      | isSpace c = TkSpace      | isDigit c = TkNumber diff --git a/haddock-api/src/Haddock/Backends/Hyperlinker/Types.hs b/haddock-api/src/Haddock/Backends/Hyperlinker/Types.hs index 5f4dbc8c..b27ec4d8 100644 --- a/haddock-api/src/Haddock/Backends/Hyperlinker/Types.hs +++ b/haddock-api/src/Haddock/Backends/Hyperlinker/Types.hs @@ -12,16 +12,19 @@ data Token = Token      , tkValue :: String      , tkSpan :: Span      } +    deriving (Show)  data Position = Position      { posRow :: !Int      , posCol :: !Int      } +    deriving (Show)  data Span = Span      { spStart :: Position      , spEnd :: Position      } +    deriving (Show)  data TokenType      = TkIdentifier diff --git a/haddock-api/src/Haddock/Backends/LaTeX.hs b/haddock-api/src/Haddock/Backends/LaTeX.hs index 81a23a1b..53cfccff 100644 --- a/haddock-api/src/Haddock/Backends/LaTeX.hs +++ b/haddock-api/src/Haddock/Backends/LaTeX.hs @@ -251,7 +251,7 @@ declNames :: LHsDecl DocName -> [DocName]  declNames (L _ decl) = case decl of    TyClD d  -> [tcdName d]    SigD (TypeSig lnames _ ) -> map unLoc lnames -  SigD (PatSynSig lname _) -> [unLoc lname] +  SigD (PatSynSig lnames _) -> map unLoc lnames    ForD (ForeignImport (L _ n) _ _ _) -> [n]    ForD (ForeignExport (L _ n) _ _ _) -> [n]    _ -> error "declaration not supported by declNames" @@ -296,10 +296,11 @@ ppDecl (L loc decl) (doc, fnArgsDoc) instances subdocs _fixities = case decl of    TyClD d@(ClassDecl {})    -> ppClassDecl instances loc doc subdocs d unicode    SigD (TypeSig lnames t)   -> ppFunSig loc (doc, fnArgsDoc) (map unLoc lnames)                                          (hsSigWcType t) unicode -  SigD (PatSynSig lname ty) -> -      ppLPatSig loc (doc, fnArgsDoc) lname ty unicode +  SigD (PatSynSig lnames ty) -> +      ppLPatSig loc (doc, fnArgsDoc) (map unLoc lnames) ty unicode    ForD d                         -> ppFor loc (doc, fnArgsDoc) d unicode    InstD _                        -> empty +  DerivD _                       -> empty    _                              -> error "declaration not supported by ppDecl"    where      unicode = False @@ -354,14 +355,14 @@ ppFunSig loc doc docnames (L _ typ) unicode =   where     names = map getName docnames -ppLPatSig :: SrcSpan -> DocForDecl DocName -> Located DocName +ppLPatSig :: SrcSpan -> DocForDecl DocName -> [DocName]            -> LHsSigType DocName            -> Bool -> LaTeX -ppLPatSig _loc (doc, _argDocs) (L _ name) ty unicode +ppLPatSig _loc (doc, _argDocs) docnames ty unicode    = declWithDoc pref1 (documentationToLaTeX doc)    where      pref1 = hsep [ keyword "pattern" -                 , ppDocBinder name +                 , hsep $ punctuate comma $ map ppDocBinder docnames                   , dcolon unicode                   , ppLType unicode (hsSigType ty)                   ] @@ -884,6 +885,10 @@ tupleParens HsUnboxedTuple = ubxParenList  tupleParens _              = parenList +sumParens :: [LaTeX] -> LaTeX +sumParens = ubxparens . hsep . punctuate (text " | ") + +  -------------------------------------------------------------------------------  -- * Rendering of HsType  -- @@ -944,17 +949,20 @@ ppr_mono_ty ctxt_prec (HsQualTy ctxt ty) unicode          , ppr_mono_lty pREC_TOP ty unicode ]  ppr_mono_ty _         (HsBangTy b ty)     u = ppBang b <> ppLParendType u ty -ppr_mono_ty _         (HsTyVar (L _ name)) _ = ppDocName name +ppr_mono_ty _         (HsTyVar NotPromoted (L _ name)) _ = ppDocName name +ppr_mono_ty _         (HsTyVar Promoted    (L _ name)) _ = char '\'' <> ppDocName name  ppr_mono_ty ctxt_prec (HsFunTy ty1 ty2)   u = ppr_fun_ty ctxt_prec ty1 ty2 u  ppr_mono_ty _         (HsTupleTy con tys) u = tupleParens con (map (ppLType u) tys) +ppr_mono_ty _         (HsSumTy tys) u       = sumParens (map (ppLType u) tys)  ppr_mono_ty _         (HsKindSig ty kind) u = parens (ppr_mono_lty pREC_TOP ty u <+> dcolon u <+> ppLKind u kind)  ppr_mono_ty _         (HsListTy ty)       u = brackets (ppr_mono_lty pREC_TOP ty u)  ppr_mono_ty _         (HsPArrTy ty)       u = pabrackets (ppr_mono_lty pREC_TOP ty u) -ppr_mono_ty _         (HsIParamTy n ty)   u = brackets (ppIPName n <+> dcolon u <+> ppr_mono_lty pREC_TOP ty u) +ppr_mono_ty _         (HsIParamTy (L _ n) ty) u = brackets (ppIPName n <+> dcolon u <+> ppr_mono_lty pREC_TOP ty u)  ppr_mono_ty _         (HsSpliceTy {})     _ = error "ppr_mono_ty HsSpliceTy"  ppr_mono_ty _         (HsRecTy {})        _ = error "ppr_mono_ty HsRecTy"  ppr_mono_ty _         (HsCoreTy {})       _ = error "ppr_mono_ty HsCoreTy" -ppr_mono_ty _         (HsExplicitListTy _ tys) u = Pretty.quote $ brackets $ hsep $ punctuate comma $ map (ppLType u) tys +ppr_mono_ty _         (HsExplicitListTy Promoted _ 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  ppr_mono_ty ctxt_prec (HsEqTy ty1 ty2) unicode diff --git a/haddock-api/src/Haddock/Backends/Xhtml.hs b/haddock-api/src/Haddock/Backends/Xhtml.hs index 0958c2cd..65b427f9 100644 --- a/haddock-api/src/Haddock/Backends/Xhtml.hs +++ b/haddock-api/src/Haddock/Backends/Xhtml.hs @@ -46,7 +46,7 @@ import qualified Data.Set as Set hiding ( Set )  import Data.Ord              ( comparing )  import DynFlags (Language(..)) -import GHC hiding ( NoLink, moduleInfo ) +import GHC hiding ( NoLink, moduleInfo,LexicalFixity(..) )  import Name  import Module diff --git a/haddock-api/src/Haddock/Backends/Xhtml/Decl.hs b/haddock-api/src/Haddock/Backends/Xhtml/Decl.hs index fab6bf8d..2aec5272 100644 --- a/haddock-api/src/Haddock/Backends/Xhtml/Decl.hs +++ b/haddock-api/src/Haddock/Backends/Xhtml/Decl.hs @@ -34,7 +34,7 @@ import qualified Data.Map as Map  import           Data.Maybe  import           Text.XHtml hiding     ( name, title, p, quote ) -import GHC +import GHC hiding (LexicalFixity(..))  import GHC.Exts  import Name  import BooleanFormula @@ -44,17 +44,18 @@ ppDecl :: Bool -> LinksInfo -> LHsDecl DocName         -> DocForDecl DocName -> [DocInstance DocName] -> [(DocName, Fixity)]         -> [(DocName, DocForDecl DocName)] -> Splice -> Unicode -> Qualification -> Html  ppDecl summ links (L loc decl) (mbDoc, fnArgsDoc) instances fixities subdocs splice unicode qual = case decl of -  TyClD (FamDecl d)         -> ppTyFam summ False links instances fixities loc mbDoc d splice unicode qual -  TyClD d@(DataDecl {})     -> ppDataDecl summ links instances fixities subdocs loc mbDoc d splice unicode qual -  TyClD d@(SynDecl {})      -> ppTySyn summ links fixities loc (mbDoc, fnArgsDoc) d splice unicode qual -  TyClD d@(ClassDecl {})    -> ppClassDecl summ links instances fixities loc mbDoc subdocs d splice unicode qual -  SigD (TypeSig lnames lty) -> ppLFunSig summ links loc (mbDoc, fnArgsDoc) lnames +  TyClD (FamDecl d)            -> ppTyFam summ False links instances fixities loc mbDoc d splice unicode qual +  TyClD d@(DataDecl {})        -> ppDataDecl summ links instances fixities subdocs loc mbDoc d splice unicode qual +  TyClD d@(SynDecl {})         -> ppTySyn summ links fixities loc (mbDoc, fnArgsDoc) d splice unicode qual +  TyClD d@(ClassDecl {})       -> ppClassDecl summ links instances fixities loc mbDoc subdocs d splice unicode qual +  SigD (TypeSig lnames lty)    -> ppLFunSig summ links loc (mbDoc, fnArgsDoc) lnames                                           (hsSigWcType lty) fixities splice unicode qual -  SigD (PatSynSig lname ty) -> ppLPatSig summ links loc (mbDoc, fnArgsDoc) lname +  SigD (PatSynSig lnames ty)   -> ppLPatSig summ links loc (mbDoc, fnArgsDoc) lnames                                           ty fixities splice unicode qual -  ForD d                         -> ppFor summ links loc (mbDoc, fnArgsDoc) d fixities splice unicode qual -  InstD _                        -> noHtml -  _                              -> error "declaration not supported by ppDecl" +  ForD d                       -> ppFor summ links loc (mbDoc, fnArgsDoc) d fixities splice unicode qual +  InstD _                      -> noHtml +  DerivD _                     -> noHtml +  _                            -> error "declaration not supported by ppDecl"  ppLFunSig :: Bool -> LinksInfo -> SrcSpan -> DocForDecl DocName -> @@ -74,22 +75,20 @@ ppFunSig summary links loc doc docnames typ fixities splice unicode qual =      pp_typ = ppLType unicode qual typ  ppLPatSig :: Bool -> LinksInfo -> SrcSpan -> DocForDecl DocName -> -             Located DocName -> LHsSigType DocName -> +             [Located DocName] -> LHsSigType DocName ->               [(DocName, Fixity)] ->               Splice -> Unicode -> Qualification -> Html -ppLPatSig summary links loc (doc, _argDocs) (L _ name) typ fixities splice unicode qual +ppLPatSig summary links loc (doc, _argDocs) docnames typ fixities splice unicode qual    | summary = pref1 -  | otherwise = topDeclElem links loc splice [name] (pref1 <+> ppFixities fixities qual) +  | otherwise = topDeclElem links loc splice (map unLoc docnames) (pref1 <+> ppFixities fixities qual)                  +++ docSection Nothing qual doc    where      pref1 = hsep [ keyword "pattern" -                 , ppBinder summary occname +                 , hsep $ punctuate comma $ map (ppBinder summary . getOccName) docnames                   , dcolon unicode                   , ppLType unicode qual (hsSigType typ)                   ] -    occname = nameOccName . getName $ name -  ppSigLike :: Bool -> LinksInfo -> SrcSpan -> Html -> DocForDecl DocName ->               [DocName] -> [(DocName, Fixity)] -> (HsType DocName, Html) ->               Splice -> Unicode -> Qualification -> Html @@ -645,10 +644,8 @@ ppInstanceSigs :: LinksInfo -> Splice -> Unicode -> Qualification  ppInstanceSigs links splice unicode qual sigs = do      TypeSig lnames typ <- sigs      let names = map unLoc lnames -        L loc rtyp = get_type typ +        L loc rtyp = hsSigWcType typ      return $ ppSimpleSig links splice unicode qual loc names rtyp -    where -      get_type = hswc_body . hsib_body  lookupAnySubdoc :: Eq id1 => id1 -> [(id1, DocForDecl id2)] -> DocForDecl id2 @@ -916,6 +913,9 @@ tupleParens HsUnboxedTuple = ubxParenList  tupleParens _              = parenList +sumParens :: [Html] -> Html +sumParens = ubxSumList +  --------------------------------------------------------------------------------  -- * Rendering of HsType  -------------------------------------------------------------------------------- @@ -984,19 +984,20 @@ ppr_mono_ty ctxt_prec (HsQualTy ctxt ty) unicode qual      ppLContext ctxt unicode qual <+> ppr_mono_lty pREC_TOP ty unicode qual  -- UnicodeSyntax alternatives -ppr_mono_ty _ (HsTyVar (L _ name)) True _ +ppr_mono_ty _ (HsTyVar _ (L _ name)) True _    | getOccString (getName name) == "*"    = toHtml "★"    | getOccString (getName name) == "(->)" = toHtml "(→)"  ppr_mono_ty _         (HsBangTy b ty)     u q = ppBang b +++ ppLParendType u q ty -ppr_mono_ty _         (HsTyVar (L _ name)) _ q = ppDocName q Prefix True name +ppr_mono_ty _         (HsTyVar _ (L _ name)) _ q = ppDocName q Prefix True name  ppr_mono_ty ctxt_prec (HsFunTy ty1 ty2)   u q = ppr_fun_ty ctxt_prec ty1 ty2 u q  ppr_mono_ty _         (HsTupleTy con tys) u q = tupleParens con (map (ppLType u q) tys) +ppr_mono_ty _         (HsSumTy tys) u q = sumParens (map (ppLType u q) tys)  ppr_mono_ty _         (HsKindSig ty kind) u q =      parens (ppr_mono_lty pREC_TOP ty u q <+> dcolon u <+> ppLKind u q kind)  ppr_mono_ty _         (HsListTy ty)       u q = brackets (ppr_mono_lty pREC_TOP ty u q)  ppr_mono_ty _         (HsPArrTy ty)       u q = pabrackets (ppr_mono_lty pREC_TOP ty u q) -ppr_mono_ty ctxt_prec (HsIParamTy n ty)   u q = +ppr_mono_ty ctxt_prec (HsIParamTy (L _ n) ty) u q =      maybeParen ctxt_prec pREC_CTX $ ppIPName n <+> dcolon u <+> ppr_mono_lty pREC_TOP ty u q  ppr_mono_ty _         (HsSpliceTy {})     _ _ = error "ppr_mono_ty HsSpliceTy"  ppr_mono_ty _         (HsRecTy {})        _ _ = toHtml "{..}" @@ -1004,7 +1005,8 @@ ppr_mono_ty _         (HsRecTy {})        _ _ = toHtml "{..}"         -- placeholder in the signature, which is followed by the field         -- declarations.  ppr_mono_ty _         (HsCoreTy {})       _ _ = error "ppr_mono_ty HsCoreTy" -ppr_mono_ty _         (HsExplicitListTy _ tys) u q = promoQuote $ brackets $ hsep $ punctuate comma $ map (ppLType u q) tys +ppr_mono_ty _         (HsExplicitListTy Promoted _ tys) u q = promoQuote $ brackets $ hsep $ punctuate comma $ map (ppLType u q) tys +ppr_mono_ty _         (HsExplicitListTy NotPromoted _ tys) u q = brackets $ hsep $ punctuate comma $ map (ppLType u q) tys  ppr_mono_ty _         (HsExplicitTupleTy _ tys) u q = promoQuote $ parenList $ map (ppLType u q) tys  ppr_mono_ty _         (HsAppsTy {})       _ _ = error "ppr_mono_ty HsAppsTy" diff --git a/haddock-api/src/Haddock/Backends/Xhtml/Names.hs b/haddock-api/src/Haddock/Backends/Xhtml/Names.hs index 5492178b..a84a55e8 100644 --- a/haddock-api/src/Haddock/Backends/Xhtml/Names.hs +++ b/haddock-api/src/Haddock/Backends/Xhtml/Names.hs @@ -26,7 +26,7 @@ import Text.XHtml hiding ( name, title, p, quote )  import qualified Data.Map as M  import qualified Data.List as List -import GHC +import GHC hiding (LexicalFixity(..))  import Name  import RdrName  import FastString (unpackFS) diff --git a/haddock-api/src/Haddock/Backends/Xhtml/Utils.hs b/haddock-api/src/Haddock/Backends/Xhtml/Utils.hs index 1d49807d..a8b4a4ec 100644 --- a/haddock-api/src/Haddock/Backends/Xhtml/Utils.hs +++ b/haddock-api/src/Haddock/Backends/Xhtml/Utils.hs @@ -20,7 +20,7 @@ module Haddock.Backends.Xhtml.Utils (    (<+>), (<=>), char,    keyword, punctuate, -  braces, brackets, pabrackets, parens, parenList, ubxParenList, +  braces, brackets, pabrackets, parens, parenList, ubxParenList, ubxSumList,    arrow, comma, dcolon, dot, darrow, equals, forallSymbol, quote, promoQuote,    hsep, vcat, @@ -75,8 +75,7 @@ spliceURL' maybe_file maybe_mod maybe_name maybe_loc = run        case span_ of        RealSrcSpan span__ ->          show $ srcSpanStartLine span__ -      UnhelpfulSpan _ -> -        error "spliceURL UnhelpfulSpan" +      UnhelpfulSpan _ -> ""    run "" = ""    run ('%':'M':rest) = mdl  ++ run rest @@ -178,6 +177,10 @@ ubxParenList :: [Html] -> Html  ubxParenList = ubxparens . hsep . punctuate comma +ubxSumList :: [Html]  -> Html +ubxSumList = ubxparens . hsep . punctuate (toHtml " | ") + +  ubxparens :: Html -> Html  ubxparens h = toHtml "(#" +++ h +++ toHtml "#)" diff --git a/haddock-api/src/Haddock/Convert.hs b/haddock-api/src/Haddock/Convert.hs index 7de840ee..b5966291 100644 --- a/haddock-api/src/Haddock/Convert.hs +++ b/haddock-api/src/Haddock/Convert.hs @@ -1,4 +1,3 @@ -  {-# LANGUAGE CPP, PatternGuards #-}  -----------------------------------------------------------------------------  -- | @@ -18,7 +17,7 @@ module Haddock.Convert where  -- instance heads, which aren't TyThings, so just export everything.  import Bag ( emptyBag ) -import BasicTypes ( TupleSort(..) ) +import BasicTypes ( TupleSort(..), SourceText(..), LexicalFixity(..) )  import Class  import CoAxiom  import ConLike @@ -35,10 +34,10 @@ import TcType ( tcSplitSigmaTy )  import TyCon  import Type  import TyCoRep -import TysPrim ( alphaTyVars, unliftedTypeKindTyConName ) +import TysPrim ( alphaTyVars )  import TysWiredIn ( listTyConName, starKindTyConName, unitTy )  import PrelNames ( hasKey, eqTyConKey, ipClassKey -                 , tYPETyConKey, ptrRepLiftedDataConKey, ptrRepUnliftedDataConKey ) +                 , tYPETyConKey, liftedRepDataConKey )  import Unique ( getUnique )  import Util ( filterByList, filterOut )  import Var @@ -78,10 +77,11 @@ tyThingToLHsDecl t = case t of           { tcdCtxt = synifyCtx (classSCTheta cl)           , tcdLName = synifyName cl           , tcdTyVars = synifyTyVars (classTyVars cl) +         , tcdFixity = Prefix           , tcdFDs = map (\ (l,r) -> noLoc                          (map (noLoc . getName) l, map (noLoc . getName) r) ) $                           snd $ classTvsFds cl -         , tcdSigs = noLoc (MinimalSig mempty . noLoc . fmap noLoc $ classMinimalDef cl) : +         , tcdSigs = noLoc (MinimalSig NoSourceText . noLoc . fmap noLoc $ classMinimalDef cl) :                        map (noLoc . synifyTcIdSig DeleteTopLevelQuantification)                          (classMethods cl)           , tcdMeths = emptyBag --ignore default method definitions, they don't affect signature @@ -102,7 +102,7 @@ tyThingToLHsDecl t = case t of      (synifySigWcType ImplicitizeForAll (dataConUserType dc)))    AConLike (PatSynCon ps) -> -    allOK . SigD $ PatSynSig (synifyName ps) (synifyPatSynSigType ps) +    allOK . SigD $ PatSynSig [synifyName ps] (synifyPatSynSigType ps)    where      withErrs e x = return (e, x)      allOK x = return (mempty, x) @@ -115,6 +115,7 @@ synifyAxBranch tc (CoAxBranch { cab_tvs = tkvs, cab_lhs = args, cab_rhs = rhs })      in TyFamEqn { tfe_tycon = name                  , tfe_pats  = HsIB { hsib_body = typats                                     , hsib_vars = map tyVarName tkvs } +                , tfe_fixity = Prefix                  , tfe_rhs   = hs_rhs }  synifyAxiom :: CoAxiom br -> Either ErrMsg (HsDecl Name) @@ -147,6 +148,8 @@ synifyTyCon _coax tc                                                                  alphaTyVars --a, b, c... which are unfortunately all kind *                                     , hsq_dependent = emptyNameSet } +           , tcdFixity = Prefix +             , tcdDataDefn = HsDataDefn { dd_ND = DataType  -- arbitrary lie, they are neither                                                      -- algebraic data nor newtype:                                        , dd_ctxt = noLoc [] @@ -154,7 +157,7 @@ synifyTyCon _coax tc                                        , dd_kindSig = Just (synifyKindSig (tyConKind tc))                                                 -- we have their kind accurately:                                        , dd_cons = []  -- No constructors -                                      , dd_derivs = Nothing } +                                      , dd_derivs = noLoc [] }             , tcdDataCusk = False             , tcdFVs = placeHolderNamesTc } @@ -181,6 +184,7 @@ synifyTyCon _coax tc        FamilyDecl { fdInfo = i                   , fdLName = synifyName tc                   , fdTyVars = synifyTyVars (tyConTyVars tc) +                 , fdFixity = Prefix                   , fdResultSig =                         synifyFamilyResultSig resultVar (tyConResKind tc)                   , fdInjectivityAnn = @@ -192,6 +196,7 @@ synifyTyCon coax tc    | Just ty <- synTyConRhs_maybe tc    = return $ SynDecl { tcdLName = synifyName tc                       , tcdTyVars = synifyTyVars (tyConTyVars tc) +                     , tcdFixity = Prefix                       , tcdRhs = synifyType WithinType ty                       , tcdFVs = placeHolderNamesTc }    | otherwise = @@ -225,7 +230,7 @@ synifyTyCon coax tc    consRaw = map (synifyDataCon use_gadt_syntax) (tyConDataCons tc)    cons = rights consRaw    -- "deriving" doesn't affect the signature, no need to specify any. -  alg_deriv = Nothing +  alg_deriv = noLoc []    defn = HsDataDefn { dd_ND      = alg_nd                      , dd_ctxt    = alg_ctx                      , dd_cType   = Nothing @@ -234,7 +239,8 @@ synifyTyCon coax tc                      , dd_derivs  = alg_deriv }   in case lefts consRaw of    [] -> return $ -        DataDecl { tcdLName = name, tcdTyVars = tyvars, tcdDataDefn = defn +        DataDecl { tcdLName = name, tcdTyVars = tyvars, tcdFixity = Prefix +                 , tcdDataDefn = defn                   , tcdDataCusk = False, tcdFVs = placeHolderNamesTc }    dataConErrs -> Left $ unlines dataConErrs @@ -360,24 +366,20 @@ synifySigType s ty = mkEmptyImplicitBndrs (synifyType s ty)  synifySigWcType :: SynifyTypeState -> Type -> LHsSigWcType Name  -- Ditto (see synifySigType) -synifySigWcType s ty = mkEmptyImplicitBndrs (mkEmptyWildCardBndrs (synifyType s ty)) +synifySigWcType s ty = mkEmptyWildCardBndrs (mkEmptyImplicitBndrs (synifyType s ty))  synifyPatSynSigType :: PatSyn -> LHsSigType Name  -- Ditto (see synifySigType)  synifyPatSynSigType ps = mkEmptyImplicitBndrs (synifyPatSynType ps)  synifyType :: SynifyTypeState -> Type -> LHsType Name -synifyType _ (TyVarTy tv) = noLoc $ HsTyVar $ noLoc (getName tv) +synifyType _ (TyVarTy tv) = noLoc $ HsTyVar NotPromoted $ noLoc (getName tv)  synifyType _ (TyConApp tc tys)    -- Use */# instead of TYPE 'Lifted/TYPE 'Unlifted (#473)    | tc `hasKey` tYPETyConKey    , [TyConApp lev []] <- tys -  , lev `hasKey` ptrRepLiftedDataConKey -  = noLoc (HsTyVar (noLoc starKindTyConName)) -  | tc `hasKey` tYPETyConKey -  , [TyConApp lev []] <- tys -  , lev `hasKey` ptrRepUnliftedDataConKey -  = noLoc (HsTyVar (noLoc unliftedTypeKindTyConName)) +  , lev `hasKey` liftedRepDataConKey +  = noLoc (HsTyVar NotPromoted (noLoc starKindTyConName))    -- Use non-prefix tuple syntax where possible, because it looks nicer.    | Just sort <- tyConTuple_maybe tc    , tyConArity tc == length tys @@ -393,7 +395,7 @@ synifyType _ (TyConApp tc tys)    | tc `hasKey` ipClassKey    , [name, ty] <- tys    , Just x <- isStrLitTy name -  = noLoc $ HsIParamTy (HsIPName x) (synifyType WithinType ty) +  = noLoc $ HsIParamTy (noLoc $ HsIPName x) (synifyType WithinType ty)    -- and equalities    | tc `hasKey` eqTyConKey    , [ty1, ty2] <- tys @@ -401,7 +403,7 @@ synifyType _ (TyConApp tc tys)    -- Most TyCons:    | otherwise =      foldl (\t1 t2 -> noLoc (HsAppTy t1 t2)) -      (noLoc $ HsTyVar $ noLoc (getName tc)) +      (noLoc $ HsTyVar NotPromoted $ noLoc (getName tc))        (map (synifyType WithinType) $         filterOut isCoercionTy tys)  synifyType s (AppTy t1 (CoercionTy {})) = synifyType s t1 @@ -409,7 +411,7 @@ synifyType _ (AppTy t1 t2) = let    s1 = synifyType WithinType t1    s2 = synifyType WithinType t2    in noLoc $ HsAppTy s1 s2 -synifyType _ (ForAllTy (Anon t1) t2) = let +synifyType _ (FunTy t1 t2) = let    s1 = synifyType WithinType t1    s2 = synifyType WithinType t2    in noLoc $ HsFunTy s1 s2 @@ -444,8 +446,8 @@ synifyPatSynType ps = let    in noLoc $ sForAll univ_tvs $ sQual req_theta' $ sForAll ex_tvs $ sQual prov_theta sTau  synifyTyLit :: TyLit -> HsTyLit -synifyTyLit (NumTyLit n) = HsNumTy mempty n -synifyTyLit (StrTyLit s) = HsStrTy mempty s +synifyTyLit (NumTyLit n) = HsNumTy NoSourceText n +synifyTyLit (StrTyLit s) = HsStrTy NoSourceText s  synifyKindSig :: Kind -> LHsKind Name  synifyKindSig k = synifyType WithinType k diff --git a/haddock-api/src/Haddock/GhcUtils.hs b/haddock-api/src/Haddock/GhcUtils.hs index 3933f8e7..c8e5ea8b 100644 --- a/haddock-api/src/Haddock/GhcUtils.hs +++ b/haddock-api/src/Haddock/GhcUtils.hs @@ -104,7 +104,7 @@ sigName (L _ sig) = sigNameNoLoc sig  sigNameNoLoc :: Sig name -> [name]  sigNameNoLoc (TypeSig      ns _)       = map unLoc ns  sigNameNoLoc (ClassOpSig _ ns _)       = map unLoc ns -sigNameNoLoc (PatSynSig    n _)        = [unLoc n] +sigNameNoLoc (PatSynSig    ns _)       = map unLoc ns  sigNameNoLoc (SpecSig      n _ _)      = [unLoc n]  sigNameNoLoc (InlineSig    n _)        = [unLoc n]  sigNameNoLoc (FixSig (FixitySig ns _)) = map unLoc ns diff --git a/haddock-api/src/Haddock/Interface/AttachInstances.hs b/haddock-api/src/Haddock/Interface/AttachInstances.hs index f00da3ea..d5d74819 100644 --- a/haddock-api/src/Haddock/Interface/AttachInstances.hs +++ b/haddock-api/src/Haddock/Interface/AttachInstances.hs @@ -169,15 +169,15 @@ instHead (_, _, cls, args)    = (map argCount args, className cls, map simplify args)  argCount :: Type -> Int -argCount (AppTy t _) = argCount t + 1 +argCount (AppTy t _)     = argCount t + 1  argCount (TyConApp _ ts) = length ts -argCount (ForAllTy (Anon _) _ ) = 2 -argCount (ForAllTy _ t) = argCount t -argCount (CastTy t _) = argCount t +argCount (FunTy _ _ )    = 2 +argCount (ForAllTy _ t)  = argCount t +argCount (CastTy t _)    = argCount t  argCount _ = 0  simplify :: Type -> SimpleType -simplify (ForAllTy (Anon t1) t2) = SimpleType funTyConName [simplify t1, simplify t2] +simplify (FunTy t1 t2)  = SimpleType funTyConName [simplify t1, simplify t2]  simplify (ForAllTy _ t) = simplify t  simplify (AppTy t1 t2) = SimpleType s (ts ++ maybeToList (simplify_maybe t2))    where (SimpleType s ts) = simplify t1 @@ -239,8 +239,9 @@ isTypeHidden expInfo = typeHidden        case t of          TyVarTy {} -> False          AppTy t1 t2 -> typeHidden t1 || typeHidden t2 +        FunTy t1 t2 -> typeHidden t1 || typeHidden t2          TyConApp tcon args -> nameHidden (getName tcon) || any typeHidden args -        ForAllTy bndr ty -> typeHidden (binderType bndr) || typeHidden ty +        ForAllTy bndr ty -> typeHidden (tyVarKind (binderVar bndr)) || typeHidden ty          LitTy _ -> False          CastTy ty _ -> typeHidden ty          CoercionTy {} -> False diff --git a/haddock-api/src/Haddock/Interface/Create.hs b/haddock-api/src/Haddock/Interface/Create.hs index cb855693..c8e6b982 100644 --- a/haddock-api/src/Haddock/Interface/Create.hs +++ b/haddock-api/src/Haddock/Interface/Create.hs @@ -47,7 +47,7 @@ import Bag  import RdrName  import TcRnTypes  import FastString (concatFS) -import BasicTypes ( StringLiteral(..) ) +import BasicTypes ( StringLiteral(..), SourceText(..) )  import qualified Outputable as O  import HsDecls ( getConDetails ) @@ -163,7 +163,7 @@ mkAliasMap dflags mRenamedSource =      Just (_,impDecls,_,_) ->        M.fromList $        mapMaybe (\(SrcLoc.L _ impDecl) -> do -        alias <- ideclAs impDecl +        SrcLoc.L _ alias <- ideclAs impDecl          return $            (lookupModuleDyn dflags               (fmap Module.fsToUnitId $ @@ -305,16 +305,16 @@ mkMaps dflags gre instances decls =        where loc = case d of                TyFamInstD _ -> l -- The CoAx's loc is the whole line, but only for TFs                _ -> getInstLoc d +    names l (DerivD {}) = maybeToList (M.lookup l instanceMap) -- See note [2].      names _ decl = getMainDeclBinder decl  -- Note [2]:  ------------ --- We relate ClsInsts to InstDecls using the SrcSpans buried inside them. --- That should work for normal user-written instances (from looking at GHC --- sources). We can assume that commented instances are user-written. --- This lets us relate Names (from ClsInsts) to comments (associated --- with InstDecls). - +-- We relate ClsInsts to InstDecls and DerivDecls using the SrcSpans buried +-- inside them. That should work for normal user-written instances (from +-- looking at GHC sources). We can assume that commented instances are +-- user-written. This lets us relate Names (from ClsInsts) to comments +-- (associated with InstDecls and DerivDecls).  --------------------------------------------------------------------------------  -- Declarations @@ -338,7 +338,7 @@ subordinates instMap decl = case decl of                     , name <- getMainDeclBinder d, not (isValD d)                     ]      dataSubs :: HsDataDefn Name -> [(Name, [HsDocString], Map Int HsDocString)] -    dataSubs dd = constrs ++ fields +    dataSubs dd = constrs ++ fields ++ derivs        where          cons = map unL $ (dd_cons dd)          constrs = [ (unL cname, maybeToList $ fmap unL $ con_doc c, M.empty) @@ -347,6 +347,11 @@ subordinates instMap decl = case decl of                    | RecCon flds <- map getConDetails cons                    , L _ (ConDeclField ns _ doc) <- (unLoc flds)                    , L _ n <- ns ] +        derivs  = [ (instName, [unL doc], M.empty) +                  | HsIB { hsib_body = L l (HsDocTy _ doc) } +                      <- concatMap (unLoc . deriv_clause_tys . unLoc) $ +                           unLoc $ dd_derivs dd +                  , Just instName <- [M.lookup l instMap] ]  -- | Extract function argument docs from inside types.  typeDocs :: HsDecl Name -> Map Int HsDocString @@ -394,12 +399,12 @@ mkFixMap group_ = M.fromList [ (n,f)  -- | Take all declarations except pragmas, infix decls, rules from an 'HsGroup'.  ungroup :: HsGroup Name -> [LHsDecl Name]  ungroup group_ = -  mkDecls (tyClGroupConcat . hs_tyclds) TyClD  group_ ++ +  mkDecls (tyClGroupTyClDecls . hs_tyclds) TyClD  group_ ++    mkDecls hs_derivds             DerivD group_ ++    mkDecls hs_defds               DefD   group_ ++    mkDecls hs_fords               ForD   group_ ++    mkDecls hs_docs                DocD   group_ ++ -  mkDecls hs_instds              InstD  group_ ++ +  mkDecls (tyClGroupInstDecls . hs_tyclds) InstD  group_ ++    mkDecls (typesigs . hs_valds)  SigD   group_ ++    mkDecls (valbinds . hs_valds)  ValD   group_    where @@ -433,8 +438,9 @@ filterDecls :: [(LHsDecl a, doc)] -> [(LHsDecl a, doc)]  filterDecls = filter (isHandled . unL . fst)    where      isHandled (ForD (ForeignImport {})) = True -    isHandled (TyClD {}) = True -    isHandled (InstD {}) = True +    isHandled (TyClD {})  = True +    isHandled (InstD {})  = True +    isHandled (DerivD {}) = True      isHandled (SigD d) = isUserLSig (reL d)      isHandled (ValD _) = True      -- we keep doc declarations to be able to get at named docs @@ -504,10 +510,10 @@ mkExportItems      Nothing -> fullModuleContents dflags warnings gre maps fixMap splices decls      Just exports -> liftM concat $ mapM lookupExport exports    where -    lookupExport (IEVar (L _ x))         = declWith x -    lookupExport (IEThingAbs (L _ t))    = declWith t -    lookupExport (IEThingAll (L _ t))    = declWith t -    lookupExport (IEThingWith (L _ t) _ _ _) = declWith t +    lookupExport (IEVar (L _ x))         = declWith $ ieWrappedName x +    lookupExport (IEThingAbs (L _ t))    = declWith $ ieWrappedName t +    lookupExport (IEThingAll (L _ t))    = declWith $ ieWrappedName t +    lookupExport (IEThingWith (L _ t) _ _ _) = declWith $ ieWrappedName t      lookupExport (IEModuleContents (L _ m)) =        moduleExports thisMod m dflags warnings gre exportedNames decls modMap instIfaceMap maps fixMap splices      lookupExport (IEGroup lev docStr)  = return $ @@ -562,7 +568,7 @@ mkExportItems                    L loc (TyClD cl@ClassDecl{}) -> do                      mdef <- liftGhcToErrMsgGhc $ minimalDef t -                    let sig = maybeToList $ fmap (noLoc . MinimalSig mempty . noLoc . fmap noLoc) mdef +                    let sig = maybeToList $ fmap (noLoc . MinimalSig NoSourceText . noLoc . fmap noLoc) mdef                      return [ mkExportDecl t                        (L loc $ TyClD cl { tcdSigs = sig ++ tcdSigs cl }) docs_ ] @@ -756,11 +762,13 @@ fullModuleContents dflags warnings gre (docMap, argMap, subMap, declMap, instMap        | otherwise = return Nothing      mkExportItem decl@(L l (InstD d))        | Just name <- M.lookup (getInstLoc d) instMap = -        let (doc, subs) = lookupDocs name warnings docMap argMap subMap in -        return $ Just (ExportDecl decl doc subs [] (fixities name subs) (l `elem` splices)) +        expInst decl l name +    mkExportItem decl@(L l (DerivD {})) +      | Just name <- M.lookup l instMap = +        expInst decl l name      mkExportItem (L l (TyClD cl@ClassDecl{ tcdLName = L _ name, tcdSigs = sigs })) = do        mdef <- liftGhcToErrMsgGhc $ minimalDef name -      let sig = maybeToList $ fmap (noLoc . MinimalSig mempty . noLoc . fmap noLoc) mdef +      let sig = maybeToList $ fmap (noLoc . MinimalSig NoSourceText . noLoc . fmap noLoc) mdef        expDecl (L l (TyClD cl { tcdSigs = sig ++ sigs })) l name      mkExportItem decl@(L l d)        | name:_ <- getMainDeclBinder d = expDecl decl l name @@ -772,6 +780,10 @@ fullModuleContents dflags warnings gre (docMap, argMap, subMap, declMap, instMap      expDecl decl l name = return $ Just (ExportDecl decl doc subs [] (fixities name subs) (l `elem` splices))        where (doc, subs) = lookupDocs name warnings docMap argMap subMap +    expInst decl l name = +        let (doc, subs) = lookupDocs name warnings docMap argMap subMap in +        return $ Just (ExportDecl decl doc subs [] (fixities name subs) (l `elem` splices)) +  -- | Sometimes the declaration we want to export is not the "main" declaration:  -- it might be an individual record selector or a class method.  In these @@ -834,7 +846,7 @@ extractRecSel nm mdl t tvs (L _ con : rest) =    data_ty      -- ResTyGADT _ ty <- con_res con = ty      | ConDeclGADT{} <- con = hsib_body $ con_type con -    | otherwise = foldl' (\x y -> noLoc (HsAppTy x y)) (noLoc (HsTyVar (noLoc t))) tvs +    | otherwise = foldl' (\x y -> noLoc (HsAppTy x y)) (noLoc (HsTyVar NotPromoted (noLoc t))) tvs  -- | Keep export items with docs.  pruneExportItems :: [ExportItem Name] -> [ExportItem Name] diff --git a/haddock-api/src/Haddock/Interface/Rename.hs b/haddock-api/src/Haddock/Interface/Rename.hs index 3054e2f9..f88d9f4e 100644 --- a/haddock-api/src/Haddock/Interface/Rename.hs +++ b/haddock-api/src/Haddock/Interface/Rename.hs @@ -179,7 +179,7 @@ renameLSigType :: LHsSigType Name -> RnM (LHsSigType DocName)  renameLSigType = renameImplicit renameLType  renameLSigWcType :: LHsSigWcType Name -> RnM (LHsSigWcType DocName) -renameLSigWcType = renameImplicit (renameWc renameLType) +renameLSigWcType = renameWc (renameImplicit renameLType)  renameLKind :: LHsKind Name -> RnM (LHsKind DocName)  renameLKind = renameLType @@ -219,7 +219,7 @@ renameType t = case t of      ltype'    <- renameLType ltype      return (HsQualTy { hst_ctxt = lcontext', hst_body = ltype' }) -  HsTyVar (L l n) -> return . HsTyVar . L l =<< rename n +  HsTyVar ip (L l n) -> return . HsTyVar ip . L l =<< rename n    HsBangTy b ltype -> return . HsBangTy b =<< renameLType ltype    HsAppTy a b -> do @@ -238,6 +238,7 @@ renameType t = case t of    HsEqTy ty1 ty2 -> liftM2 HsEqTy (renameLType ty1) (renameLType ty2)    HsTupleTy b ts -> return . HsTupleTy b =<< mapM renameLType ts +  HsSumTy ts -> HsSumTy <$> mapM renameLType ts    HsOpTy a (L loc op) b -> do      op' <- rename op @@ -261,7 +262,7 @@ renameType t = case t of    HsRecTy a               -> HsRecTy <$> mapM renameConDeclFieldField a    HsCoreTy a              -> pure (HsCoreTy a) -  HsExplicitListTy  a b   -> HsExplicitListTy  a <$> mapM renameLType b +  HsExplicitListTy i a b  -> HsExplicitListTy i a <$> mapM renameLType b    HsExplicitTupleTy a b   -> HsExplicitTupleTy a <$> mapM renameLType b    HsSpliceTy _ _          -> error "renameType: HsSpliceTy"    HsWildCardTy a          -> HsWildCardTy <$> renameWildCardInfo a @@ -328,6 +329,9 @@ renameDecl decl = case decl of    InstD d -> do      d' <- renameInstD d      return (InstD d') +  DerivD d -> do +    d' <- renameDerivD d +    return (DerivD d')    _ -> error "renameDecl"  renameLThing :: (a Name -> RnM (a DocName)) -> Located (a Name) -> RnM (Located (a DocName)) @@ -340,19 +344,19 @@ renameTyClD d = case d of      decl' <- renameFamilyDecl decl      return (FamDecl { tcdFam = decl' }) -  SynDecl { tcdLName = lname, tcdTyVars = tyvars, tcdRhs = rhs, tcdFVs = _fvs } -> do +  SynDecl { tcdLName = lname, tcdTyVars = tyvars, tcdFixity = fixity, tcdRhs = rhs, tcdFVs = _fvs } -> do      lname'    <- renameL lname      tyvars'   <- renameLHsQTyVars tyvars      rhs'     <- renameLType rhs -    return (SynDecl { tcdLName = lname', tcdTyVars = tyvars', tcdRhs = rhs', tcdFVs = placeHolderNames }) +    return (SynDecl { tcdLName = lname', tcdTyVars = tyvars', tcdFixity = fixity, tcdRhs = rhs', tcdFVs = placeHolderNames }) -  DataDecl { tcdLName = lname, tcdTyVars = tyvars, tcdDataDefn = defn, tcdFVs = _fvs } -> do +  DataDecl { tcdLName = lname, tcdTyVars = tyvars, tcdFixity = fixity, tcdDataDefn = defn, tcdFVs = _fvs } -> do      lname'    <- renameL lname      tyvars'   <- renameLHsQTyVars tyvars      defn'     <- renameDataDefn defn -    return (DataDecl { tcdLName = lname', tcdTyVars = tyvars', tcdDataDefn = defn', tcdDataCusk = PlaceHolder, tcdFVs = placeHolderNames }) +    return (DataDecl { tcdLName = lname', tcdTyVars = tyvars', tcdFixity = fixity, tcdDataDefn = defn', tcdDataCusk = PlaceHolder, tcdFVs = placeHolderNames }) -  ClassDecl { tcdCtxt = lcontext, tcdLName = lname, tcdTyVars = ltyvars +  ClassDecl { tcdCtxt = lcontext, tcdLName = lname, tcdTyVars = ltyvars, tcdFixity = fixity              , tcdFDs = lfundeps, tcdSigs = lsigs, tcdATs = ats, tcdATDefs = at_defs } -> do      lcontext' <- renameLContext lcontext      lname'    <- renameL lname @@ -363,6 +367,7 @@ renameTyClD d = case d of      at_defs'  <- mapM renameLTyFamDefltEqn at_defs      -- we don't need the default methods or the already collected doc entities      return (ClassDecl { tcdCtxt = lcontext', tcdLName = lname', tcdTyVars = ltyvars' +                      , tcdFixity = fixity                        , tcdFDs = lfundeps', tcdSigs = lsigs', tcdMeths= emptyBag                        , tcdATs = ats', tcdATDefs = at_defs', tcdDocs = [], tcdFVs = placeHolderNames }) @@ -376,7 +381,9 @@ renameTyClD d = case d of  renameFamilyDecl :: FamilyDecl Name -> RnM (FamilyDecl DocName)  renameFamilyDecl (FamilyDecl { fdInfo = info, fdLName = lname -                             , fdTyVars = ltyvars, fdResultSig = result +                             , fdTyVars = ltyvars +                             , fdFixity = fixity +                             , fdResultSig = result                               , fdInjectivityAnn = injectivity }) = do      info'        <- renameFamilyInfo info      lname'       <- renameL lname @@ -384,7 +391,9 @@ renameFamilyDecl (FamilyDecl { fdInfo = info, fdLName = lname      result'      <- renameFamilyResultSig result      injectivity' <- renameMaybeInjectivityAnn injectivity      return (FamilyDecl { fdInfo = info', fdLName = lname' -                       , fdTyVars = ltyvars', fdResultSig = result' +                       , fdTyVars = ltyvars' +                       , fdFixity = fixity +                       , fdResultSig = result'                         , fdInjectivityAnn = injectivity' }) @@ -412,7 +421,8 @@ renameDataDefn (HsDataDefn { dd_ND = nd, dd_ctxt = lcontext, dd_cType = cType      cons'     <- mapM (mapM renameCon) cons      -- I don't think we need the derivings, so we return Nothing      return (HsDataDefn { dd_ND = nd, dd_ctxt = lcontext', dd_cType = cType -                       , dd_kindSig = k', dd_cons = cons', dd_derivs = Nothing }) +                       , dd_kindSig = k', dd_cons = cons' +                       , dd_derivs = noLoc [] })  renameCon :: ConDecl Name -> RnM (ConDecl DocName)  renameCon decl@(ConDeclH98 { con_name = lname, con_qvars = ltyvars @@ -467,10 +477,10 @@ renameSig sig = case sig of      lnames' <- mapM renameL lnames      ltype' <- renameLSigType sig_ty      return (ClassOpSig is_default lnames' ltype') -  PatSynSig lname sig_ty -> do -    lname' <- renameL lname +  PatSynSig lnames sig_ty -> do +    lnames' <- mapM renameL lnames      sig_ty' <- renameLSigType sig_ty -    return $ PatSynSig lname' sig_ty' +    return $ PatSynSig lnames' sig_ty'    FixSig (FixitySig lnames fixity) -> do      lnames' <- mapM renameL lnames      return $ FixSig (FixitySig lnames' fixity) @@ -503,6 +513,15 @@ renameInstD (DataFamInstD { dfid_inst = d }) = do    d' <- renameDataFamInstD d    return (DataFamInstD { dfid_inst = d' }) +renameDerivD :: DerivDecl Name -> RnM (DerivDecl DocName) +renameDerivD (DerivDecl { deriv_type = ty +                        , deriv_strategy = strat +                        , deriv_overlap_mode = omode }) = do +  ty' <- renameLSigType ty +  return (DerivDecl { deriv_type = ty' +                    , deriv_strategy = strat +                    , deriv_overlap_mode = omode }) +  renameClsInstD :: ClsInstDecl Name -> RnM (ClsInstDecl DocName)  renameClsInstD (ClsInstDecl { cid_overlap_mode = omode                              , cid_poly_ty =ltype, cid_tyfam_insts = lATs @@ -523,30 +542,33 @@ renameTyFamInstD (TyFamInstDecl { tfid_eqn = eqn })                                 , tfid_fvs = placeHolderNames }) }  renameLTyFamInstEqn :: LTyFamInstEqn Name -> RnM (LTyFamInstEqn DocName) -renameLTyFamInstEqn (L loc (TyFamEqn { tfe_tycon = tc, tfe_pats = pats, tfe_rhs = rhs })) +renameLTyFamInstEqn (L loc (TyFamEqn { tfe_tycon = tc, tfe_pats = pats, tfe_fixity = fixity, tfe_rhs = rhs }))    = do { tc' <- renameL tc         ; pats' <- renameImplicit (mapM renameLType) pats         ; rhs' <- renameLType rhs         ; return (L loc (TyFamEqn { tfe_tycon = tc'                                   , tfe_pats = pats' +                                 , tfe_fixity = fixity                                   , tfe_rhs = rhs' })) }  renameLTyFamDefltEqn :: LTyFamDefltEqn Name -> RnM (LTyFamDefltEqn DocName) -renameLTyFamDefltEqn (L loc (TyFamEqn { tfe_tycon = tc, tfe_pats = tvs, tfe_rhs = rhs })) +renameLTyFamDefltEqn (L loc (TyFamEqn { tfe_tycon = tc, tfe_pats = tvs, tfe_fixity = fixity, tfe_rhs = rhs }))    = do { tc'  <- renameL tc         ; tvs' <- renameLHsQTyVars tvs         ; rhs' <- renameLType rhs         ; return (L loc (TyFamEqn { tfe_tycon = tc'                                   , tfe_pats = tvs' +                                 , tfe_fixity = fixity                                   , tfe_rhs = rhs' })) }  renameDataFamInstD :: DataFamInstDecl Name -> RnM (DataFamInstDecl DocName) -renameDataFamInstD (DataFamInstDecl { dfid_tycon = tc, dfid_pats = pats, dfid_defn = defn }) +renameDataFamInstD (DataFamInstDecl { dfid_tycon = tc, dfid_pats = pats, dfid_fixity = fixity, dfid_defn = defn })    = do { tc' <- renameL tc         ; pats' <- renameImplicit (mapM renameLType) pats         ; defn' <- renameDataDefn defn         ; return (DataFamInstDecl { dfid_tycon = tc'                                   , dfid_pats = pats' +                                 , dfid_fixity = fixity                                   , dfid_defn = defn', dfid_fvs = placeHolderNames }) }  renameImplicit :: (in_thing -> RnM out_thing) @@ -563,7 +585,7 @@ renameWc :: (in_thing -> RnM out_thing)  renameWc rn_thing (HsWC { hswc_body = thing })    = do { thing' <- rn_thing thing         ; return (HsWC { hswc_body = thing' -                      , hswc_wcs = PlaceHolder, hswc_ctx = Nothing }) } +                      , hswc_wcs = PlaceHolder }) }  renameDocInstance :: DocInstance Name -> RnM (DocInstance DocName)  renameDocInstance (inst, idoc, L l n) = do diff --git a/haddock-api/src/Haddock/Interface/Specialize.hs b/haddock-api/src/Haddock/Interface/Specialize.hs index ab719fe8..28bbf305 100644 --- a/haddock-api/src/Haddock/Interface/Specialize.hs +++ b/haddock-api/src/Haddock/Interface/Specialize.hs @@ -36,7 +36,7 @@ specialize :: (Eq name, Typeable name)  specialize name details =      everywhere $ mkT step    where -    step (HsTyVar (L _ name')) | name == name' = details +    step (HsTyVar _ (L _ name')) | name == name' = details      step typ = typ @@ -81,10 +81,10 @@ specializeSig :: forall name . (Eq name, DataId name, SetName name)                -> Sig name                -> Sig name  specializeSig bndrs typs (TypeSig lnames typ) = -    TypeSig lnames (typ { hsib_body = (hsib_body typ) { hswc_body = noLoc typ'}}) +    TypeSig lnames (typ { hswc_body = (hswc_body typ) { hsib_body = noLoc typ'}})    where      true_type :: HsType name -    true_type = unLoc (hswc_body (hsib_body typ)) +    true_type = unLoc (hsSigWcType typ)      typ' :: HsType name      typ' = rename fv . sugar $ specializeTyVarBndrs bndrs typs true_type      fv = foldr Set.union Set.empty . map freeVariables $ typs @@ -123,7 +123,7 @@ sugar =  sugarLists :: NamedThing name => HsType name -> HsType name -sugarLists (HsAppTy (L _ (HsTyVar (L _ name))) ltyp) +sugarLists (HsAppTy (L _ (HsTyVar _ (L _ name))) ltyp)      | isBuiltInSyntax name' && strName == "[]" = HsListTy ltyp    where      name' = getName name @@ -137,7 +137,7 @@ sugarTuples typ =    where      aux apps (HsAppTy (L _ ftyp) atyp) = aux (atyp:apps) ftyp      aux apps (HsParTy (L _ typ')) = aux apps typ' -    aux apps (HsTyVar (L _ name)) +    aux apps (HsTyVar _ (L _ name))          | isBuiltInSyntax name' && suitable = HsTupleTy HsBoxedTuple apps        where          name' = getName name @@ -149,7 +149,7 @@ sugarTuples typ =  sugarOperators :: NamedThing name => HsType name -> HsType name -sugarOperators (HsAppTy (L _ (HsAppTy (L _ (HsTyVar (L l name))) la)) lb) +sugarOperators (HsAppTy (L _ (HsAppTy (L _ (HsTyVar _ (L l name))) la)) lb)      | isSymOcc $ getOccName name' = mkHsOpTy la (L l name) lb      | isBuiltInSyntax name' && getOccString name == "(->)" = HsFunTy la lb    where @@ -224,7 +224,7 @@ freeVariables =      query term ctx = case cast term :: Maybe (HsType name) of          Just (HsForAllTy bndrs _) ->              (Set.empty, Set.union ctx (bndrsNames bndrs)) -        Just (HsTyVar (L _ name)) +        Just (HsTyVar _ (L _ name))              | getName name `Set.member` ctx -> (Set.empty, ctx)              | otherwise -> (Set.singleton $ getNameRep name, ctx)          _ -> (Set.empty, ctx) @@ -267,12 +267,13 @@ renameType (HsQualTy lctxt lt) =    HsQualTy          <$> located renameContext lctxt          <*> renameLType lt -renameType (HsTyVar name) = HsTyVar <$> located renameName name +renameType (HsTyVar ip name) = HsTyVar ip <$> located renameName name  renameType (HsAppTy lf la) = HsAppTy <$> renameLType lf <*> renameLType la  renameType (HsFunTy la lr) = HsFunTy <$> renameLType la <*> renameLType lr  renameType (HsListTy lt) = HsListTy <$> renameLType lt  renameType (HsPArrTy lt) = HsPArrTy <$> renameLType lt  renameType (HsTupleTy srt lt) = HsTupleTy srt <$> mapM renameLType lt +renameType (HsSumTy lt) = HsSumTy <$> mapM renameLType lt  renameType (HsOpTy la lop lb) =      HsOpTy <$> renameLType la <*> located renameName lop <*> renameLType lb  renameType (HsParTy lt) = HsParTy <$> renameLType lt @@ -284,8 +285,8 @@ renameType (HsDocTy lt doc) = HsDocTy <$> renameLType lt <*> pure doc  renameType (HsBangTy bang lt) = HsBangTy bang <$> renameLType lt  renameType t@(HsRecTy _) = pure t  renameType t@(HsCoreTy _) = pure t -renameType (HsExplicitListTy ph ltys) = -    HsExplicitListTy ph <$> renameLTypes ltys +renameType (HsExplicitListTy ip ph ltys) = +    HsExplicitListTy ip ph <$> renameLTypes ltys  renameType (HsExplicitTupleTy phs ltys) =      HsExplicitTupleTy phs <$> renameLTypes ltys  renameType t@(HsTyLit _) = pure t diff --git a/haddock-api/src/Haddock/InterfaceFile.hs b/haddock-api/src/Haddock/InterfaceFile.hs index f45589a0..0d000029 100644 --- a/haddock-api/src/Haddock/InterfaceFile.hs +++ b/haddock-api/src/Haddock/InterfaceFile.hs @@ -38,6 +38,7 @@ import FastString  import GHC hiding (NoLink)  import GhcMonad (withSession)  import HscTypes +import NameCache  import IfaceEnv  import Name  import UniqFM @@ -81,8 +82,8 @@ binaryInterfaceMagic = 0xD0Cface  -- (2) set `binaryInterfaceVersionCompatibility` to [binaryInterfaceVersion]  --  binaryInterfaceVersion :: Word16 -#if (__GLASGOW_HASKELL__ >= 711) && (__GLASGOW_HASKELL__ < 801) -binaryInterfaceVersion = 28 +#if (__GLASGOW_HASKELL__ >= 802) && (__GLASGOW_HASKELL__ < 804) +binaryInterfaceVersion = 29  binaryInterfaceVersionCompatibility :: [Word16]  binaryInterfaceVersionCompatibility = [binaryInterfaceVersion] @@ -125,6 +126,7 @@ writeInterfaceFile filename iface = do    -- put the main thing    let bh = setUserData bh0 $ newWriteState (putName bin_symtab) +                                           (putName bin_symtab)                                             (putFastString bin_dict)    put_ bh iface diff --git a/haddock-api/src/Haddock/Types.hs b/haddock-api/src/Haddock/Types.hs index dcc50b95..8addfa2f 100644 --- a/haddock-api/src/Haddock/Types.hs +++ b/haddock-api/src/Haddock/Types.hs @@ -1,7 +1,10 @@ -{-# LANGUAGE CPP #-} -{-# LANGUAGE DeriveDataTypeable, DeriveFunctor, DeriveFoldable, DeriveTraversable, StandaloneDeriving #-} -{-# LANGUAGE TypeFamilies, RecordWildCards #-} +{-# LANGUAGE CPP, DeriveDataTypeable, DeriveFunctor, DeriveFoldable, DeriveTraversable, StandaloneDeriving, TypeFamilies, RecordWildCards #-} +{-# LANGUAGE FlexibleContexts #-} +{-# LANGUAGE UndecidableInstances #-} -- Note [Pass sensitive types] +                                      -- in module GHC.PlaceHolder +  {-# OPTIONS_GHC -fno-warn-orphans #-} +  -----------------------------------------------------------------------------  -- |  -- Module      :  Haddock.Types @@ -343,7 +346,8 @@ data InstType name    | TypeInst  (Maybe (HsType name)) -- ^ Body (right-hand side)    | DataInst (TyClDecl name)        -- ^ Data constructors -instance OutputableBndr a => Outputable (InstType a) where +instance (OutputableBndrId a) +         => Outputable (InstType a) where    ppr (ClassInst { .. }) = text "ClassInst"        <+> ppr clsiCtx        <+> ppr clsiTyVars @@ -378,8 +382,8 @@ mkPseudoFamilyDecl (FamilyDecl { .. }) = PseudoFamilyDecl      mkType (KindedTyVar (L loc name) lkind) =          HsKindSig tvar lkind        where -        tvar = L loc (HsTyVar (L loc name)) -    mkType (UserTyVar name) = HsTyVar name +        tvar = L loc (HsTyVar NotPromoted (L loc name)) +    mkType (UserTyVar name) = HsTyVar NotPromoted name  -- | An instance head that may have documentation and a source location. @@ -449,8 +453,8 @@ instance (NFData a, NFData mod)      DocExamples a             -> a `deepseq` ()      DocHeader a               -> a `deepseq` () -#if !MIN_VERSION_GLASGOW_HASKELL(8,0,1,1) --- These were added to GHC itself in 8.0.2 +#if __GLASGOW_HASKELL__ < 801 +-- These were added to GHC itself in 8.2.1  instance NFData Name where rnf x = seq x ()  instance NFData OccName where rnf x = seq x ()  instance NFData ModuleName where rnf x = seq x () diff --git a/haddock-api/src/Haddock/Utils.hs b/haddock-api/src/Haddock/Utils.hs index 389aa5ab..404cfcf6 100644 --- a/haddock-api/src/Haddock/Utils.hs +++ b/haddock-api/src/Haddock/Utils.hs @@ -128,7 +128,7 @@ mkMeta x = emptyMetaDoc { _doc = x }  mkEmptySigWcType :: LHsType Name -> LHsSigWcType Name  -- Dubious, because the implicit binders are empty even  -- though the type might have free varaiables -mkEmptySigWcType ty = mkEmptyImplicitBndrs (mkEmptyWildCardBndrs ty) +mkEmptySigWcType ty = mkEmptyWildCardBndrs (mkEmptyImplicitBndrs ty)  addClassContext :: Name -> LHsQTyVars Name -> LSig Name -> LSig Name  -- Add the class context to a class-op signature @@ -150,7 +150,7 @@ addClassContext _ _ sig = sig   -- E.g. a MinimalSig is fine  lHsQTyVarsToTypes :: LHsQTyVars Name -> [LHsType Name]  lHsQTyVarsToTypes tvs -  = [ noLoc (HsTyVar (noLoc (hsLTyVarName tv))) +  = [ noLoc (HsTyVar NotPromoted (noLoc (hsLTyVarName tv)))      | tv <- hsQTvExplicit tvs ]  -------------------------------------------------------------------------------- diff --git a/haddock-library/haddock-library.cabal b/haddock-library/haddock-library.cabal index 5eced02d..cabfbc67 100644 --- a/haddock-library/haddock-library.cabal +++ b/haddock-library/haddock-library.cabal @@ -21,7 +21,7 @@ library    default-language:     Haskell2010    build-depends: -      base >= 4.5 && < 4.10 +      base >= 4.5 && < 4.11      , bytestring      , transformers      , deepseq diff --git a/haddock.cabal b/haddock.cabal index 49745a10..6ebdad76 100644 --- a/haddock.cabal +++ b/haddock.cabal @@ -43,7 +43,7 @@ executable haddock    ghc-options:          -funbox-strict-fields -Wall -fwarn-tabs -O2 -threaded    build-depends: -    base >= 4.3 && < 4.10 +    base >= 4.3 && < 4.11    if flag(in-ghc-tree)      hs-source-dirs: haddock-api/src, haddock-library/vendor/attoparsec-0.12.1.1, haddock-library/src      cpp-options: -DIN_GHC_TREE @@ -56,7 +56,7 @@ executable haddock        xhtml >= 3000.2 && < 3000.3,        Cabal >= 1.10,        ghc-boot, -      ghc >= 7.11 && < 8.1, +      ghc == 8.2.*,        bytestring,        transformers | 
