hindent-6.3.0: src/HIndent/Ast/Declaration/Family/Data.hs
{-# LANGUAGE RecordWildCards #-}
module HIndent.Ast.Declaration.Family.Data
( DataFamily
, mkDataFamily
) where
import Control.Monad
import qualified GHC.Types.Basic as GHC
import qualified GHC.Types.SrcLoc as GHC
import HIndent.Applicative
import HIndent.Ast.Name.Prefix
import HIndent.Ast.NodeComments hiding (fromEpAnn)
import HIndent.Ast.Type
import HIndent.Ast.Type.Variable
import HIndent.Ast.WithComments
import qualified HIndent.GhcLibParserWrapper.GHC.Hs as GHC
import {-# SOURCE #-} HIndent.Pretty
import HIndent.Pretty.Combinators
import HIndent.Pretty.NodeComments
data DataFamily = DataFamily
{ isTopLevel :: Bool
, name :: WithComments PrefixName
, typeVariables :: [WithComments TypeVariable]
, signature :: Maybe (WithComments Type)
}
instance CommentExtraction DataFamily where
nodeComments DataFamily {} = NodeComments [] [] []
instance Pretty DataFamily where
pretty' DataFamily {..} = do
string "data "
when isTopLevel $ string "family "
pretty name
spacePrefixed $ fmap pretty typeVariables
whenJust signature $ \sig -> space >> pretty sig
mkDataFamily :: GHC.FamilyDecl GHC.GhcPs -> Maybe DataFamily
mkDataFamily GHC.FamilyDecl {fdTyVars = GHC.HsQTvs {..}, ..}
| GHC.DataFamily <- fdInfo
, Nothing <- fdInjectivityAnn = Just DataFamily {..}
| otherwise = Nothing
where
isTopLevel =
case fdTopLevel of
GHC.TopLevel -> True
GHC.NotTopLevel -> False
name = fromGenLocated $ fmap mkPrefixName fdLName
typeVariables = fmap (fmap mkTypeVariable . fromGenLocated) hsq_explicit
signature =
case GHC.unLoc fdResultSig of
GHC.NoSig {} -> Nothing
GHC.KindSig _ kind -> Just $ mkType <$> fromGenLocated kind
GHC.TyVarSig {} ->
error
"Data family should never have this AST node. If you see this error, please report it to the HIndent maintainers."