module HsDeclPretty (ppContext,ppFunDeps) where
import HsDeclStruct
import HsIdentPretty()
import HsAssocPretty()
import PrettySymbols(el,rarrow)
import PrettyPrint
import PrettyUtil(ppWhere,ppContext)
import HsGuardsPretty(ppRhs)
instance (PrintableOp i,Printable e, Printable p, Printable ds,
Printable t, Printable c, Printable tp) =>
Printable (DI i e p ds t c tp) where
ppi (HsTypeDecl _ tp t) =
sep [kw "type" <+> tp <+> equals, dataNest t ]
ppi (HsNewTypeDecl _ c tp t ders) =
sep [kw "newtype" <+> (ppContext $ ppis c) <+> tp <+> equals,
dataNest $ sep [ppi t, ppDeriving ders] ]
ppi (HsDataDecl _ c tp summands ders) =
sep [kw "data" <+> (ppContext $ ppis c) <+> tp,
dataNest $
sep [sep (zipWith (<+>) (equals : repeat (kw "|")) summands),
ppDeriving ders]]
ppi (HsClassDecl _ c tp fundeps ds) =
sep [kw "class" <+> sep [ppContext $ ppis c, ppi tp, ppFunDeps fundeps],
nest 2 $ ppWhere (ppis ds)]
ppi (HsInstDecl _ optn c tp ds) =
sep [kw "instance" <+> sep [ppContext $ ppis c, ppi tp],
nest 2 $ ppWhere (ppis ds)]
ppi (HsDefaultDecl _ t) = kw "default" <+> ppiFTuple t
ppi (HsTypeSig _ ns c t) =
-- If they are printed vertically, every name except the first one
-- must be indented...
sep [hcat (punctuate comma (map wrap ns)),
letNest $ el <+> ppContext (ppis c) <+> t]
ppi (HsFunBind _ ms) = vcat ms
ppi (HsPatBind _ p rhs ds) =
sep [wrap p, nest 2 $ sep [ppRhs equals rhs, ppWhere (ppis ds)]]
ppi (HsInfixDecl _ fixity ops) =
fixity <+> (fsep $ punctuate comma $ map ppiOp ops)
ppi (HsPrimitiveTypeDecl _ ctx tp) =
kw "data" <+> ppContext (ppis ctx) <+> tp
ppi (HsPrimitiveBind _ nm tp) =
kw "foreign" <+> kw "import" <+> wrap nm <+> el <+> tp
wrap = ppi
instance (Printable i,Printable e, Printable p, Printable ds) =>
Printable (HsMatchI i e p ds) where
ppi (HsMatch _ f ps rhs ds)
= sep [wrap f <+> fsep (map wrap ps),
nest 2 $ sep [ppRhs equals rhs, ppWhere (ppis ds)]]
wrap = ppi
instance (PrintableOp i,Printable t,Printable c)
=> Printable (HsConDeclI i t c) where
ppi (HsConDecl _ is c n [t1,t2]) | isOp n = ppiBinOp t1 (con (ppiOp n)) t2
ppi (HsConDecl _ is c n ts) = con (wrap n) <+> (fsep $ map wrap ts)
ppi (HsRecDecl _ is c n fs)
= con (wrap n) <+> (braces $ ppiFSeq $ map ppField fs)
where ppField (ns, t) = wrapFSeq ns <+> el <+> t
wrap = ppi
instance Printable t => Printable (HsBangType t) where
ppi (HsBangedType t) = kw '!' <> wrap t
ppi (HsUnBangedType t) = ppi t
wrap (HsBangedType t) = kw '!' <> wrap t
wrap (HsUnBangedType t) = wrap t
-- Pretty prints deriving clauses
--ppDeriving :: [HsName] -> Doc
ppDeriving [] = empty
ppDeriving [i] = kw "deriving" <+> tcon i
ppDeriving is = kw "deriving" <+> ppiFTuple (map tcon is)
ppFunDeps [] = empty
ppFunDeps fs = kw '|' <+> ppiFSeq (map ppFunDep fs)
ppFunDep (ts1,ts2) = fsep ts1<>rarrow<>fsep ts2