@@ -30,33 +30,32 @@ p_classDecl
30 :: LHsContext GhcPs
30 :: LHsContext GhcPs
31 -> Located RdrName
31 -> Located RdrName
32 -> LHsQTyVars GhcPs
32 -> LHsQTyVars GhcPs
33 -> [Located (FunDep (Located RdrName))]
34 -> [Located (FunDep (Located RdrName))]
34 -> [LSig GhcPs]
35 -> [LSig GhcPs]
35 -> LHsBinds GhcPs
36 -> LHsBinds GhcPs
36 -> [LFamilyDecl GhcPs]
37 -> [LFamilyDecl GhcPs]
37 -> [LTyFamDefltEqn GhcPs]
38 -> [LTyFamDefltEqn GhcPs]
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
40 let HsQTvs {..} = tvars
41 let HsQTvs {..} = tvars
42+ variableSpans = foldr (combineSrcSpans . getLoc) noSrcSpan hsq_explicit
43+ signatureSpans = getLoc name `combineSrcSpans` variableSpans
44+ dependencySpans = foldr (combineSrcSpans . getLoc) noSrcSpan fdeps
41 combinedSpans =
45 combinedSpans =
42 getLoc ctx `combineSrcSpans`
46 getLoc ctx `combineSrcSpans`
43− getLoc name `combineSrcSpans`
47+ signatureSpans `combineSrcSpans`
44− foldr (combineSrcSpans . getLoc) noSrcSpan hsq_explicit `combineSrcSpans`
48+ dependencySpans
45− foldr (combineSrcSpans . getLoc) noSrcSpan fdeps
46 txt "class "
49 txt "class "
47 sitcc $ do
50 sitcc $ do
48− switchLayout combinedSpans $ do
51+ switchLayout combinedSpans $ p_classContext ctx
49− unless (null (unLoc ctx)) $ do
52+ switchLayout signatureSpans $ do
50− located ctx p_hsContext
53+ p_infixDefHelper
51− breakpoint
54+ (isInfix fixity)
53− p_rdrName name
56+ (p_rdrName name)
54− unless (null hsq_explicit) space
55− spaceSep (located' p_hsTyVarBndr) hsq_explicit
57+ (located' p_hsTyVarBndr <$> hsq_explicit)
56− unless (null fdeps) $ do
58+ switchLayout combinedSpans $ p_classFundeps fdeps
59− velt (withSep comma (located' p_funDep) fdeps)
60 -- GHC's AST does not necessarily store each kind of element in source
59 -- GHC's AST does not necessarily store each kind of element in source
61 -- location order. This happens because different declarations are stored in
60 -- location order. This happens because different declarations are stored in
62 -- different lists. Consequently, to get all the declarations in proper order,
61 -- 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
77 inci (sequence_ decls)
76 inci (sequence_ decls)
78 else newline
77 else newline
79+p_classContext :: LHsContext GhcPs -> R ()
80+p_classContext ctx = unless (null (unLoc ctx)) $ do
81+ located ctx p_hsContext
85+p_classFundeps :: [Located (FunDep (Located RdrName))] -> R ()
86+p_classFundeps fdeps = unless (null fdeps) $ do
89+ velt $ withSep comma (located' p_funDep) fdeps
80p_famDefDecl :: TyFamDefltEqn GhcPs -> R ()
91p_famDefDecl :: TyFamDefltEqn GhcPs -> R ()
81p_famDefDecl FamEqn {..} = do
92p_famDefDecl FamEqn {..} = do
82 txt "type"
93 txt "type"
@@ -92,3 +103,11 @@ p_funDep (before, after) = do
92 spaceSep p_rdrName before
103 spaceSep p_rdrName before
93 txt " -> "
104 txt " -> "
94 spaceSep p_rdrName after
105 spaceSep p_rdrName after
107+----------------------------------------------------------------------------
110+isInfix :: LexicalFixity -> Bool