@@ -26,17 +26,22 @@ p_valDecl = line . p_valDecl'
2626p_valDecl' :: HsBindLR GhcPs GhcPs -> R ()
2727p_valDecl' = \case
2828 FunBind NoExt funId funMatches _ _ -> p_funBind funId funMatches
29− _ -> notImplemented "certain kinds of binding declarations"
29+ PatBind NoExt pat grhss _ -> p_match PatternBind [pat] grhss
30+ VarBind {} -> error "VarBinds are introduced by the type checker"
31+ AbsBinds {} -> error "AbsBinds are introduced by the type checker"
32+ PatSynBind NoExt psb -> p_patSynBind psb
33+ XHsBindsLR NoExt -> notImplemented "XHsBindsLR"
3034
3135p_funBind
32− :: Located RdrName -- ^
33− -> MatchGroup GhcPs (LHsExpr GhcPs) -- ^
36+ :: Located RdrName
37+ -> MatchGroup GhcPs (LHsExpr GhcPs)
3438 -> R ()
3539p_funBind name mgroup =
36− p_matchGroup (Function (unL name)) mgroup
40+ p_matchGroup (Function name) mgroup
3741
3842data MatchGroupStyle
39− = Function RdrName
43+ = Function (Located RdrName)
44+ | PatternBind
4045 | Case
4146 | Lambda
4247 | LambdaCase
@@ -47,14 +52,15 @@ p_matchGroup
4752 -> R ()
4853p_matchGroup style MG {..} =
4954 locatedVia Nothing mg_alts $
50− newlineSep (located' (p_match style))
55+ newlineSep (located' (\Match {..} -> p_match style m_pats m_grhss))
5156p_matchGroup _ (XMatchGroup NoExt) = notImplemented "XMatchGroup"
5257
5358p_match
5459 :: MatchGroupStyle
55− -> Match GhcPs (LHsExpr GhcPs)
60+ -> [LPat GhcPs]
61+ -> GRHSs GhcPs (LHsExpr GhcPs)
5662 -> R ()
57−p_match style Match {..} = do
63+p_match style m_pats m_grhss = do
5864 case style of
5965 Function name -> p_rdrName name
6066 _ -> return ()
@@ -76,10 +82,14 @@ p_match style Match {..} = do
7682 switchLayout combinedSpans $ do
7783 case style of
7884 Function _ -> breakpoint
85+ PatternBind -> return ()
7986 Case -> return ()
8087 Lambda -> txt "\\"
8188 LambdaCase -> return ()
82− inci' (velt' (located' p_pat <$> m_pats))
89+ let wrapper = case style of
90+ Function _ -> inci'
91+ _ -> id
92+ wrapper (velt' (located' p_pat <$> m_pats))
8393 return inci'
8494 inci' $ do
8595 let GRHSs {..} = m_grhss
@@ -87,6 +97,7 @@ p_match style Match {..} = do
8797 space
8898 txt $ case style of
8999 Function _ -> "="
100+ PatternBind -> "="
90101 _ -> "->"
91102 let combinedSpans = combineSrcSpans' $
92103 getGRHSSpan . unL <$> NE.fromList grhssGRHSs
@@ -102,7 +113,6 @@ p_match style Match {..} = do
102113 newline
103114 line (txt "where")
104115 inci (located grhssLocalBinds p_hsLocalBinds)
105−p_match _ (XMatch NoExt) = notImplemented "XMatchGroup"
106116
107117p_grhs :: GRHS GhcPs (LHsExpr GhcPs) -> R ()
108118p_grhs (GRHS NoExt guards body) =
@@ -148,13 +158,13 @@ p_hsLocalBinds = \case
148158
149159p_hsExpr :: HsExpr GhcPs -> R ()
150160p_hsExpr = \case
151− HsVar NoExt name -> located name p_rdrName'
161+ HsVar NoExt name -> p_rdrName name
152162 HsUnboundVar NoExt _ -> notImplemented "HsUnboundVar"
153163 HsConLikeOut NoExt _ -> notImplemented "HsConLikeOut"
154164 HsRecFld NoExt x ->
155165 case x of
156− Unambiguous NoExt name -> located name p_rdrName'
157− Ambiguous NoExt name -> located name p_rdrName'
166+ Unambiguous NoExt name -> p_rdrName name
167+ Ambiguous NoExt name -> p_rdrName name
158168 XAmbiguousFieldOcc NoExt -> notImplemented "XAmbiguousFieldOcc"
159169 HsOverLabel NoExt _ _ -> notImplemented "HsOverLabel"
160170 HsIPVar NoExt (HsIPName name) -> atom name
@@ -247,6 +257,45 @@ p_hsExpr = \case
247257 HsWrap {} -> notImplemented "HsWrap"
248258 XExpr {} -> notImplemented "XExpr"
249259
260+p_patSynBind :: PatSynBind GhcPs GhcPs -> R ()
261+p_patSynBind PSB {..} = do
262+ txt "pattern "
263+ case psb_dir of
264+ Unidirectional -> do
265+ p_rdrName psb_id
266+ space
267+ p_patSynDetails psb_args
268+ txt " <-"
269+ breakpoint
270+ inci (located psb_def p_pat)
271+ ImplicitBidirectional -> do
272+ p_rdrName psb_id
273+ space
274+ p_patSynDetails psb_args
275+ txt " ="
276+ breakpoint
277+ located psb_def p_pat
278+ ExplicitBidirectional mgroup -> do
279+ p_rdrName psb_id
280+ space
281+ p_patSynDetails psb_args
282+ txt " <-"
283+ breakpoint
284+ inci (located psb_def p_pat)
285+ newline
286+ inci $ do
287+ line (txt "where")
288+ inci (p_matchGroup (Function psb_id) mgroup)
289+p_patSynBind (XPatSynBind NoExt) = notImplemented "XPatSynBind"
290+
291+p_patSynDetails :: HsPatSynDetails (Located RdrName) -> R ()
292+p_patSynDetails = \case
293+ PrefixCon xs ->
294+ velt' (p_rdrName <$> xs)
295+ RecCon xs ->
296+ velt' (p_rdrName . recordPatSynPatVar <$> xs)
297+ InfixCon _ _ -> notImplemented "InfixCon"
298+
250299----------------------------------------------------------------------------
251300-- Helpers
252301