{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE FlexibleInstances #-}
module HsSyn (
module HsBinds,
module HsDecls,
module HsExpr,
module HsImpExp,
module HsLit,
module HsPat,
module HsTypes,
module HsUtils,
module HsDoc,
module PlaceHolder,
module HsExtension,
Fixity,
HsModule(..),
) where
import GhcPrelude
import HsDecls
import HsBinds
import HsExpr
import HsImpExp
import HsLit
import PlaceHolder
import HsExtension
import HsPat
import HsTypes
import BasicTypes ( Fixity, WarningTxt )
import HsUtils
import HsDoc
import HsInstances ()
import Outputable
import SrcLoc
import Module ( ModuleName )
import Data.Data hiding ( Fixity )
data HsModule pass
= HsModule {
HsModule pass -> Maybe (Located ModuleName)
hsmodName :: Maybe (Located ModuleName),
HsModule pass -> Maybe (Located [LIE pass])
hsmodExports :: Maybe (Located [LIE pass]),
HsModule pass -> [LImportDecl pass]
hsmodImports :: [LImportDecl pass],
HsModule pass -> [LHsDecl pass]
hsmodDecls :: [LHsDecl pass],
HsModule pass -> Maybe (Located WarningTxt)
hsmodDeprecMessage :: Maybe (Located WarningTxt),
:: Maybe LHsDocString
}
deriving instance Data (HsModule GhcPs)
deriving instance Data (HsModule GhcRn)
deriving instance Data (HsModule GhcTc)
instance (p ~ GhcPass pass, OutputableBndrId p) => Outputable (HsModule p) where
ppr :: HsModule p -> SDoc
ppr (HsModule Nothing _ imports :: [LImportDecl p]
imports decls :: [LHsDecl p]
decls _ mbDoc :: Maybe LHsDocString
mbDoc)
= Maybe LHsDocString -> SDoc
forall t. Outputable t => Maybe t -> SDoc
pp_mb Maybe LHsDocString
mbDoc SDoc -> SDoc -> SDoc
$$ [LImportDecl p] -> SDoc
forall t. Outputable t => [t] -> SDoc
pp_nonnull [LImportDecl p]
imports
SDoc -> SDoc -> SDoc
$$ [LHsDecl p] -> SDoc
forall t. Outputable t => [t] -> SDoc
pp_nonnull [LHsDecl p]
decls
ppr (HsModule (Just name :: Located ModuleName
name) exports :: Maybe (Located [LIE p])
exports imports :: [LImportDecl p]
imports decls :: [LHsDecl p]
decls deprec :: Maybe (Located WarningTxt)
deprec mbDoc :: 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 p])
exports of
Nothing -> SDoc -> SDoc
pp_header (String -> SDoc
text "where")
Just es :: Located [LIE p]
es -> [SDoc] -> SDoc
vcat [
SDoc -> SDoc
pp_header SDoc
lparen,
Int -> SDoc -> SDoc
nest 8 ([SDoc] -> SDoc
fsep (SDoc -> [SDoc] -> [SDoc]
punctuate SDoc
comma ((LIE (GhcPass pass) -> SDoc) -> [LIE (GhcPass pass)] -> [SDoc]
forall a b. (a -> b) -> [a] -> [b]
map LIE (GhcPass pass) -> SDoc
forall a. Outputable a => a -> SDoc
ppr (Located [LIE p] -> SrcSpanLess (Located [LIE p])
forall a. HasSrcSpan a => a -> SrcSpanLess a
unLoc Located [LIE p]
es)))),
Int -> SDoc -> SDoc
nest 4 (String -> SDoc
text ") where")
],
[LImportDecl p] -> SDoc
forall t. Outputable t => [t] -> SDoc
pp_nonnull [LImportDecl p]
imports,
[LHsDecl p] -> SDoc
forall t. Outputable t => [t] -> SDoc
pp_nonnull [LHsDecl p]
decls
]
where
pp_header :: SDoc -> SDoc
pp_header rest :: SDoc
rest = case Maybe (Located WarningTxt)
deprec of
Nothing -> SDoc
pp_modname SDoc -> SDoc -> SDoc
<+> SDoc
rest
Just d :: 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 "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 :: Maybe t -> SDoc
pp_mb (Just x :: t
x) = t -> SDoc
forall a. Outputable a => a -> SDoc
ppr t
x
pp_mb Nothing = SDoc
empty
pp_nonnull :: Outputable t => [t] -> SDoc
pp_nonnull :: [t] -> SDoc
pp_nonnull [] = SDoc
empty
pp_nonnull xs :: [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)