@@ -14,7 +14,7 @@ import Bag (bagToList)
1414import BasicTypes
1515import Control.Monad
1616import Data.Data
17−import Data.List (sortOn)
17+import Data.List (intersperse, sortOn)
1818import Data.Text (Text)
1919import GHC
2020import Ormolu.Printer.Combinators
@@ -186,8 +186,7 @@ p_grhs _ (XGRHS NoExt) = notImplemented "XGRHS"
186186
187187p_stmt :: Stmt GhcPs (LHsExpr GhcPs) -> R ()
188188p_stmt = \case
189− LastStmt NoExt _ _ _ ->
190− notImplemented "LastStmt" -- only available after renamer
189+ LastStmt NoExt body _ _ -> located body p_hsExpr
191190 BindStmt NoExt l f _ _ -> do
192191 located l p_pat
193192 space
@@ -199,11 +198,19 @@ p_stmt = \case
199198 LetStmt NoExt binds -> do
200199 txt "let "
201200 sitcc $ located binds p_hsLocalBinds
202− ParStmt {} -> notImplemented "ParStmt"
201+ ParStmt NoExt stmts _ _ ->
202+ sequence_ $ intersperse breakpoint $
203+ withSep (txt "| ") p_parStmtBlock stmts
203204 TransStmt {} -> notImplemented "TransStmt"
204205 RecStmt {} -> notImplemented "RecStmt"
205206 XStmtLR {} -> notImplemented "XStmtLR"
206207
208+p_parStmtBlock :: ParStmtBlock GhcPs GhcPs -> R ()
209+p_parStmtBlock = \case
210+ ParStmtBlock NoExt stmts _ _ ->
211+ velt $ withSep comma (located' (sitcc . p_stmt)) stmts
212+ XParStmtBlock {} -> notImplemented "XParStmtBlock"
213+
207214p_hsLocalBinds :: HsLocalBindsLR GhcPs GhcPs -> R ()
208215p_hsLocalBinds = \case
209216 HsValBinds NoExt (ValBinds NoExt bag lsigs) -> do
@@ -344,18 +351,29 @@ p_hsExpr = \case
344351 txt "in "
345352 sitcc (located e p_hsExpr)
346353 HsDo NoExt ctx es -> do
354+ let doBody header = do
355+ txt header
356+ newline
357+ inci $ located es (newlineSep (located' (sitcc . p_stmt)))
358+ compBody = brackets $ located es $ \xs -> do
359+ let stmts = init xs
360+ yield = last xs
361+ located yield p_stmt
362+ breakpoint
363+ txt "| "
364+ case stmts of
365+ [stmt] | ParStmt {} <- unLoc stmt -> located stmt p_stmt
366+ _ -> velt $ withSep comma (located' (sitcc . p_stmt)) stmts
347367 case ctx of
348− DoExpr -> txt "do"
349− MDoExpr -> txt "mdo"
350− ListComp -> notImplemented "ListComp"
368+ DoExpr -> doBody "do"
369+ MDoExpr -> doBody "mdo"
370+ ListComp -> compBody
351371 MonadComp -> notImplemented "MonadComp"
352372 ArrowExpr -> notImplemented "ArrowExpr"
353373 GhciStmtCtxt -> notImplemented "GhciStmtCtxt"
354374 PatGuard _ -> notImplemented "PatGuard"
355375 ParStmtCtxt _ -> notImplemented "ParStmtCtxt"
356376 TransStmtCtxt _ -> notImplemented "TransStmtCtxt"
357− newline
358− inci $ located es (newlineSep (located' (sitcc . p_stmt)))
359377 ExplicitList _ _ xs ->
360378 brackets $ velt (withSep comma (located' p_hsExpr) xs)
361379 RecordCon {..} -> do
@@ -644,7 +662,8 @@ exprPlacement = \case
644662 HsLam NoExt _ -> Hanging
645663 HsLamCase NoExt _ -> Hanging
646664 HsCase NoExt _ _ -> Hanging
647− HsDo NoExt _ _ -> Hanging
665+ HsDo NoExt DoExpr _ -> Hanging
666+ HsDo NoExt MDoExpr _ -> Hanging
648667 RecordCon NoExt _ _ -> Hanging
649668 _ -> Normal
650669