Skip to content

Commit fcae2a6

Browse files
Don't indent closing paren where possible
1 parent d26e185 commit fcae2a6

File tree

6 files changed

+74
-32
lines changed

6 files changed

+74
-32
lines changed

CHANGELOG.md

+4
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## Unreleased
2+
3+
* Don't indent closing parentheses for tuples where possible
4+
15
## Ormolu 0.7.4.0
26

37
* Don't error when the `JavaScriptFFI` language pragma is present. [Issue

data/examples/declaration/value/function/arrow/proc-applications-out.hs

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ bar f x =
99
( y,
1010
z,
1111
w
12-
)
12+
)
1313
->
1414
f -- The value
1515
-<

data/examples/declaration/value/function/arrow/proc-do-complex-out.hs

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ foo
99
( (a, b),
1010
(c, d),
1111
(e, f)
12-
)
12+
)
1313
-> do
1414
-- Begin do
1515
(x, y) <- -- GHC parser fails if layed out over multiple lines
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
f
2+
( a,
3+
b,
4+
c
5+
) = True
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
f
2+
( a,
3+
b,
4+
c
5+
) = True

src/Ormolu/Printer/Meat/Declaration/Value.hs

+58-30
Original file line numberDiff line numberDiff line change
@@ -194,14 +194,14 @@ p_match' placer render style isInfix strictness m_pats GRHSs {..} = do
194194
patSpans = combineSrcSpans' (getLocA <$> ne_pats)
195195
indentBody = not (isOneLineSpan combinedSpans)
196196
switchLayout [combinedSpans] $ do
197-
let stdCase = sep breakpoint (located' p_pat) m_pats
197+
let stdCase = sep breakpoint (located' p_pat') m_pats
198198
case style of
199199
Function name ->
200200
p_infixDefHelper
201201
isInfix
202202
indentBody
203203
(p_rdrName name)
204-
(located' p_pat <$> m_pats)
204+
(located' p_pat' <$> m_pats)
205205
PatternBind -> stdCase
206206
Case -> stdCase
207207
Lambda -> do
@@ -214,12 +214,12 @@ p_match' placer render style isInfix strictness m_pats GRHSs {..} = do
214214
when needsSpace space
215215
sitcc stdCase
216216
LambdaCase -> do
217-
located' p_pat head_pat
217+
located' p_pat' head_pat
218218
unless (null tail_pats) $ do
219219
breakpoint
220220
-- When we have multiple patterns (with `\cases`) across multiple
221221
-- lines, we have to indent all but the first pattern.
222-
inci $ sep breakpoint (located' p_pat) tail_pats
222+
inci $ sep breakpoint (located' p_pat') tail_pats
223223
return indentBody
224224
let -- Calculate position of end of patterns. This is useful when we decide
225225
-- about putting certain constructions in hanging positions.
@@ -279,6 +279,15 @@ p_match' placer render style isInfix strictness m_pats GRHSs {..} = do
279279
switchLayout [patGrhssSpan] $
280280
placeHanging placement p_body
281281
inci p_where
282+
where
283+
p_pat' =
284+
p_pat $
285+
case style of
286+
Function {} -> PatternCtxFunction
287+
PatternBind {} -> PatternCtxTopLevel
288+
Case {} -> PatternCtxCase
289+
Lambda {} -> PatternCtxFunction
290+
LambdaCase {} -> PatternCtxCase
282291

283292
p_grhs :: GroupStyle -> GRHS GhcPs (LHsExpr GhcPs) -> R ()
284293
p_grhs = p_grhs' Normal exprPlacement p_hsExpr
@@ -421,7 +430,7 @@ p_stmt' ::
421430
p_stmt' placer render = \case
422431
LastStmt _ body _ _ -> located body render
423432
BindStmt _ p f@(getLocA -> l) -> do
424-
located p p_pat
433+
located p (p_pat PatternCtxDoBlock)
425434
space
426435
txt "<-"
427436
let loc = getLocA p
@@ -846,7 +855,7 @@ p_hsExpr' isApp s = \case
846855
txt "proc"
847856
located p $ \x -> do
848857
breakpoint
849-
inci (p_pat x)
858+
inci (p_pat PatternCtxFunction x)
850859
breakpoint
851860
txt "->"
852861
placeHanging (cmdTopPlacement (unLoc e)) $
@@ -874,17 +883,17 @@ p_patSynBind PSB {..} = do
874883
switchLayout pattern_def_spans $ do
875884
txt "<-"
876885
breakpoint
877-
located psb_def p_pat
886+
located psb_def (p_pat PatternCtxPatSynonym)
878887
ImplicitBidirectional ->
879888
switchLayout pattern_def_spans $ do
880889
equals
881890
breakpoint
882-
located psb_def p_pat
891+
located psb_def (p_pat PatternCtxPatSynonym)
883892
ExplicitBidirectional mgroup -> do
884893
switchLayout pattern_def_spans $ do
885894
txt "<-"
886895
breakpoint
887-
located psb_def p_pat
896+
located psb_def (p_pat PatternCtxPatSynonym)
888897
breakpoint
889898
txt "where"
890899
breakpoint
@@ -1038,64 +1047,81 @@ p_let render localBinds e = sitcc $ do
10381047
space
10391048
sitcc (located e render)
10401049

1041-
p_pat :: Pat GhcPs -> R ()
1042-
p_pat = \case
1050+
data PatternContext
1051+
= PatternCtxFunction
1052+
| PatternCtxCase
1053+
| PatternCtxDoBlock
1054+
| PatternCtxQuasi
1055+
| PatternCtxTopLevel
1056+
| PatternCtxPatSynonym
1057+
1058+
p_pat :: PatternContext -> Pat GhcPs -> R ()
1059+
p_pat ctx = \case
10431060
WildPat _ -> txt "_"
10441061
VarPat _ name -> p_rdrName name
10451062
LazyPat _ pat -> do
10461063
txt "~"
1047-
located pat p_pat
1064+
located pat p_pat'
10481065
AsPat _ name _ pat -> do
10491066
p_rdrName name
10501067
txt "@"
1051-
located pat p_pat
1068+
located pat p_pat'
10521069
ParPat _ _ pat _ ->
1053-
located pat (parens S . p_pat)
1070+
located pat (parens S . p_pat')
10541071
BangPat _ pat -> do
10551072
txt "!"
1056-
located pat p_pat
1073+
located pat p_pat'
10571074
ListPat _ pats ->
1058-
brackets S $ sep commaDel (located' p_pat) pats
1075+
brackets S $ sep commaDel (located' p_pat') pats
10591076
TuplePat _ pats boxing -> do
1077+
let parenStyle =
1078+
-- don't indent closing paren if possible, because it's
1079+
-- prettier. but closing paren must be indented in certain
1080+
-- scenarios or it's a syntax error.
1081+
case ctx of
1082+
PatternCtxCase -> S
1083+
PatternCtxTopLevel -> S
1084+
PatternCtxDoBlock -> S
1085+
_ -> N
10601086
let parens' =
10611087
case boxing of
1062-
Boxed -> parens S
1063-
Unboxed -> parensHash S
1064-
parens' $ sep commaDel (sitcc . located' p_pat) pats
1088+
Boxed -> parens
1089+
Unboxed -> parensHash
1090+
parens' parenStyle $ sep commaDel (sitcc . located' p_pat') pats
10651091
SumPat _ pat tag arity ->
1066-
p_unboxedSum S tag arity (located pat p_pat)
1092+
p_unboxedSum S tag arity (located pat p_pat')
10671093
ConPat _ pat details ->
10681094
case details of
10691095
PrefixCon tys xs -> sitcc $ do
10701096
p_rdrName pat
10711097
unless (null tys && null xs) breakpoint
10721098
inci . sitcc $
1073-
sep breakpoint (sitcc . either p_hsConPatTyArg (located' p_pat)) $
1099+
sep breakpoint (sitcc . either p_hsConPatTyArg (located' p_pat')) $
10741100
(Left <$> tys) <> (Right <$> xs)
10751101
RecCon (HsRecFields fields dotdot) -> do
10761102
p_rdrName pat
10771103
breakpoint
10781104
let f = \case
10791105
Nothing -> txt ".."
1080-
Just x -> located x p_pat_hsFieldBind
1106+
Just x -> located x (p_pat_hsFieldBind ctx)
10811107
inci . braces N . sep commaDel f $
10821108
case dotdot of
10831109
Nothing -> Just <$> fields
10841110
Just (L _ (RecFieldsDotDot n)) -> (Just <$> take n fields) ++ [Nothing]
10851111
InfixCon l r -> do
10861112
switchLayout [getLocA l, getLocA r] $ do
1087-
located l p_pat
1113+
located l p_pat'
10881114
breakpoint
10891115
inci $ do
10901116
p_rdrName pat
10911117
space
1092-
located r p_pat
1118+
located r p_pat'
10931119
ViewPat _ expr pat -> sitcc $ do
10941120
located expr p_hsExpr
10951121
space
10961122
txt "->"
10971123
breakpoint
1098-
inci (located pat p_pat)
1124+
inci (located pat p_pat')
10991125
SplicePat _ splice -> p_hsUntypedSplice DollarSplice splice
11001126
LitPat _ p -> atom p
11011127
NPat _ v (isJust -> isNegated) _ -> do
@@ -1112,23 +1138,25 @@ p_pat = \case
11121138
space
11131139
located k (atom . ol_val)
11141140
SigPat _ pat HsPS {..} -> do
1115-
located pat p_pat
1141+
located pat p_pat'
11161142
p_typeAscription (lhsTypeToSigType hsps_body)
1143+
where
1144+
p_pat' = p_pat ctx
11171145

11181146
p_hsPatSigType :: HsPatSigType GhcPs -> R ()
11191147
p_hsPatSigType (HsPS _ ty) = txt "@" *> located ty p_hsType
11201148

11211149
p_hsConPatTyArg :: HsConPatTyArg GhcPs -> R ()
11221150
p_hsConPatTyArg (HsConPatTyArg _ patSigTy) = p_hsPatSigType patSigTy
11231151

1124-
p_pat_hsFieldBind :: HsRecField GhcPs (LPat GhcPs) -> R ()
1125-
p_pat_hsFieldBind HsFieldBind {..} = do
1152+
p_pat_hsFieldBind :: PatternContext -> HsRecField GhcPs (LPat GhcPs) -> R ()
1153+
p_pat_hsFieldBind ctx HsFieldBind {..} = do
11261154
located hfbLHS p_fieldOcc
11271155
unless hfbPun $ do
11281156
space
11291157
equals
11301158
breakpoint
1131-
inci (located hfbRHS p_pat)
1159+
inci (located hfbRHS (p_pat ctx))
11321160

11331161
p_unboxedSum :: BracketStyle -> ConTag -> Arity -> R () -> R ()
11341162
p_unboxedSum s tag arity m = do
@@ -1181,7 +1209,7 @@ p_hsQuote epAnn = \case
11811209
| any isJust (matchAddEpAnn AnnOpenEQ <$> epAnnAnns epAnn) = ""
11821210
| otherwise = "e"
11831211
quote name (located expr p_hsExpr)
1184-
PatBr _ pat -> located pat (quote "p" . p_pat)
1212+
PatBr _ pat -> located pat (quote "p" . p_pat PatternCtxQuasi)
11851213
DecBrL _ decls -> quote "d" (handleStarIsType decls (p_hsDecls Free decls))
11861214
DecBrG _ _ -> notImplemented "DecBrG" -- result of renamer
11871215
TypBr _ ty -> quote "t" (located ty (handleStarIsType ty . p_hsType))

0 commit comments

Comments
 (0)