@@ -30,33 +30,32 @@ p_classDecl
3030 :: LHsContext GhcPs
3131 -> Located RdrName
3232 -> LHsQTyVars GhcPs
33+ -> LexicalFixity
3334 -> [Located (FunDep (Located RdrName))]
3435 -> [LSig GhcPs]
3536 -> LHsBinds GhcPs
3637 -> [LFamilyDecl GhcPs]
3738 -> [LTyFamDefltEqn GhcPs]
3839 -> R ()
39−p_classDecl ctx name tvars fdeps csigs cdefs cats catdefs = do
40+p_classDecl ctx name tvars fixity fdeps csigs cdefs cats catdefs = do
4041 let HsQTvs {..} = tvars
42+ variableSpans = foldr (combineSrcSpans . getLoc) noSrcSpan hsq_explicit
43+ signatureSpans = getLoc name `combineSrcSpans` variableSpans
44+ dependencySpans = foldr (combineSrcSpans . getLoc) noSrcSpan fdeps
4145 combinedSpans =
4246 getLoc ctx `combineSrcSpans`
43− getLoc name `combineSrcSpans`
44− foldr (combineSrcSpans . getLoc) noSrcSpan hsq_explicit `combineSrcSpans`
45− foldr (combineSrcSpans . getLoc) noSrcSpan fdeps
47+ signatureSpans `combineSrcSpans`
48+ dependencySpans
4649 txt "class "
4750 sitcc $ do
48− switchLayout combinedSpans $ do
49− unless (null (unLoc ctx)) $ do
50− located ctx p_hsContext
51− breakpoint
52− txt "=> "
53− p_rdrName name
54− unless (null hsq_explicit) space
55− spaceSep (located' p_hsTyVarBndr) hsq_explicit
56− unless (null fdeps) $ do
57− breakpoint
58− txt "| "
59− velt (withSep comma (located' p_funDep) fdeps)
51+ switchLayout combinedSpans $ p_classContext ctx
52+ switchLayout signatureSpans $ do
53+ p_infixDefHelper
54+ (isInfix fixity)
55+ inci
56+ (p_rdrName name)
57+ (located' p_hsTyVarBndr <$> hsq_explicit)
58+ switchLayout combinedSpans $ p_classFundeps fdeps
6059 -- GHC's AST does not necessarily store each kind of element in source
6160 -- location order. This happens because different declarations are stored in
6261 -- different lists. Consequently, to get all the declarations in proper order,
@@ -77,6 +76,18 @@ p_classDecl ctx name tvars fdeps csigs cdefs cats catdefs = do
7776 inci (sequence_ decls)
7877 else newline
7978
79+p_classContext :: LHsContext GhcPs -> R ()
80+p_classContext ctx = unless (null (unLoc ctx)) $ do
81+ located ctx p_hsContext
82+ breakpoint
83+ txt "=> "
84+
85+p_classFundeps :: [Located (FunDep (Located RdrName))] -> R ()
86+p_classFundeps fdeps = unless (null fdeps) $ do
87+ breakpoint
88+ txt "| "
89+ velt $ withSep comma (located' p_funDep) fdeps
90+
8091p_famDefDecl :: TyFamDefltEqn GhcPs -> R ()
8192p_famDefDecl FamEqn {..} = do
8293 txt "type"
@@ -92,3 +103,11 @@ p_funDep (before, after) = do
92103 spaceSep p_rdrName before
93104 txt " -> "
94105 spaceSep p_rdrName after
106+
107+----------------------------------------------------------------------------
108+-- Helpers
109+
110+isInfix :: LexicalFixity -> Bool
111+isInfix = \case
112+ Infix -> True
113+ Prefix -> False