diff --git a/CHANGES.md b/CHANGES.md index 0f682a316f..84812afe45 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -6,6 +6,11 @@ profile. This started with version 0.26.0. ## unreleased +### Changed + +- Empty bodies of while loops will be formatted on one line: `do () done`. + (#2812, @v-gb) + ### Fixed - Fix formatting oscillation with `if-then-else=fit-or-vertical` and diff --git a/lib/Fmt_ast.ml b/lib/Fmt_ast.ml index a136f24f34..bf83252361 100644 --- a/lib/Fmt_ast.ml +++ b/lib/Fmt_ast.ml @@ -2910,6 +2910,14 @@ and fmt_expression c ?(box = true) ?(pro = noop) ?eol ?parens $ fmt_core_type c (sub_typ ~ctx t2) ) $ fmt_atrs ) ) | Pexp_while (e1, e2, infix_ext_attrs) -> + let break_around_body = + match e2 with + | { pexp_desc= Pexp_construct ({txt= Lident "()"; _}, None) + ; pexp_attributes= [] + ; _ } -> + str " " + | _ -> force_break + in pro $ hvbox 0 (Params.Exp.wrap c.conf ~parens @@ -2921,9 +2929,9 @@ and fmt_expression c ?(box = true) ?(pro = noop) ?eol ?parens $ break 1 2 $ fmt_expression c (sub_exp ~ctx e1) $ space_break $ str "do" ) - $ force_break + $ break_around_body $ fmt_expression c (sub_exp ~ctx e2) ) - $ force_break $ str "done" ) + $ break_around_body $ str "done" ) $ fmt_atrs ) ) | Pexp_unreachable -> pro $ str "." | Pexp_send (exp, meth) -> diff --git a/test/passing/refs.ahrefs/extensions-indent.ml.err b/test/passing/refs.ahrefs/extensions-indent.ml.err index 5c7926c842..ba897033e5 100644 --- a/test/passing/refs.ahrefs/extensions-indent.ml.err +++ b/test/passing/refs.ahrefs/extensions-indent.ml.err @@ -1 +1 @@ -Warning: extensions-indent.ml:545 exceeds the margin +Warning: extensions-indent.ml:541 exceeds the margin diff --git a/test/passing/refs.ahrefs/extensions-indent.ml.ref b/test/passing/refs.ahrefs/extensions-indent.ml.ref index f2bf9d33a9..6334b5a356 100644 --- a/test/passing/refs.ahrefs/extensions-indent.ml.ref +++ b/test/passing/refs.ahrefs/extensions-indent.ml.ref @@ -99,17 +99,13 @@ let _ = (for i = 0 to 1 do () done) - (while true do - () - done) + (while true do () done) let _ = f (for%ext i = 0 to 1 do () done) - (while%ext true do - () - done) + (while%ext true do () done) let _ = function%ext | x -> x diff --git a/test/passing/refs.ahrefs/extensions.ml.err b/test/passing/refs.ahrefs/extensions.ml.err index 43f8103cba..136f0702a8 100644 --- a/test/passing/refs.ahrefs/extensions.ml.err +++ b/test/passing/refs.ahrefs/extensions.ml.err @@ -1 +1 @@ -Warning: extensions.ml:545 exceeds the margin +Warning: extensions.ml:541 exceeds the margin diff --git a/test/passing/refs.ahrefs/extensions.ml.ref b/test/passing/refs.ahrefs/extensions.ml.ref index d5dc0fc83f..8aa64a71f4 100644 --- a/test/passing/refs.ahrefs/extensions.ml.ref +++ b/test/passing/refs.ahrefs/extensions.ml.ref @@ -99,17 +99,13 @@ let _ = (for i = 0 to 1 do () done) - (while true do - () - done) + (while true do () done) let _ = f (for%ext i = 0 to 1 do () done) - (while%ext true do - () - done) + (while%ext true do () done) let _ = function%ext | x -> x diff --git a/test/passing/refs.ahrefs/for_while.ml.ref b/test/passing/refs.ahrefs/for_while.ml.ref index 302082073d..a128a6cfe4 100644 --- a/test/passing/refs.ahrefs/for_while.ml.ref +++ b/test/passing/refs.ahrefs/for_while.ml.ref @@ -1,13 +1,13 @@ let () = foo (for i = 1 to 10 do - () + print_endline () done) let () = foo (while true do - () + print_endline () done) let _ = @@ -48,3 +48,9 @@ let _ = do test this done + +let _ = + while + some biggggggggggggggggggggggggggggggggg + expressionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn + do () done diff --git a/test/passing/refs.ahrefs/kw_extentions.ml.ref b/test/passing/refs.ahrefs/kw_extentions.ml.ref index d5f6ce638c..da65526fc4 100644 --- a/test/passing/refs.ahrefs/kw_extentions.ml.ref +++ b/test/passing/refs.ahrefs/kw_extentions.ml.ref @@ -15,9 +15,7 @@ let () = for%ext i = 1 to 10 do () done; - while%ext false do - () - done; + while%ext false do () done; match%ext x with | _ -> () diff --git a/test/passing/refs.ahrefs/shortcut_ext_attr.ml.ref b/test/passing/refs.ahrefs/shortcut_ext_attr.ml.ref index 6d54806af3..8558cc9d26 100644 --- a/test/passing/refs.ahrefs/shortcut_ext_attr.ml.ref +++ b/test/passing/refs.ahrefs/shortcut_ext_attr.ml.ref @@ -12,11 +12,7 @@ let () = | x -> ()]; [%foo try[@foo] () with _ -> ()]; [%foo if[@foo] () then () else ()]; - [%foo - while () do - () - done - [@foo]]; + [%foo while () do () done [@foo]]; [%foo for x = () to () do () diff --git a/test/passing/refs.ahrefs/source.ml.err b/test/passing/refs.ahrefs/source.ml.err index 1269cc4736..da3c73773e 100644 --- a/test/passing/refs.ahrefs/source.ml.err +++ b/test/passing/refs.ahrefs/source.ml.err @@ -1,4 +1,4 @@ -Warning: source.ml:3417 exceeds the margin -Warning: source.ml:6551 exceeds the margin -Warning: source.ml:6985 exceeds the margin -Warning: source.ml:7817 exceeds the margin +Warning: source.ml:3415 exceeds the margin +Warning: source.ml:6549 exceeds the margin +Warning: source.ml:6983 exceeds the margin +Warning: source.ml:7815 exceeds the margin diff --git a/test/passing/refs.ahrefs/source.ml.ref b/test/passing/refs.ahrefs/source.ml.ref index 1c9ace9005..5836d695e3 100644 --- a/test/passing/refs.ahrefs/source.ml.ref +++ b/test/passing/refs.ahrefs/source.ml.ref @@ -87,9 +87,7 @@ let () = | x -> ()); (try%foo[@foo] () with _ -> ()); if%foo[@foo] () then () else (); - while%foo[@foo] () do - () - done; + while%foo[@foo] () do () done; for%foo[@foo] x = () to () do () done; diff --git a/test/passing/refs.default/extensions-indent.ml.err b/test/passing/refs.default/extensions-indent.ml.err index 94bec5fe53..d79ab7cf68 100644 --- a/test/passing/refs.default/extensions-indent.ml.err +++ b/test/passing/refs.default/extensions-indent.ml.err @@ -1 +1 @@ -Warning: extensions-indent.ml:459 exceeds the margin +Warning: extensions-indent.ml:455 exceeds the margin diff --git a/test/passing/refs.default/extensions-indent.ml.ref b/test/passing/refs.default/extensions-indent.ml.ref index 8003690bad..247fe4c9b4 100644 --- a/test/passing/refs.default/extensions-indent.ml.ref +++ b/test/passing/refs.default/extensions-indent.ml.ref @@ -87,18 +87,14 @@ let _ = (for i = 0 to 1 do () done) - (while true do - () - done) + (while true do () done) let _ = f (for%ext i = 0 to 1 do () done) - (while%ext true do - () - done) + (while%ext true do () done) let _ = function%ext x -> x let _ = f (function%ext x -> x) diff --git a/test/passing/refs.default/extensions.ml.err b/test/passing/refs.default/extensions.ml.err index ef57bbf8b7..94969c3697 100644 --- a/test/passing/refs.default/extensions.ml.err +++ b/test/passing/refs.default/extensions.ml.err @@ -1 +1 @@ -Warning: extensions.ml:459 exceeds the margin +Warning: extensions.ml:455 exceeds the margin diff --git a/test/passing/refs.default/extensions.ml.ref b/test/passing/refs.default/extensions.ml.ref index d30a275628..d6a9ac10cc 100644 --- a/test/passing/refs.default/extensions.ml.ref +++ b/test/passing/refs.default/extensions.ml.ref @@ -87,18 +87,14 @@ let _ = (for i = 0 to 1 do () done) - (while true do - () - done) + (while true do () done) let _ = f (for%ext i = 0 to 1 do () done) - (while%ext true do - () - done) + (while%ext true do () done) let _ = function%ext x -> x let _ = f (function%ext x -> x) diff --git a/test/passing/refs.default/for_while.ml.ref b/test/passing/refs.default/for_while.ml.ref index 302082073d..a128a6cfe4 100644 --- a/test/passing/refs.default/for_while.ml.ref +++ b/test/passing/refs.default/for_while.ml.ref @@ -1,13 +1,13 @@ let () = foo (for i = 1 to 10 do - () + print_endline () done) let () = foo (while true do - () + print_endline () done) let _ = @@ -48,3 +48,9 @@ let _ = do test this done + +let _ = + while + some biggggggggggggggggggggggggggggggggg + expressionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn + do () done diff --git a/test/passing/refs.default/kw_extentions.ml.ref b/test/passing/refs.default/kw_extentions.ml.ref index 8b20326d7e..c1a6a02793 100644 --- a/test/passing/refs.default/kw_extentions.ml.ref +++ b/test/passing/refs.default/kw_extentions.ml.ref @@ -15,9 +15,7 @@ let () = for%ext i = 1 to 10 do () done; - while%ext false do - () - done; + while%ext false do () done; match%ext x with _ -> () let () = diff --git a/test/passing/refs.default/shortcut_ext_attr.ml.ref b/test/passing/refs.default/shortcut_ext_attr.ml.ref index 8340c1b63e..3923f1c183 100644 --- a/test/passing/refs.default/shortcut_ext_attr.ml.ref +++ b/test/passing/refs.default/shortcut_ext_attr.ml.ref @@ -9,11 +9,7 @@ let () = [%foo function[@foo] x -> ()]; [%foo try[@foo] () with _ -> ()]; [%foo if[@foo] () then () else ()]; - [%foo - while () do - () - done - [@foo]]; + [%foo while () do () done [@foo]]; [%foo for x = () to () do () diff --git a/test/passing/refs.default/source.ml.err b/test/passing/refs.default/source.ml.err index 6e017154b8..1c673e9eb2 100644 --- a/test/passing/refs.default/source.ml.err +++ b/test/passing/refs.default/source.ml.err @@ -1,4 +1,4 @@ -Warning: source.ml:917 exceeds the margin -Warning: source.ml:992 exceeds the margin -Warning: source.ml:6638 exceeds the margin -Warning: source.ml:7097 exceeds the margin +Warning: source.ml:915 exceeds the margin +Warning: source.ml:990 exceeds the margin +Warning: source.ml:6636 exceeds the margin +Warning: source.ml:7095 exceeds the margin diff --git a/test/passing/refs.default/source.ml.ref b/test/passing/refs.default/source.ml.ref index 94e4e95a3d..95354c1f16 100644 --- a/test/passing/refs.default/source.ml.ref +++ b/test/passing/refs.default/source.ml.ref @@ -89,9 +89,7 @@ let () = (function%foo[@foo] x -> ()); (try%foo[@foo] () with _ -> ()); if%foo[@foo] () then () else (); - while%foo[@foo] () do - () - done; + while%foo[@foo] () do () done; for%foo[@foo] x = () to () do () done; diff --git a/test/passing/refs.janestreet/extensions-indent.ml.ref b/test/passing/refs.janestreet/extensions-indent.ml.ref index 45cb2c9f15..43ca2c6dee 100644 --- a/test/passing/refs.janestreet/extensions-indent.ml.ref +++ b/test/passing/refs.janestreet/extensions-indent.ml.ref @@ -97,9 +97,7 @@ let _ = (for i = 0 to 1 do () done) - (while true do - () - done) + (while true do () done) ;; let _ = @@ -107,9 +105,7 @@ let _ = (for%ext i = 0 to 1 do () done) - (while%ext true do - () - done) + (while%ext true do () done) ;; let _ = function%ext diff --git a/test/passing/refs.janestreet/extensions.ml.ref b/test/passing/refs.janestreet/extensions.ml.ref index 4be6e02c03..62c8a6653f 100644 --- a/test/passing/refs.janestreet/extensions.ml.ref +++ b/test/passing/refs.janestreet/extensions.ml.ref @@ -97,9 +97,7 @@ let _ = (for i = 0 to 1 do () done) - (while true do - () - done) + (while true do () done) ;; let _ = @@ -107,9 +105,7 @@ let _ = (for%ext i = 0 to 1 do () done) - (while%ext true do - () - done) + (while%ext true do () done) ;; let _ = function%ext diff --git a/test/passing/refs.janestreet/for_while.ml.ref b/test/passing/refs.janestreet/for_while.ml.ref index 56798e08b9..95edb37d9e 100644 --- a/test/passing/refs.janestreet/for_while.ml.ref +++ b/test/passing/refs.janestreet/for_while.ml.ref @@ -1,14 +1,14 @@ let () = foo (for i = 1 to 10 do - () + print_endline () done) ;; let () = foo (while true do - () + print_endline () done) ;; @@ -53,3 +53,11 @@ let _ = test this done ;; + +let _ = + while + some + biggggggggggggggggggggggggggggggggg + expressionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn + do () done +;; diff --git a/test/passing/refs.janestreet/kw_extentions.ml.ref b/test/passing/refs.janestreet/kw_extentions.ml.ref index ba0d82c498..d9dc6da09f 100644 --- a/test/passing/refs.janestreet/kw_extentions.ml.ref +++ b/test/passing/refs.janestreet/kw_extentions.ml.ref @@ -17,9 +17,7 @@ let () = for%ext i = 1 to 10 do () done; - while%ext false do - () - done; + while%ext false do () done; match%ext x with | _ -> () ;; diff --git a/test/passing/refs.janestreet/shortcut_ext_attr.ml.ref b/test/passing/refs.janestreet/shortcut_ext_attr.ml.ref index f911d7d0b6..c0d8df353d 100644 --- a/test/passing/refs.janestreet/shortcut_ext_attr.ml.ref +++ b/test/passing/refs.janestreet/shortcut_ext_attr.ml.ref @@ -14,11 +14,7 @@ let () = try[@foo] () with | _ -> ()]; [%foo if[@foo] () then () else ()]; - [%foo - while () do - () - done - [@foo]]; + [%foo while () do () done [@foo]]; [%foo for x = () to () do () diff --git a/test/passing/refs.janestreet/source.ml.ref b/test/passing/refs.janestreet/source.ml.ref index 780d4106c5..e02a2d2abe 100644 --- a/test/passing/refs.janestreet/source.ml.ref +++ b/test/passing/refs.janestreet/source.ml.ref @@ -91,9 +91,7 @@ let () = (try%foo[@foo] () with | _ -> ()); if%foo[@foo] () then () else (); - while%foo[@foo] () do - () - done; + while%foo[@foo] () do () done; for%foo[@foo] x = () to () do () done; diff --git a/test/passing/refs.ocamlformat/extensions-indent.ml.err b/test/passing/refs.ocamlformat/extensions-indent.ml.err index cca4a42308..807f0f1326 100644 --- a/test/passing/refs.ocamlformat/extensions-indent.ml.err +++ b/test/passing/refs.ocamlformat/extensions-indent.ml.err @@ -1 +1 @@ -Warning: extensions-indent.ml:503 exceeds the margin +Warning: extensions-indent.ml:499 exceeds the margin diff --git a/test/passing/refs.ocamlformat/extensions-indent.ml.ref b/test/passing/refs.ocamlformat/extensions-indent.ml.ref index 3fe66568a1..74538ee9a2 100644 --- a/test/passing/refs.ocamlformat/extensions-indent.ml.ref +++ b/test/passing/refs.ocamlformat/extensions-indent.ml.ref @@ -88,18 +88,14 @@ let _ = ( for i = 0 to 1 do () done ) - ( while true do - () - done ) + (while true do () done) let _ = f ( for%ext i = 0 to 1 do () done ) - ( while%ext true do - () - done ) + (while%ext true do () done) let _ = function%ext x -> x diff --git a/test/passing/refs.ocamlformat/extensions.ml.err b/test/passing/refs.ocamlformat/extensions.ml.err index d3952988ff..57b651936c 100644 --- a/test/passing/refs.ocamlformat/extensions.ml.err +++ b/test/passing/refs.ocamlformat/extensions.ml.err @@ -1 +1 @@ -Warning: extensions.ml:503 exceeds the margin +Warning: extensions.ml:499 exceeds the margin diff --git a/test/passing/refs.ocamlformat/extensions.ml.ref b/test/passing/refs.ocamlformat/extensions.ml.ref index 0bf8ce5d02..905a0fdae0 100644 --- a/test/passing/refs.ocamlformat/extensions.ml.ref +++ b/test/passing/refs.ocamlformat/extensions.ml.ref @@ -88,18 +88,14 @@ let _ = ( for i = 0 to 1 do () done ) - ( while true do - () - done ) + (while true do () done) let _ = f ( for%ext i = 0 to 1 do () done ) - ( while%ext true do - () - done ) + (while%ext true do () done) let _ = function%ext x -> x diff --git a/test/passing/refs.ocamlformat/for_while.ml.ref b/test/passing/refs.ocamlformat/for_while.ml.ref index a66c0e6183..74497fb5e5 100644 --- a/test/passing/refs.ocamlformat/for_while.ml.ref +++ b/test/passing/refs.ocamlformat/for_while.ml.ref @@ -1,13 +1,13 @@ let () = foo ( for i = 1 to 10 do - () + print_endline () done ) let () = foo ( while true do - () + print_endline () done ) let _ = @@ -48,3 +48,9 @@ let _ = do test this done + +let _ = + while + some biggggggggggggggggggggggggggggggggg + expressionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn + do () done diff --git a/test/passing/refs.ocamlformat/kw_extentions.ml.ref b/test/passing/refs.ocamlformat/kw_extentions.ml.ref index 302c43c658..4680340c31 100644 --- a/test/passing/refs.ocamlformat/kw_extentions.ml.ref +++ b/test/passing/refs.ocamlformat/kw_extentions.ml.ref @@ -15,9 +15,7 @@ let () = for%ext i = 1 to 10 do () done ; - while%ext false do - () - done ; + while%ext false do () done ; match%ext x with _ -> () let () = diff --git a/test/passing/refs.ocamlformat/shortcut_ext_attr.ml.ref b/test/passing/refs.ocamlformat/shortcut_ext_attr.ml.ref index f434288ac0..6fea339440 100644 --- a/test/passing/refs.ocamlformat/shortcut_ext_attr.ml.ref +++ b/test/passing/refs.ocamlformat/shortcut_ext_attr.ml.ref @@ -9,11 +9,7 @@ let () = [%foo function[@foo] x -> ()] ; [%foo try[@foo] () with _ -> ()] ; [%foo if[@foo] () then () else ()] ; - [%foo - while () do - () - done - [@foo]] ; + [%foo while () do () done [@foo]] ; [%foo for x = () to () do () diff --git a/test/passing/refs.ocamlformat/source.ml.err b/test/passing/refs.ocamlformat/source.ml.err index 37900d4c2d..c0c2125caa 100644 --- a/test/passing/refs.ocamlformat/source.ml.err +++ b/test/passing/refs.ocamlformat/source.ml.err @@ -1,3 +1,3 @@ -Warning: source.ml:6495 exceeds the margin -Warning: source.ml:7369 exceeds the margin -Warning: source.ml:7887 exceeds the margin +Warning: source.ml:6493 exceeds the margin +Warning: source.ml:7367 exceeds the margin +Warning: source.ml:7885 exceeds the margin diff --git a/test/passing/refs.ocamlformat/source.ml.ref b/test/passing/refs.ocamlformat/source.ml.ref index 9a486802e4..e3f7169910 100644 --- a/test/passing/refs.ocamlformat/source.ml.ref +++ b/test/passing/refs.ocamlformat/source.ml.ref @@ -98,9 +98,7 @@ let () = (function%foo[@foo] x -> ()) ; (try%foo[@foo] () with _ -> ()) ; if%foo[@foo] () then () else () ; - while%foo[@foo] () do - () - done ; + while%foo[@foo] () do () done ; for%foo[@foo] x = () to () do () done ; diff --git a/test/passing/tests/for_while.ml b/test/passing/tests/for_while.ml index 3770d5f214..e2d9f0eadc 100644 --- a/test/passing/tests/for_while.ml +++ b/test/passing/tests/for_while.ml @@ -1,13 +1,13 @@ let () = foo ( for i = 1 to 10 do - () + print_endline () done ) let () = foo ( while true do - () + print_endline () done ) let _ = @@ -50,3 +50,9 @@ let _ = do test this done + +let _ = + while + some biggggggggggggggggggggggggggggggggg + expressionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn + do () done