@@ -194,14 +194,14 @@ p_match' placer render style isInfix strictness m_pats GRHSs {..} = do
194
194
patSpans = combineSrcSpans' (getLocA <$> ne_pats)
195
195
indentBody = not (isOneLineSpan combinedSpans)
196
196
switchLayout [combinedSpans] $ do
197
- let stdCase = sep breakpoint (located' p_pat) m_pats
197
+ let stdCase = sep breakpoint (located' p_pat' ) m_pats
198
198
case style of
199
199
Function name ->
200
200
p_infixDefHelper
201
201
isInfix
202
202
indentBody
203
203
(p_rdrName name)
204
- (located' p_pat <$> m_pats)
204
+ (located' p_pat' <$> m_pats)
205
205
PatternBind -> stdCase
206
206
Case -> stdCase
207
207
Lambda -> do
@@ -214,12 +214,12 @@ p_match' placer render style isInfix strictness m_pats GRHSs {..} = do
214
214
when needsSpace space
215
215
sitcc stdCase
216
216
LambdaCase -> do
217
- located' p_pat head_pat
217
+ located' p_pat' head_pat
218
218
unless (null tail_pats) $ do
219
219
breakpoint
220
220
-- When we have multiple patterns (with `\cases`) across multiple
221
221
-- 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
223
223
return indentBody
224
224
let -- Calculate position of end of patterns. This is useful when we decide
225
225
-- about putting certain constructions in hanging positions.
@@ -279,6 +279,15 @@ p_match' placer render style isInfix strictness m_pats GRHSs {..} = do
279
279
switchLayout [patGrhssSpan] $
280
280
placeHanging placement p_body
281
281
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
282
291
283
292
p_grhs :: GroupStyle -> GRHS GhcPs (LHsExpr GhcPs ) -> R ()
284
293
p_grhs = p_grhs' Normal exprPlacement p_hsExpr
@@ -421,7 +430,7 @@ p_stmt' ::
421
430
p_stmt' placer render = \ case
422
431
LastStmt _ body _ _ -> located body render
423
432
BindStmt _ p f@ (getLocA -> l) -> do
424
- located p p_pat
433
+ located p ( p_pat PatternCtxDoBlock )
425
434
space
426
435
txt " <-"
427
436
let loc = getLocA p
@@ -846,7 +855,7 @@ p_hsExpr' isApp s = \case
846
855
txt " proc"
847
856
located p $ \ x -> do
848
857
breakpoint
849
- inci (p_pat x)
858
+ inci (p_pat PatternCtxFunction x)
850
859
breakpoint
851
860
txt " ->"
852
861
placeHanging (cmdTopPlacement (unLoc e)) $
@@ -874,17 +883,17 @@ p_patSynBind PSB {..} = do
874
883
switchLayout pattern_def_spans $ do
875
884
txt " <-"
876
885
breakpoint
877
- located psb_def p_pat
886
+ located psb_def ( p_pat PatternCtxPatSynonym )
878
887
ImplicitBidirectional ->
879
888
switchLayout pattern_def_spans $ do
880
889
equals
881
890
breakpoint
882
- located psb_def p_pat
891
+ located psb_def ( p_pat PatternCtxPatSynonym )
883
892
ExplicitBidirectional mgroup -> do
884
893
switchLayout pattern_def_spans $ do
885
894
txt " <-"
886
895
breakpoint
887
- located psb_def p_pat
896
+ located psb_def ( p_pat PatternCtxPatSynonym )
888
897
breakpoint
889
898
txt " where"
890
899
breakpoint
@@ -1038,64 +1047,81 @@ p_let render localBinds e = sitcc $ do
1038
1047
space
1039
1048
sitcc (located e render)
1040
1049
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
1043
1060
WildPat _ -> txt " _"
1044
1061
VarPat _ name -> p_rdrName name
1045
1062
LazyPat _ pat -> do
1046
1063
txt " ~"
1047
- located pat p_pat
1064
+ located pat p_pat'
1048
1065
AsPat _ name _ pat -> do
1049
1066
p_rdrName name
1050
1067
txt " @"
1051
- located pat p_pat
1068
+ located pat p_pat'
1052
1069
ParPat _ _ pat _ ->
1053
- located pat (parens S . p_pat)
1070
+ located pat (parens S . p_pat' )
1054
1071
BangPat _ pat -> do
1055
1072
txt " !"
1056
- located pat p_pat
1073
+ located pat p_pat'
1057
1074
ListPat _ pats ->
1058
- brackets S $ sep commaDel (located' p_pat) pats
1075
+ brackets S $ sep commaDel (located' p_pat' ) pats
1059
1076
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
1060
1086
let parens' =
1061
1087
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
1065
1091
SumPat _ pat tag arity ->
1066
- p_unboxedSum S tag arity (located pat p_pat)
1092
+ p_unboxedSum S tag arity (located pat p_pat' )
1067
1093
ConPat _ pat details ->
1068
1094
case details of
1069
1095
PrefixCon tys xs -> sitcc $ do
1070
1096
p_rdrName pat
1071
1097
unless (null tys && null xs) breakpoint
1072
1098
inci . sitcc $
1073
- sep breakpoint (sitcc . either p_hsConPatTyArg (located' p_pat)) $
1099
+ sep breakpoint (sitcc . either p_hsConPatTyArg (located' p_pat' )) $
1074
1100
(Left <$> tys) <> (Right <$> xs)
1075
1101
RecCon (HsRecFields fields dotdot) -> do
1076
1102
p_rdrName pat
1077
1103
breakpoint
1078
1104
let f = \ case
1079
1105
Nothing -> txt " .."
1080
- Just x -> located x p_pat_hsFieldBind
1106
+ Just x -> located x ( p_pat_hsFieldBind ctx)
1081
1107
inci . braces N . sep commaDel f $
1082
1108
case dotdot of
1083
1109
Nothing -> Just <$> fields
1084
1110
Just (L _ (RecFieldsDotDot n)) -> (Just <$> take n fields) ++ [Nothing ]
1085
1111
InfixCon l r -> do
1086
1112
switchLayout [getLocA l, getLocA r] $ do
1087
- located l p_pat
1113
+ located l p_pat'
1088
1114
breakpoint
1089
1115
inci $ do
1090
1116
p_rdrName pat
1091
1117
space
1092
- located r p_pat
1118
+ located r p_pat'
1093
1119
ViewPat _ expr pat -> sitcc $ do
1094
1120
located expr p_hsExpr
1095
1121
space
1096
1122
txt " ->"
1097
1123
breakpoint
1098
- inci (located pat p_pat)
1124
+ inci (located pat p_pat' )
1099
1125
SplicePat _ splice -> p_hsUntypedSplice DollarSplice splice
1100
1126
LitPat _ p -> atom p
1101
1127
NPat _ v (isJust -> isNegated) _ -> do
@@ -1112,23 +1138,25 @@ p_pat = \case
1112
1138
space
1113
1139
located k (atom . ol_val)
1114
1140
SigPat _ pat HsPS {.. } -> do
1115
- located pat p_pat
1141
+ located pat p_pat'
1116
1142
p_typeAscription (lhsTypeToSigType hsps_body)
1143
+ where
1144
+ p_pat' = p_pat ctx
1117
1145
1118
1146
p_hsPatSigType :: HsPatSigType GhcPs -> R ()
1119
1147
p_hsPatSigType (HsPS _ ty) = txt " @" *> located ty p_hsType
1120
1148
1121
1149
p_hsConPatTyArg :: HsConPatTyArg GhcPs -> R ()
1122
1150
p_hsConPatTyArg (HsConPatTyArg _ patSigTy) = p_hsPatSigType patSigTy
1123
1151
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
1126
1154
located hfbLHS p_fieldOcc
1127
1155
unless hfbPun $ do
1128
1156
space
1129
1157
equals
1130
1158
breakpoint
1131
- inci (located hfbRHS p_pat)
1159
+ inci (located hfbRHS ( p_pat ctx) )
1132
1160
1133
1161
p_unboxedSum :: BracketStyle -> ConTag -> Arity -> R () -> R ()
1134
1162
p_unboxedSum s tag arity m = do
@@ -1181,7 +1209,7 @@ p_hsQuote epAnn = \case
1181
1209
| any isJust (matchAddEpAnn AnnOpenEQ <$> epAnnAnns epAnn) = " "
1182
1210
| otherwise = " e"
1183
1211
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 )
1185
1213
DecBrL _ decls -> quote " d" (handleStarIsType decls (p_hsDecls Free decls))
1186
1214
DecBrG _ _ -> notImplemented " DecBrG" -- result of renamer
1187
1215
TypBr _ ty -> quote " t" (located ty (handleStarIsType ty . p_hsType))
0 commit comments