@@ -310,7 +310,7 @@ p_hsCmd = \case
310310 -- does. Open an issue and ping @yumiova if this ever occurs in output.
311311 notImplemented "HsCmdApp"
312312 HsCmdLam NoExt mgroup -> p_matchGroup' cmdPlacement p_hsCmd Lambda mgroup
313− HsCmdPar NoExt c -> parens (located c p_hsCmd)
313+ HsCmdPar NoExt c -> parens N (located c p_hsCmd)
314314 HsCmdCase NoExt e mgroup -> do
315315 txt "case"
316316 space
@@ -338,6 +338,7 @@ p_hsCmd = \case
338338 space
339339 sitcc (located localBinds p_hsLocalBinds)
340340 breakpoint
341+ vlayout space (newline >> txt " ")
341342 txt "in"
342343 space
343344 sitcc (located c p_hsCmd)
@@ -486,7 +487,10 @@ p_hsTupArg = \case
486487 XTupArg {} -> notImplemented "XTupArg"
487488
488489p_hsExpr :: HsExpr GhcPs -> R ()
489−p_hsExpr = \case
490+p_hsExpr = p_hsExpr' N
491+
492+p_hsExpr' :: BracketStyle -> HsExpr GhcPs -> R ()
493+p_hsExpr' s = \case
490494 HsVar NoExt name -> p_rdrName name
491495 HsUnboundVar NoExt _ -> notImplemented "HsUnboundVar"
492496 HsConLikeOut NoExt _ -> notImplemented "HsConLikeOut"
@@ -504,8 +508,8 @@ p_hsExpr = \case
504508 HsOverLit NoExt v -> atom (ol_val v)
505509 HsLit NoExt lit ->
506510 case lit of
507− HsString (SourceText s) _ -> p_stringLit s
508− HsStringPrim (SourceText s) _ -> p_stringLit s
511+ HsString (SourceText stxt) _ -> p_stringLit stxt
512+ HsStringPrim (SourceText stxt) _ -> p_stringLit stxt
509513 r -> atom r
510514 HsLam NoExt mgroup ->
511515 p_matchGroup Lambda mgroup
@@ -519,8 +523,8 @@ p_hsExpr = \case
519523 -- and then use 'p_withoutHanging' for the descendants.
520524 let p_withoutHanging (HsApp NoExt f' x') = do
521525 case f' of
522− (L _ (HsApp _ _ _)) -> located f' p_withoutHanging
523− _ -> located f' p_hsExpr
526+ L _ (HsApp _ _ _) -> located f' p_withoutHanging
527+ _ -> located f' (p_hsExpr' s)
524528 breakpoint
525529 inci $ located x' p_hsExpr
526530 p_withoutHanging e = p_hsExpr e
@@ -552,12 +556,12 @@ p_hsExpr = \case
552556 getOpName = \case
553557 HsVar NoExt (L _ a) -> Just a
554558 _ -> Nothing
555− p_exprOpTree (reassociateOpTree getOpName opTree)
559+ p_exprOpTree s (reassociateOpTree getOpName opTree)
556560 NegApp NoExt e _ -> do
557561 txt "-"
558562 space
559563 located e p_hsExpr
560− HsPar NoExt e -> parens (located e p_hsExpr)
564+ HsPar NoExt e -> parens s (located e p_hsExpr)
561565 SectionL NoExt x op -> do
562566 located x p_hsExpr
563567 breakpoint
@@ -576,12 +580,12 @@ p_hsExpr = \case
576580 Boxed -> parens
577581 Unboxed -> parensHash
578582 if isSection
579− then switchLayout [] . parens' $
583+ then switchLayout [] . parens' s $
580584 sep comma (located' p_hsTupArg) args
581− else switchLayout (getLoc <$> args) . parens' . sitcc $
585+ else switchLayout (getLoc <$> args) . parens' s . sitcc $
582586 sep (comma >> breakpoint) (sitcc . located' p_hsTupArg) args
583587 ExplicitSum NoExt tag arity e ->
584− p_unboxedSum tag arity (located e p_hsExpr)
588+ p_unboxedSum N tag arity (located e p_hsExpr)
585589 HsCase NoExt e mgroup -> do
586590 txt "case"
587591 space
@@ -620,8 +624,8 @@ p_hsExpr = \case
620624 txt header
621625 breakpoint
622626 ub <- vlayout (return useBraces) (return id)
623− inci $ sepSemi (located' (ub . p_stmt)) (unLoc es)
624− compBody = brackets $ located es $ \xs -> do
627+ inci $ sepSemi (located' (ub . p_stmt' (p_hsExpr' S))) (unLoc es)
628+ compBody = brackets N $ located es $ \xs -> do
625629 let p_parBody = sep
626630 (breakpoint >> txt "| ")
627631 p_seqBody
@@ -647,7 +651,8 @@ p_hsExpr = \case
647651 ParStmtCtxt _ -> notImplemented "ParStmtCtxt"
648652 TransStmtCtxt _ -> notImplemented "TransStmtCtxt"
649653 ExplicitList _ _ xs ->
650− brackets . sitcc $ sep (comma >> breakpoint) (sitcc . located' p_hsExpr) xs
654+ brackets s . sitcc $
655+ sep (comma >> breakpoint) (sitcc . located' p_hsExpr) xs
651656 RecordCon {..} -> do
652657 located rcon_con_name atom
653658 breakpoint
@@ -662,7 +667,8 @@ p_hsExpr = \case
662667 case rec_dotdot of
663668 Just {} -> [txt ".."]
664669 Nothing -> []
665− inci . braces . sitcc $ sep (comma >> breakpoint) sitcc (fields <> dotdot)
670+ inci . braces N . sitcc $
671+ sep (comma >> breakpoint) sitcc (fields <> dotdot)
666672 RecordUpd {..} -> do
667673 located rupd_expr p_hsExpr
668674 breakpoint
@@ -672,7 +678,7 @@ p_hsExpr = \case
672678 Unambiguous _ n -> n
673679 XAmbiguousFieldOcc _ -> notImplemented "XAmbiguousFieldOcc"
674680 }
675− inci . braces . sitcc $
681+ inci . braces N . sitcc $
676682 sep
677683 (comma >> breakpoint)
678684 (sitcc . located' (p_hsRecField . updName))
@@ -688,21 +694,21 @@ p_hsExpr = \case
688694 located hsib_body p_hsType
689695 ArithSeq NoExt _ x -> do
690696 case x of
691− From from -> brackets . sitcc $ do
697+ From from -> brackets s . sitcc $ do
692698 located from p_hsExpr
693699 breakpoint
694700 txt ".."
695− FromThen from next -> brackets . sitcc $ do
701+ FromThen from next -> brackets s . sitcc $ do
696702 sitcc $ sep (comma >> breakpoint) (located' p_hsExpr) [from, next]
697703 breakpoint
698704 txt ".."
699− FromTo from to -> brackets . sitcc $ do
705+ FromTo from to -> brackets s . sitcc $ do
700706 located from p_hsExpr
701707 breakpoint
702708 txt ".."
703709 space
704710 located to p_hsExpr
705− FromThenTo from next to -> brackets . sitcc $ do
711+ FromThenTo from next to -> brackets s . sitcc $ do
706712 sitcc $ sep (comma >> breakpoint) (located' p_hsExpr) [from, next]
707713 breakpoint
708714 txt ".."
@@ -799,7 +805,7 @@ p_patSynBind PSB {..} = do
799805 inci $ do
800806 switchLayout (getLoc . recordPatSynPatVar <$> xs) $ do
801807 unless (null xs) breakpoint
802− braces . sitcc $
808+ braces N . sitcc $
803809 sep (comma >> breakpoint) (p_rdrName . recordPatSynPatVar) xs
804810 breakpoint
805811 rhs
@@ -829,20 +835,20 @@ p_pat = \case
829835 txt "@"
830836 located pat p_pat
831837 ParPat NoExt pat ->
832− located pat (parens . p_pat)
838+ located pat (parens S . p_pat)
833839 BangPat NoExt pat -> do
834840 txt "!"
835841 located pat p_pat
836842 ListPat NoExt pats -> do
837− brackets . sitcc $ sep (comma >> breakpoint) (located' p_pat) pats
843+ brackets S . sitcc $ sep (comma >> breakpoint) (located' p_pat) pats
838844 TuplePat NoExt pats boxing -> do
839845 let f =
840846 case boxing of
841− Boxed -> parens
842− Unboxed -> parensHash
847+ Boxed -> parens S
848+ Unboxed -> parensHash S
843849 f . sitcc $ sep (comma >> breakpoint) (sitcc . located' p_pat) pats
844850 SumPat NoExt pat tag arity ->
845− p_unboxedSum tag arity (located pat p_pat)
851+ p_unboxedSum S tag arity (located pat p_pat)
846852 ConPatIn pat details ->
847853 case details of
848854 PrefixCon xs -> sitcc $ do
@@ -856,9 +862,10 @@ p_pat = \case
856862 let f = \case
857863 Nothing -> txt ".."
858864 Just x -> located x p_pat_hsRecField
859− inci . braces . sitcc . sep (comma >> breakpoint) f $ case dotdot of
860− Nothing -> Just <$> fields
861− Just n -> (Just <$> take n fields) ++ [Nothing]
865+ inci . braces N . sitcc . sep (comma >> breakpoint) f $
866+ case dotdot of
867+ Nothing -> Just <$> fields
868+ Just n -> (Just <$> take n fields) ++ [Nothing]
862869 InfixCon x y -> do
863870 located x p_pat
864871 space
@@ -898,8 +905,8 @@ p_pat_hsRecField HsRecField {..} = do
898905 breakpoint
899906 inci (located hsRecFieldArg p_pat)
900907
901−p_unboxedSum :: ConTag -> Arity -> R () -> R ()
902−p_unboxedSum tag arity m = do
908+p_unboxedSum :: BracketStyle -> ConTag -> Arity -> R () -> R ()
909+p_unboxedSum s tag arity m = do
903910 let before = tag - 1
904911 after = arity - before - 1
905912 args = replicate before Nothing <> [Just m] <> replicate after Nothing
@@ -913,7 +920,7 @@ p_unboxedSum tag arity m = do
913920 unless isFirst space
914921 m'
915922 unless isLast space
916− parensHash $ sep (txt "|") f (zip args [0..])
923+ parensHash s $ sep (txt "|") f (zip args [0..])
917924
918925p_hsSplice :: HsSplice GhcPs -> R ()
919926p_hsSplice = \case
@@ -938,7 +945,7 @@ p_hsSpliceTH
938945p_hsSpliceTH isTyped expr = \case
939946 HasParens -> do
940947 txt decoSymbol
941− parens (located expr (sitcc . p_hsExpr))
948+ parens N (located expr (sitcc . p_hsExpr))
942949 HasDollar -> do
943950 txt decoSymbol
944951 located expr (sitcc . p_hsExpr)
@@ -971,7 +978,7 @@ p_hsBracket = \case
971978 (\i -> isPunctuation i || isSymbol i)
972979 (showOutputable (rdrNameOcc name))
973980 && not (doesNotNeedExtraParens name)
974− wrapper = if isOperator then parens else id
981+ wrapper = if isOperator then parens N else id
975982 wrapper $ p_rdrName (noLoc name)
976983 TExpBr NoExt expr -> do
977984 txt "[||"
@@ -1136,9 +1143,9 @@ exprOpTree :: LHsExpr GhcPs -> OpTree (LHsExpr GhcPs) (LHsExpr GhcPs)
11361143exprOpTree (L _ (OpApp NoExt x op y)) = OpBranch (exprOpTree x) op (exprOpTree y)
11371144exprOpTree n = OpNode n
11381145
1139−p_exprOpTree :: OpTree (LHsExpr GhcPs) (LHsExpr GhcPs) -> R ()
1140−p_exprOpTree (OpNode x) = located x p_hsExpr
1141−p_exprOpTree (OpBranch x op y) = do
1146+p_exprOpTree :: BracketStyle -> OpTree (LHsExpr GhcPs) (LHsExpr GhcPs) -> R ()
1147+p_exprOpTree s (OpNode x) = located x (p_hsExpr' s)
1148+p_exprOpTree s (OpBranch x op y) = do
11421149 -- NOTE If the beginning of the first argument and the second argument
11431150 -- are on the same line, and the second argument has a hanging form, use
11441151 -- hanging placement.
@@ -1158,12 +1165,12 @@ p_exprOpTree (OpBranch x op y) = do
11581165 Hanging -> useBraces
11591166 Normal -> dontUseBraces)
11601167 switchLayout [opTreeLoc x] $
1161− ub $ p_exprOpTree x
1168+ ub $ p_exprOpTree s x
11621169 placeHanging placement $ do
11631170 located op (opWrapper . p_hsExpr)
11641171 space
11651172 switchLayout [opTreeLoc y] $
1166− p_exprOpTree y
1173+ p_exprOpTree N y
11671174
11681175-- | Get annotations for the enclosing element.
11691176