Skip to content

Commit 43cfa9b

Browse files
authored
Fix precedence of tuples with labels (#2733)
* Fix precedence of tuples with labels It was formatting: let labeled_tuple () = ~x:1, ~y:(1 + 2) into: let labeled_tuple () = ~x:1, ~y:1 + 2 * Update CHANGES
1 parent ca45251 commit 43cfa9b

File tree

11 files changed

+166
-0
lines changed

11 files changed

+166
-0
lines changed

CHANGES.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,12 @@ Items marked with an asterisk (\*) are changes that are likely to format
44
existing code differently from the previous release when using the default
55
profile. This started with version 0.26.0.
66

7+
## unreleased
8+
9+
### Fixed
10+
11+
- Fix crash with tuples of the form `~lbl:(1 + 2)` (#2732, #2733, @cod1r, @Julow)
12+
713
## 0.28.0
814

915
### Highlight

lib/Ast.ml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1664,6 +1664,16 @@ end = struct
16641664
| {ast= Typ _; _} -> None
16651665
| {ctx= Exp {pexp_desc; _}; ast= Exp exp} -> (
16661666
match pexp_desc with
1667+
| Pexp_tuple elts
1668+
when List.exists
1669+
~f:(function
1670+
| Lte_pun _
1671+
|Lte_simple {lte_label= None; _}
1672+
|Lte_constrained_pun _ ->
1673+
false
1674+
| Lte_simple {lte_label= Some _; lte_elt} -> lte_elt == exp )
1675+
elts ->
1676+
Some (Apply, Right) (* Tuple element with a labels. *)
16671677
| Pexp_tuple (Lte_simple {lte_elt= e0; _} :: _) ->
16681678
Some (Comma, if exp == e0 then Left else Right)
16691679
| Pexp_tuple (_ :: _) -> Some (Comma, Right)

test/passing/refs.ahrefs/labelled_args-414.ml.ref

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,3 +37,19 @@ let () =
3737
very_long_argument_name_three
3838
-> ())
3939
foo
40+
41+
let labeled_tuple () = ~x:1, ~y:(1 + 2)
42+
43+
let ~x, .. = labeled_tuple ()
44+
45+
let _ = ~x:1, ~y:(f 1)
46+
let _ = 1 + 2, 1 + 2
47+
let _ = 1 + 2, ~y:(1 + 2)
48+
let _ = 1 + 2, ~y
49+
let _ = 1 + 2, ~(y : t)
50+
51+
(* No parens *)
52+
53+
let _ = x, ~y:a.b
54+
let _ = x, ~y:a#.b
55+
let _ = x, ~y:a#b

test/passing/refs.ahrefs/labelled_args.ml.ref

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,3 +37,19 @@ let () =
3737
very_long_argument_name_three
3838
-> ())
3939
foo
40+
41+
let labeled_tuple () = ~x:1, ~y:(1 + 2)
42+
43+
let ~x, .. = labeled_tuple ()
44+
45+
let _ = ~x:1, ~y:(f 1)
46+
let _ = 1 + 2, 1 + 2
47+
let _ = 1 + 2, ~y:(1 + 2)
48+
let _ = 1 + 2, ~y
49+
let _ = 1 + 2, ~(y : t)
50+
51+
(* No parens *)
52+
53+
let _ = x, ~y:a.b
54+
let _ = x, ~y:a#.b
55+
let _ = x, ~y:a#b

test/passing/refs.default/labelled_args-414.ml.ref

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,3 +37,17 @@ let () =
3737
very_long_argument_name_three
3838
-> ())
3939
foo
40+
41+
let labeled_tuple () = (~x:1, ~y:(1 + 2))
42+
let ~x, .. = labeled_tuple ()
43+
let _ = (~x:1, ~y:(f 1))
44+
let _ = (1 + 2, 1 + 2)
45+
let _ = (1 + 2, ~y:(1 + 2))
46+
let _ = (1 + 2, ~y)
47+
let _ = (1 + 2, ~(y : t))
48+
49+
(* No parens *)
50+
51+
let _ = (x, ~y:a.b)
52+
let _ = (x, ~y:a#.b)
53+
let _ = (x, ~y:a#b)

test/passing/refs.default/labelled_args.ml.ref

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,3 +37,17 @@ let () =
3737
very_long_argument_name_three
3838
-> ())
3939
foo
40+
41+
let labeled_tuple () = (~x:1, ~y:(1 + 2))
42+
let ~x, .. = labeled_tuple ()
43+
let _ = (~x:1, ~y:(f 1))
44+
let _ = (1 + 2, 1 + 2)
45+
let _ = (1 + 2, ~y:(1 + 2))
46+
let _ = (1 + 2, ~y)
47+
let _ = (1 + 2, ~(y : t))
48+
49+
(* No parens *)
50+
51+
let _ = (x, ~y:a.b)
52+
let _ = (x, ~y:a#.b)
53+
let _ = (x, ~y:a#b)

test/passing/refs.janestreet/labelled_args-414.ml.ref

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,3 +44,17 @@ let () =
4444
very_long_argument_name_three -> ())
4545
foo
4646
;;
47+
48+
let labeled_tuple () = ~x:1, ~y:(1 + 2)
49+
let ~x, .. = labeled_tuple ()
50+
let _ = ~x:1, ~y:(f 1)
51+
let _ = 1 + 2, 1 + 2
52+
let _ = 1 + 2, ~y:(1 + 2)
53+
let _ = 1 + 2, ~y
54+
let _ = 1 + 2, ~(y : t)
55+
56+
(* No parens *)
57+
58+
let _ = x, ~y:a.b
59+
let _ = x, ~y:a#.b
60+
let _ = x, ~y:a#b

test/passing/refs.janestreet/labelled_args.ml.ref

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,3 +44,17 @@ let () =
4444
very_long_argument_name_three -> ())
4545
foo
4646
;;
47+
48+
let labeled_tuple () = ~x:1, ~y:(1 + 2)
49+
let ~x, .. = labeled_tuple ()
50+
let _ = ~x:1, ~y:(f 1)
51+
let _ = 1 + 2, 1 + 2
52+
let _ = 1 + 2, ~y:(1 + 2)
53+
let _ = 1 + 2, ~y
54+
let _ = 1 + 2, ~(y : t)
55+
56+
(* No parens *)
57+
58+
let _ = x, ~y:a.b
59+
let _ = x, ~y:a#.b
60+
let _ = x, ~y:a#b

test/passing/refs.ocamlformat/labelled_args-414.ml.ref

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,3 +37,25 @@ let () =
3737
very_long_argument_name_three
3838
-> () )
3939
foo
40+
41+
let labeled_tuple () = (~x:1, ~y:(1 + 2))
42+
43+
let ~x, .. = labeled_tuple ()
44+
45+
let _ = (~x:1, ~y:(f 1))
46+
47+
let _ = (1 + 2, 1 + 2)
48+
49+
let _ = (1 + 2, ~y:(1 + 2))
50+
51+
let _ = (1 + 2, ~y)
52+
53+
let _ = (1 + 2, ~(y : t))
54+
55+
(* No parens *)
56+
57+
let _ = (x, ~y:a.b)
58+
59+
let _ = (x, ~y:a#.b)
60+
61+
let _ = (x, ~y:a#b)

test/passing/refs.ocamlformat/labelled_args.ml.ref

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,3 +37,25 @@ let () =
3737
very_long_argument_name_three
3838
-> () )
3939
foo
40+
41+
let labeled_tuple () = (~x:1, ~y:(1 + 2))
42+
43+
let ~x, .. = labeled_tuple ()
44+
45+
let _ = (~x:1, ~y:(f 1))
46+
47+
let _ = (1 + 2, 1 + 2)
48+
49+
let _ = (1 + 2, ~y:(1 + 2))
50+
51+
let _ = (1 + 2, ~y)
52+
53+
let _ = (1 + 2, ~(y : t))
54+
55+
(* No parens *)
56+
57+
let _ = (x, ~y:a.b)
58+
59+
let _ = (x, ~y:a#.b)
60+
61+
let _ = (x, ~y:a#b)

0 commit comments

Comments
 (0)