@@ -10,8 +10,10 @@ module Ormolu.Printer.Meat.Declaration.TypeFamily
1010 )
1111where
1212
13+import BasicTypes (LexicalFixity (..))
1314import Control.Monad
14−import Data.Maybe (maybeToList, isJust)
15+import Data.List.NonEmpty (NonEmpty (..))
16+import Data.Maybe (isNothing, isJust)
1517import GHC
1618import Ormolu.Printer.Combinators
1719import Ormolu.Printer.Meat.Common
@@ -22,19 +24,26 @@ import SrcLoc (Located, GenLocated (..))
2224p_famDecl :: FamilyDecl GhcPs -> R ()
2325p_famDecl FamilyDecl {..} = do
2426 mmeqs <- case fdInfo of
25− DataFamily -> Nothing <$ txt "data family "
26− OpenTypeFamily -> Nothing <$ txt "type family "
27− ClosedTypeFamily eqs -> Just eqs <$ txt "type family "
28− p_rdrName fdLName
29− space
27+ DataFamily -> Nothing <$ txt "data family"
28+ OpenTypeFamily -> Nothing <$ txt "type family"
29+ ClosedTypeFamily eqs -> Just eqs <$ txt "type family"
30+ breakpoint
3031 let HsQTvs {..} = fdTyVars
31− items =
32− maybeToList (p_familyResultSigL (isJust fdInjectivityAnn) fdResultSig)
33− ++ (located' p_injectivityAnn <$> maybeToList fdInjectivityAnn)
34− spaceSep (located' p_hsTyVarBndr) hsq_explicit
35− unless (null items) $
36− breakpoint
37− inci . inci $ spaceSep id items
32+ combinedSpans = combineSrcSpans' $
33+ getSpan fdLName :| fmap getSpan hsq_explicit
34+ inci $ do
35+ switchLayout combinedSpans $ p_infixDefHelper
36+ (isInfix fdFixity)
37+ inci
38+ (p_rdrName fdLName)
39+ (located' p_hsTyVarBndr <$> hsq_explicit)
40+ let rsig = p_familyResultSigL (isJust fdInjectivityAnn) fdResultSig
41+ unless (isNothing rsig && isNothing fdInjectivityAnn) $
42+ breakpoint
43+ inci $ do
44+ sequence_ rsig
45+ when (isJust rsig && isJust fdInjectivityAnn) breakpoint
46+ forM_ fdInjectivityAnn (located' p_injectivityAnn)
3847 case mmeqs of
3948 Nothing -> newline
4049 Just meqs -> do
@@ -74,10 +83,22 @@ p_injectivityAnn (InjectivityAnn a bs) = do
7483p_tyFamInstEqn :: TyFamInstEqn GhcPs -> R ()
7584p_tyFamInstEqn HsIB {..} = do
7685 let FamEqn {..} = hsib_body
77− p_rdrName feqn_tycon
78− space
79− spaceSep (located' p_hsType) feqn_pats
86+ combinedSpans = combineSrcSpans' $
87+ getSpan feqn_tycon :| fmap getSpan feqn_pats
88+ switchLayout combinedSpans $ p_infixDefHelper
89+ (isInfix feqn_fixity)
90+ inci
91+ (p_rdrName feqn_tycon)
92+ (located' p_hsType <$> feqn_pats)
8093 txt " ="
8194 breakpoint
8295 inci (located feqn_rhs p_hsType)
8396p_tyFamInstEqn (XHsImplicitBndrs NoExt) = notImplemented "XHsImplicitBndrs"
97+
98+----------------------------------------------------------------------------
99+-- Helpers
100+
101+isInfix :: LexicalFixity -> Bool
102+isInfix = \case
103+ Infix -> True
104+ Prefix -> False