Skip to content

Commit e78506b

Browse files
authored
Add missing parentheses around expression having attributes or comments inside a shorthand let-open clause (#1708)
1 parent 9136fc1 commit e78506b

File tree

5 files changed

+134
-1
lines changed

5 files changed

+134
-1
lines changed

CHANGES.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@
3939

4040
+ Add missing break between pattern and attribute (#1711, @gpetiot)
4141

42+
+ Add missing parentheses around expression having attributes or comments inside a shorthand let-open clause (#1708, @gpetiot)
43+
4244
#### Changes
4345

4446
+ Improve the diff of unstable docstrings displayed in error messages (#1654, @gpetiot)

lib/Fmt_ast.ml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2232,8 +2232,13 @@ and fmt_expression c ?(box = true) ?pro ?epi ?eol ?parens ?(indent_wrap = 0)
22322232
| _ -> maybe_break
22332233
in
22342234
let can_skip_parens =
2235+
(not (Cmts.has_before c.cmts e0.pexp_loc))
2236+
&& (not (Cmts.has_after c.cmts e0.pexp_loc))
2237+
&&
22352238
match e0.pexp_desc with
2236-
| Pexp_array _ | Pexp_record _ -> true
2239+
| (Pexp_array _ | Pexp_record _)
2240+
when List.is_empty e0.pexp_attributes ->
2241+
true
22372242
| Pexp_tuple _ -> Poly.(c.conf.parens_tuple = `Always)
22382243
| _ -> Option.is_some (Sugar.list_exp c.cmts e0)
22392244
in

test/passing/tests/open-closing-on-separate-line.ml.ref

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -296,3 +296,45 @@ let g =
296296
x
297297
) [@attr]
298298
)
299+
300+
let _ = M.({f} [@warning "foo"])
301+
302+
let _ = M.((* A *) {f})
303+
304+
let _ = M.({f} (* B *))
305+
306+
let _ = M.((* A *) {f} (* B *))
307+
308+
let _ = M.((* A *) {f} (* B *) [@warning "foo"] (* C *))
309+
310+
let _ = M.([|f|] [@warning "foo"])
311+
312+
let _ = M.((* A *) [|f|])
313+
314+
let _ = M.([|f|] (* B *))
315+
316+
let _ = M.((* A *) [|f|] (* B *))
317+
318+
let _ = M.((* A *) [|f|] (* B *) [@warning "foo"] (* C *))
319+
320+
let _ = M.([f] [@warning "foo"])
321+
322+
let _ = M.((* A *) [f])
323+
324+
let _ = M.([f] (* B *))
325+
326+
let _ = M.([f] (* B *)) (* after *)
327+
328+
let _ = M.((* A *) [f] (* B *))
329+
330+
let _ = M.((* A *) ([f] (* B *) [@warning "foo"] (* C *)))
331+
332+
let _ = M.((f, f) [@warning "foo"])
333+
334+
let _ = M.((* A *) (f, f))
335+
336+
let _ = M.((f, f) (* B *))
337+
338+
let _ = M.((* A *) (f, f) (* B *))
339+
340+
let _ = M.((* A *) ((f, f) (* B *) [@warning "foo"] (* C *)))

test/passing/tests/open.ml

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,3 +221,45 @@ open[@attr] (val x)
221221
open[@attr] [%ext]
222222

223223
let g = M.f ((let open M in x) [@attr])
224+
225+
let _ = M.({f} [@warning "foo"])
226+
227+
let _ = M.((* A *) { f })
228+
229+
let _ = M.({ f } (* B *))
230+
231+
let _ = M.((* A *) { f } (* B *))
232+
233+
let _ = M.((* A *) { f } (* B *) [@warning "foo"] (* C *))
234+
235+
let _ = M.([|f|] [@warning "foo"])
236+
237+
let _ = M.((* A *) [| f |])
238+
239+
let _ = M.([| f |] (* B *))
240+
241+
let _ = M.((* A *) [| f |] (* B *))
242+
243+
let _ = M.((* A *) [| f |] (* B *) [@warning "foo"] (* C *))
244+
245+
let _ = M.([f] [@warning "foo"])
246+
247+
let _ = M.((* A *) [ f ])
248+
249+
let _ = M.([ f ] (* B *))
250+
251+
let _ = M.([ f ] (* B *)) (* after *)
252+
253+
let _ = M.((* A *) [ f ] (* B *))
254+
255+
let _ = M.((* A *) [ f ] (* B *) [@warning "foo"] (* C *))
256+
257+
let _ = M.((f, f) [@warning "foo"])
258+
259+
let _ = M.((* A *) ( f, f))
260+
261+
let _ = M.((f, f ) (* B *))
262+
263+
let _ = M.((* A *) (f, f) (* B *))
264+
265+
let _ = M.((* A *) (f, f) (* B *) [@warning "foo"] (* C *))

test/passing/tests/open.ml.ref

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -286,3 +286,45 @@ let g =
286286
M.f
287287
((let open M in
288288
x) [@attr] )
289+
290+
let _ = M.({f} [@warning "foo"])
291+
292+
let _ = M.((* A *) {f})
293+
294+
let _ = M.({f} (* B *))
295+
296+
let _ = M.((* A *) {f} (* B *))
297+
298+
let _ = M.((* A *) {f} (* B *) [@warning "foo"] (* C *))
299+
300+
let _ = M.([|f|] [@warning "foo"])
301+
302+
let _ = M.((* A *) [|f|])
303+
304+
let _ = M.([|f|] (* B *))
305+
306+
let _ = M.((* A *) [|f|] (* B *))
307+
308+
let _ = M.((* A *) [|f|] (* B *) [@warning "foo"] (* C *))
309+
310+
let _ = M.([f] [@warning "foo"])
311+
312+
let _ = M.((* A *) [f])
313+
314+
let _ = M.([f] (* B *))
315+
316+
let _ = M.([f] (* B *)) (* after *)
317+
318+
let _ = M.((* A *) [f] (* B *))
319+
320+
let _ = M.((* A *) ([f] (* B *) [@warning "foo"] (* C *)))
321+
322+
let _ = M.((f, f) [@warning "foo"])
323+
324+
let _ = M.((* A *) (f, f))
325+
326+
let _ = M.((f, f) (* B *))
327+
328+
let _ = M.((* A *) (f, f) (* B *))
329+
330+
let _ = M.((* A *) ((f, f) (* B *) [@warning "foo"] (* C *)))

0 commit comments

Comments
 (0)