{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE FlexibleInstances #-}
module GHC.Hs (
module GHC.Hs.Binds,
module GHC.Hs.Decls,
module GHC.Hs.Expr,
module GHC.Hs.ImpExp,
module GHC.Hs.Lit,
module GHC.Hs.Pat,
module GHC.Hs.Type,
module GHC.Hs.Utils,
module GHC.Hs.Doc,
module GHC.Hs.Extension,
Fixity,
HsModule(..),
) where
import GHC.Prelude
import GHC.Hs.Decls
import GHC.Hs.Binds
import GHC.Hs.Expr
import GHC.Hs.ImpExp
import GHC.Hs.Lit
import GHC.Hs.Extension
import GHC.Hs.Pat
import GHC.Hs.Type
import GHC.Types.Basic ( Fixity, WarningTxt )
import GHC.Hs.Utils
import GHC.Hs.Doc
import GHC.Hs.Instances ()
import GHC.Utils.Outputable
import GHC.Types.SrcLoc
import GHC.Unit.Module ( ModuleName )
import Data.Data hiding ( Fixity )
data HsModule
= HsModule {
HsModule -> LayoutInfo
hsmodLayout :: LayoutInfo,
HsModule -> Maybe (Located ModuleName)
hsmodName :: Maybe (Located ModuleName),
HsModule -> Maybe (Located [LIE GhcPs])
hsmodExports :: Maybe (Located [LIE GhcPs]),
HsModule -> [LImportDecl GhcPs]
hsmodImports :: [LImportDecl GhcPs],
HsModule -> [LHsDecl GhcPs]
hsmodDecls :: [LHsDecl GhcPs],
HsModule -> Maybe (Located WarningTxt)
hsmodDeprecMessage :: Maybe (Located WarningTxt),
:: Maybe LHsDocString
}
deriving instance Data HsModule
instance Outputable HsModule where
ppr :: HsModule -> SDoc
ppr (HsModule LayoutInfo
_ Maybe (Located ModuleName)
Nothing Maybe (Located [LIE GhcPs])
_ [LImportDecl GhcPs]
imports [LHsDecl GhcPs]
decls Maybe (Located WarningTxt)
_ Maybe LHsDocString
mbDoc)
= Maybe LHsDocString -> SDoc
forall t. Outputable t => Maybe t -> SDoc
pp_mb Maybe LHsDocString
mbDoc SDoc -> SDoc -> SDoc
$$ [LImportDecl GhcPs] -> SDoc
forall t. Outputable t => [t] -> SDoc
pp_nonnull [LImportDecl GhcPs]
imports
SDoc -> SDoc -> SDoc
$$ [LHsDecl GhcPs] -> SDoc
forall t. Outputable t => [t] -> SDoc
pp_nonnull [LHsDecl GhcPs]
decls
ppr (HsModule LayoutInfo
_ (Just Located ModuleName
name) Maybe (Located [LIE GhcPs])
exports [LImportDecl GhcPs]
imports [LHsDecl GhcPs]
decls Maybe (Located WarningTxt)
deprec Maybe LHsDocString
mbDoc)
= [SDoc] -> SDoc
vcat [
Maybe LHsDocString -> SDoc
forall t. Outputable t => Maybe t -> SDoc
pp_mb Maybe LHsDocString
mbDoc,
case Maybe (Located [LIE GhcPs])
exports of
Maybe (Located [LIE GhcPs])
Nothing -> SDoc -> SDoc
pp_header (String -> SDoc
text String
"where")
Just Located [LIE GhcPs]
es -> [SDoc] -> SDoc
vcat [
SDoc -> SDoc
pp_header SDoc
lparen,
Int -> SDoc -> SDoc
nest Int
8 ([SDoc] -> SDoc
fsep (SDoc -> [SDoc] -> [SDoc]
punctuate SDoc
comma ((LIE GhcPs -> SDoc) -> [LIE GhcPs] -> [SDoc]
forall a b. (a -> b) -> [a] -> [b]
map LIE GhcPs -> SDoc
forall a. Outputable a => a -> SDoc
ppr (Located [LIE GhcPs] -> [LIE GhcPs]
forall l e. GenLocated l e -> e
unLoc Located [LIE GhcPs]
es)))),
Int -> SDoc -> SDoc
nest Int
4 (String -> SDoc
text String
") where")
],
[LImportDecl GhcPs] -> SDoc
forall t. Outputable t => [t] -> SDoc
pp_nonnull [LImportDecl GhcPs]
imports,
[LHsDecl GhcPs] -> SDoc
forall t. Outputable t => [t] -> SDoc
pp_nonnull [LHsDecl GhcPs]
decls
]
where
pp_header :: SDoc -> SDoc
pp_header SDoc
rest = case Maybe (Located WarningTxt)
deprec of
Maybe (Located WarningTxt)
Nothing -> SDoc
pp_modname SDoc -> SDoc -> SDoc
<+> SDoc
rest
Just Located WarningTxt
d -> [SDoc] -> SDoc
vcat [ SDoc
pp_modname, Located WarningTxt -> SDoc
forall a. Outputable a => a -> SDoc
ppr Located WarningTxt
d, SDoc
rest ]
pp_modname :: SDoc
pp_modname = String -> SDoc
text String
"module" SDoc -> SDoc -> SDoc
<+> Located ModuleName -> SDoc
forall a. Outputable a => a -> SDoc
ppr Located ModuleName
name
pp_mb :: Outputable t => Maybe t -> SDoc
pp_mb :: forall t. Outputable t => Maybe t -> SDoc
pp_mb (Just t
x) = t -> SDoc
forall a. Outputable a => a -> SDoc
ppr t
x
pp_mb Maybe t
Nothing = SDoc
empty
pp_nonnull :: Outputable t => [t] -> SDoc
pp_nonnull :: forall t. Outputable t => [t] -> SDoc
pp_nonnull [] = SDoc
empty
pp_nonnull [t]
xs = [SDoc] -> SDoc
vcat ((t -> SDoc) -> [t] -> [SDoc]
forall a b. (a -> b) -> [a] -> [b]
map t -> SDoc
forall a. Outputable a => a -> SDoc
ppr [t]
xs)