@@ -207,14 +207,14 @@ p_match' placer render style isInfix multAnn strictness m_pats GRHSs {..} = do
207
207
patSpans = combineSrcSpans' (getLocA <$> ne_pats)
208
208
indentBody = not (isOneLineSpan combinedSpans)
209
209
switchLayout [combinedSpans] $ do
210
- let stdCase = sep breakpoint (located' p_pat) m_pats
210
+ let stdCase = sep breakpoint (located' p_pat' ) m_pats
211
211
case style of
212
212
Function name ->
213
213
p_infixDefHelper
214
214
isInfix
215
215
indentBody
216
216
(p_rdrName name)
217
- (located' p_pat <$> m_pats)
217
+ (located' p_pat' <$> m_pats)
218
218
PatternBind -> stdCase
219
219
Case -> stdCase
220
220
Lambda -> do
@@ -228,12 +228,12 @@ p_match' placer render style isInfix multAnn strictness m_pats GRHSs {..} = do
228
228
when needsSpace space
229
229
sitcc stdCase
230
230
LambdaCase -> do
231
- located' p_pat head_pat
231
+ located' p_pat' head_pat
232
232
unless (null tail_pats) $ do
233
233
breakpoint
234
234
-- When we have multiple patterns (with `\cases`) across multiple
235
235
-- lines, we have to indent all but the first pattern.
236
- inci $ sep breakpoint (located' p_pat) tail_pats
236
+ inci $ sep breakpoint (located' p_pat' ) tail_pats
237
237
return indentBody
238
238
let -- Calculate position of end of patterns. This is useful when we decide
239
239
-- about putting certain constructions in hanging positions.
@@ -293,6 +293,15 @@ p_match' placer render style isInfix multAnn strictness m_pats GRHSs {..} = do
293
293
switchLayout [patGrhssSpan] $
294
294
placeHanging placement p_body
295
295
inci p_where
296
+ where
297
+ p_pat' =
298
+ p_pat $
299
+ case style of
300
+ Function {} -> PatternCtxFunction
301
+ PatternBind {} -> PatternCtxTopLevel
302
+ Case {} -> PatternCtxCase
303
+ Lambda {} -> PatternCtxFunction
304
+ LambdaCase {} -> PatternCtxCase
296
305
297
306
p_grhs :: GroupStyle -> GRHS GhcPs (LHsExpr GhcPs ) -> R ()
298
307
p_grhs = p_grhs' Normal exprPlacement p_hsExpr
@@ -433,7 +442,7 @@ p_stmt' ::
433
442
p_stmt' placer render = \ case
434
443
LastStmt _ body _ _ -> located body render
435
444
BindStmt _ p f@ (getLocA -> l) -> do
436
- located p p_pat
445
+ located p ( p_pat PatternCtxDoBlock )
437
446
space
438
447
txt " <-"
439
448
let loc = getLocA p
@@ -855,7 +864,7 @@ p_hsExpr' isApp s = \case
855
864
txt " proc"
856
865
located p $ \ x -> do
857
866
breakpoint
858
- inci (p_pat x)
867
+ inci (p_pat PatternCtxFunction x)
859
868
breakpoint
860
869
txt " ->"
861
870
placeHanging (cmdTopPlacement (unLoc e)) $
@@ -887,17 +896,17 @@ p_patSynBind PSB {..} = do
887
896
switchLayout pattern_def_spans $ do
888
897
txt " <-"
889
898
breakpoint
890
- located psb_def p_pat
899
+ located psb_def ( p_pat PatternCtxPatSynonym )
891
900
ImplicitBidirectional ->
892
901
switchLayout pattern_def_spans $ do
893
902
equals
894
903
breakpoint
895
- located psb_def p_pat
904
+ located psb_def ( p_pat PatternCtxPatSynonym )
896
905
ExplicitBidirectional mgroup -> do
897
906
switchLayout pattern_def_spans $ do
898
907
txt " <-"
899
908
breakpoint
900
- located psb_def p_pat
909
+ located psb_def ( p_pat PatternCtxPatSynonym )
901
910
breakpoint
902
911
txt " where"
903
912
breakpoint
@@ -1049,64 +1058,81 @@ p_let render localBinds e = sitcc $ do
1049
1058
space
1050
1059
sitcc (located e render)
1051
1060
1052
- p_pat :: Pat GhcPs -> R ()
1053
- p_pat = \ case
1061
+ data PatternContext
1062
+ = PatternCtxFunction
1063
+ | PatternCtxCase
1064
+ | PatternCtxDoBlock
1065
+ | PatternCtxQuasi
1066
+ | PatternCtxTopLevel
1067
+ | PatternCtxPatSynonym
1068
+
1069
+ p_pat :: PatternContext -> Pat GhcPs -> R ()
1070
+ p_pat ctx = \ case
1054
1071
WildPat _ -> txt " _"
1055
1072
VarPat _ name -> p_rdrName name
1056
1073
LazyPat _ pat -> do
1057
1074
txt " ~"
1058
- located pat p_pat
1075
+ located pat p_pat'
1059
1076
AsPat _ name pat -> do
1060
1077
p_rdrName name
1061
1078
txt " @"
1062
- located pat p_pat
1079
+ located pat p_pat'
1063
1080
ParPat _ pat ->
1064
- located pat (parens S . p_pat)
1081
+ located pat (parens S . p_pat' )
1065
1082
BangPat _ pat -> do
1066
1083
txt " !"
1067
- located pat p_pat
1084
+ located pat p_pat'
1068
1085
ListPat _ pats ->
1069
- brackets S $ sep commaDel (located' p_pat) pats
1086
+ brackets S $ sep commaDel (located' p_pat' ) pats
1070
1087
TuplePat _ pats boxing -> do
1088
+ let parenStyle =
1089
+ -- don't indent closing paren if possible, because it's
1090
+ -- prettier. but closing paren must be indented in certain
1091
+ -- scenarios or it's a syntax error.
1092
+ case ctx of
1093
+ PatternCtxCase -> S
1094
+ PatternCtxTopLevel -> S
1095
+ PatternCtxDoBlock -> S
1096
+ _ -> N
1071
1097
let parens' =
1072
1098
case boxing of
1073
- Boxed -> parens S
1074
- Unboxed -> parensHash S
1075
- parens' $ sep commaDel (sitcc . located' p_pat) pats
1099
+ Boxed -> parens
1100
+ Unboxed -> parensHash
1101
+ parens' parenStyle $ sep commaDel (sitcc . located' p_pat' ) pats
1076
1102
SumPat _ pat tag arity ->
1077
- p_unboxedSum S tag arity (located pat p_pat)
1103
+ p_unboxedSum S tag arity (located pat p_pat' )
1078
1104
ConPat _ pat details ->
1079
1105
case details of
1080
1106
PrefixCon tys xs -> sitcc $ do
1081
1107
p_rdrName pat
1082
1108
unless (null tys && null xs) breakpoint
1083
1109
inci . sitcc $
1084
- sep breakpoint (sitcc . either p_hsConPatTyArg (located' p_pat)) $
1110
+ sep breakpoint (sitcc . either p_hsConPatTyArg (located' p_pat' )) $
1085
1111
(Left <$> tys) <> (Right <$> xs)
1086
1112
RecCon (HsRecFields fields dotdot) -> do
1087
1113
p_rdrName pat
1088
1114
breakpoint
1089
1115
let f = \ case
1090
1116
Nothing -> txt " .."
1091
- Just x -> located x p_pat_hsFieldBind
1117
+ Just x -> located x ( p_pat_hsFieldBind ctx)
1092
1118
inci . braces N . sep commaDel f $
1093
1119
case dotdot of
1094
1120
Nothing -> Just <$> fields
1095
1121
Just (L _ (RecFieldsDotDot n)) -> (Just <$> take n fields) ++ [Nothing ]
1096
1122
InfixCon l r -> do
1097
1123
switchLayout [getLocA l, getLocA r] $ do
1098
- located l p_pat
1124
+ located l p_pat'
1099
1125
breakpoint
1100
1126
inci $ do
1101
1127
p_rdrName pat
1102
1128
space
1103
- located r p_pat
1129
+ located r p_pat'
1104
1130
ViewPat _ expr pat -> sitcc $ do
1105
1131
located expr p_hsExpr
1106
1132
space
1107
1133
txt " ->"
1108
1134
breakpoint
1109
- inci (located pat p_pat)
1135
+ inci (located pat p_pat' )
1110
1136
SplicePat _ splice -> p_hsUntypedSplice DollarSplice splice
1111
1137
LitPat _ p -> atom p
1112
1138
NPat _ v (isJust -> isNegated) _ -> do
@@ -1123,28 +1149,30 @@ p_pat = \case
1123
1149
space
1124
1150
located k (atom . ol_val)
1125
1151
SigPat _ pat HsPS {.. } -> do
1126
- located pat p_pat
1152
+ located pat p_pat'
1127
1153
p_typeAscription (lhsTypeToSigType hsps_body)
1128
1154
EmbTyPat _ (HsTP _ ty) -> do
1129
1155
txt " type"
1130
1156
space
1131
1157
located ty p_hsType
1132
1158
InvisPat _ tyPat -> p_tyPat tyPat
1159
+ where
1160
+ p_pat' = p_pat ctx
1133
1161
1134
1162
p_tyPat :: HsTyPat GhcPs -> R ()
1135
1163
p_tyPat (HsTP _ ty) = txt " @" *> located ty p_hsType
1136
1164
1137
1165
p_hsConPatTyArg :: HsConPatTyArg GhcPs -> R ()
1138
1166
p_hsConPatTyArg (HsConPatTyArg _ patSigTy) = p_tyPat patSigTy
1139
1167
1140
- p_pat_hsFieldBind :: HsRecField GhcPs (LPat GhcPs ) -> R ()
1141
- p_pat_hsFieldBind HsFieldBind {.. } = do
1168
+ p_pat_hsFieldBind :: PatternContext -> HsRecField GhcPs (LPat GhcPs ) -> R ()
1169
+ p_pat_hsFieldBind ctx HsFieldBind {.. } = do
1142
1170
located hfbLHS p_fieldOcc
1143
1171
unless hfbPun $ do
1144
1172
space
1145
1173
equals
1146
1174
breakpoint
1147
- inci (located hfbRHS p_pat)
1175
+ inci (located hfbRHS ( p_pat ctx) )
1148
1176
1149
1177
p_unboxedSum :: BracketStyle -> ConTag -> Arity -> R () -> R ()
1150
1178
p_unboxedSum s tag arity m = do
@@ -1197,7 +1225,7 @@ p_hsQuote anns = \case
1197
1225
| any (isJust . matchAddEpAnn AnnOpenEQ ) anns = " "
1198
1226
| otherwise = " e"
1199
1227
quote name (located expr p_hsExpr)
1200
- PatBr _ pat -> located pat (quote " p" . p_pat)
1228
+ PatBr _ pat -> located pat (quote " p" . p_pat PatternCtxQuasi )
1201
1229
DecBrL _ decls -> quote " d" (handleStarIsType decls (p_hsDecls Free decls))
1202
1230
DecBrG _ _ -> notImplemented " DecBrG" -- result of renamer
1203
1231
TypBr _ ty -> quote " t" (located ty (handleStarIsType ty . p_hsType))
0 commit comments