-
Notifications
You must be signed in to change notification settings - Fork 186
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Moves module attributes after the module keyword #2247
Conversation
28464e8
to
53d126f
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is a big change and I don't think the new formatting is better for every attributes or every users.
I think we should "preserve" the location of the attribute instead. This could be done by comparing locations or by storing the number of @
of each attributes in the CST.
I added two commit to have the attribute stay were the user put them. Each one handles one case, and there are a few, so a bunch of commit will de needed. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This seems like a very intrusive way. It'll make huge diffs on the parsetree and parser (added maintenance).
What do you think of instead modifying the attribute
type to remember which "attachment" it has ? (the number of @
)
"start" and "end" attributes are different in the number of @
they use:
module [@foo] M = struct end [@@bar]
The printing code would first render only attributes that have one @
and at a different position render only attributes that have two @@
.
The diffs are big thats true, but they were scheduled as part of the tranformation to the CST anyway, and they are also used to have explicit representation of the short form extensions (which make the biggest diff to the parser anyway, because the return type of some rules changes). |
863382e
to
635aaed
Compare
Will this PR subsume #2043? (meaning extension points will be treated the same as "pre-" attributes) |
It would do the same thing as #2043 , but only on nodes that can take both pre and post attributes. |
It has its place in this PR if we keep extensions and attributes together in the I just wanted to check before closing the other PR. |
I was not sure that shortcut extension always admitted attributes in both position, which is why I was not sure about the choice, but after having checked it is the case so I think you can indeed close #2043 |
b9d7988
to
c0dd3a9
Compare
a403935
to
d8bf264
Compare
I have rebased this PR, I would like its review to resume |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This looks mostly good but there's a regression in test_branch.
The changes affect many AST nodes and are huge, which make the review difficult. Could you extract the parts affecting only modules in an other PR ?
There don't seem to be tests about value bindings and I think it's an important node to test.
d8bf264
to
bd7e1c9
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Docstring attachment is broken in some cases, for example in test/passing/tests/doc_comments.ml
:
@@ -20,11 +19,8 @@ include Mod
let x = 2
(** after *)
-(**floatting1*)
-(**floatting2*)
-
(**before*)
-and y = 2
+and (**floatting1*) (**floatting2*) y = 2
(** after *)
(** A *)
The reproduction:
(** before *)
let x = 2
(** after *)
(**floatting1*)
(**floatting2*)
(**before*)
and y = 2
(** after *)
lib/Ast.ml
Outdated
let has_doc itm = List.exists ~f:Attr.is_doc itm.pvb_attributes | ||
let has_doc itm = | ||
List.exists ~f:Attr.is_doc itm.pvb_attributes.attrs_before | ||
|| List.exists ~f:Attr.is_doc itm.pvb_attributes.attrs_after |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
That's Ext_attrs.has_doc
.
3b022f8
to
d05a425
Compare
I believe my rebase is finished. There are still review comments to address |
I believe this is ready for merging. Could you give it a look @Julow |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This change to the parser cannot be proposed upstream. Extensions are really AST nodes and only OCamlformat can treat them as similar to attributes and interpret their content. This patch might not make sense for a "CST" library either.
Though, it makes perfect sense for OCamlformat and we should merge it.
|
||
let mklb first ~loc (p, args, typ, e, is_pun) attrs = | ||
let mklb ?(text=[]) ~docs ~loc (p, args, typ, e, is_pun) attrs = |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Note for later: With some work, we could store docstrings into the new ext_attrs
and avoid encoding them in attributes.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Do you think that's a reasonable amount of work? The "decoding" code added in Fmt_ast would be greatly reduced if we did it in this PR.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think we can add later as the "decoding" code is already written.
This PR was quite stale and is very old, I do not have much time to spend on ocamlformat, and I do not want this to go stale again.
Some of that code must also have been merged in #2451
Add ext_attrs to exception and fixes ext with regards to opens
98b0f7a
to
79276be
Compare
-- Fixes a bug where, in signatures, ```ocaml type%foo t exception%foo X ``` was formatted as-is, but ```ocaml type t exception X ``` resulted in ```ocaml type t exception X ``` This was because for the first example, the "line-break-algorithm" (found in `Ast.Signature_item.allow_adjacent`), was making its decision as if the code to printed was : ```ocaml [%%foo type t] [%%foo exception X] ``` We know have more information in our AST which allows us to make a difference between `type%foo t` and `[%%foo type t]`.
assert (nr = Recursive); (* see [no_nonrec_flag] *) | ||
(Psig_typesubst tys, ext) | ||
Psig_typesubst tys |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why are some of them modified/kept and others commented?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The use of psig_typesubst
looks like
| type_subst_declarations
{ psig_typesubst $1 }
This is not substitutable with Psig_typesubst $1
because $1
is a tuple.
We could comment them but this would result in a larger diff later in this file. This applies to all the "tuple-taking" functions here.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The patch is indeed large and will make backports harder. I'll merge this PR knowing that:
- The new representation for extensions doesn't make sense upstream or in a CST library.
- The next backport will require some more work.
eba720a
to
a13684f
Compare
….27.0) CHANGES: ### Highlight - \* Support OCaml 5.2 syntax (ocaml-ppx/ocamlformat#2519, ocaml-ppx/ocamlformat#2544, ocaml-ppx/ocamlformat#2590, ocaml-ppx/ocamlformat#2596, ocaml-ppx/ocamlformat#2621, ocaml-ppx/ocamlformat#2628, @Julow, @EmileTrotignon, @hhugo) This includes local open in types, raw identifiers, and the new representation for functions. This might change the formatting of some functions due to the formatting code being completely rewritten. - Support OCaml 5.3 syntax (ocaml-ppx/ocamlformat#2609, ocaml-ppx/ocamlformat#2610, ocaml-ppx/ocamlformat#2611, ocaml-ppx/ocamlformat#2622, ocaml-ppx/ocamlformat#2623, ocaml-ppx/ocamlformat#2562, ocaml-ppx/ocamlformat#2624, ocaml-ppx/ocamlformat#2625, ocaml-ppx/ocamlformat#2627, @Julow, @Zeta611) This adds support for effect patterns, short functor type arguments and utf8 identifiers. To format code using the new `effect` syntax, add this option to your `.ocamlformat`: ``` ocaml-version = 5.3 ``` - Documentation comments are now formatted by default (ocaml-ppx/ocamlformat#2390, @Julow) Use the option `parse-docstrings = false` to restore the previous behavior. - \* Consistent indentation of polymorphic variant arguments (ocaml-ppx/ocamlformat#2427, @Julow) Increases the indentation by one to make the formatting consistent with normal variants. For example: ``` ... (* before *) (`Msg (foo bar)) (* after *) (`Msg (foo bar)) ``` - Build on OCaml 5.3 (ocaml-ppx/ocamlformat#2603, @adamchol, @Julow) ### Added - Improve the emacs plugin (ocaml-ppx/ocamlformat#2577, ocaml-ppx/ocamlformat#2600, @gridbugs, @thibautbenjamin) Allow a custom command to be used to run ocamlformat and add compatibility with emacs ocaml tree-sitter modes. - Added option `let-binding-deindent-fun` (ocaml-ppx/ocamlformat#2521, @henrytill) to control the indentation of the `fun` in: ``` let f = fun foo -> bar ``` - Added back the flag `--disable-outside-detected-project` (ocaml-ppx/ocamlformat#2439, @gpetiot) It was removed in version 0.22. - Support newer Odoc syntax (ocaml-ppx/ocamlformat#2631, ocaml-ppx/ocamlformat#2632, ocaml-ppx/ocamlformat#2633, @Julow) ### Changed - \* Consistent formatting of comments (ocaml-ppx/ocamlformat#2371, ocaml-ppx/ocamlformat#2550, @Julow) This is mostly an internal change but some comments might be formatted differently. - \* Improve formatting of type constraints with type variables (ocaml-ppx/ocamlformat#2437, @gpetiot) For example: ``` let f : type a b c. a -> b -> c = ... ``` - \* Improve formatting of functor arguments (ocaml-ppx/ocamlformat#2505, @Julow) This also reduce the indentation of functor arguments with long signatures. - Improvements to the Janestreet profile (ocaml-ppx/ocamlformat#2445, ocaml-ppx/ocamlformat#2314, ocaml-ppx/ocamlformat#2460, ocaml-ppx/ocamlformat#2593, ocaml-ppx/ocamlformat#2612, @Julow, @tdelvecchio-jsc) - \* Undo let-bindings and methods normalizations (ocaml-ppx/ocamlformat#2523, ocaml-ppx/ocamlformat#2529, @gpetiot) This remove the rewriting of some forms of let-bindings and methods: + `let f x = (x : int)` is no longer rewritten into `let f x : int = x` + `let f (type a) (type b) ...` is no longer rewritten into `let f (type a b) ...` + `let f = fun x -> ...` is no longer rewritten into `let f x = ...` - \* The `break-colon` option is now taken into account for method type constraints (ocaml-ppx/ocamlformat#2529, @gpetiot) - \* Force a break around comments following an infix operator (fix non-stabilizing comments) (ocaml-ppx/ocamlformat#2478, @gpetiot) This adds a line break: ``` a || (* this comment is now on its own line *) b ``` ### Fixed - Fix placement of comments in some cases (ocaml-ppx/ocamlformat#2471, ocaml-ppx/ocamlformat#2503, ocaml-ppx/ocamlformat#2506, ocaml-ppx/ocamlformat#2540, ocaml-ppx/ocamlformat#2541, ocaml-ppx/ocamlformat#2592, ocaml-ppx/ocamlformat#2617, @gpetiot, @Julow) Some comments were being moved or causing OCamlformat to crash. OCamlformat refuses to format if a comment would be missing in its output, to avoid loosing code. - Fix attributes being dropped or moved (ocaml-ppx/ocamlformat#2247, ocaml-ppx/ocamlformat#2459, ocaml-ppx/ocamlformat#2551, ocaml-ppx/ocamlformat#2564, ocaml-ppx/ocamlformat#2602, @EmileTrotignon, @tdelvecchio-jsc, @Julow) OCamlformat refuses to format if the formatted code has a different meaning than the original code, for example, if an attribute is removed. We also try to avoid moving attributes even if that doesn't change the original code, for example we no longer format `open[@attr] M` as `open M [@@attr]`. - Remove trailing space inside a wrapping empty signature (ocaml-ppx/ocamlformat#2443, @Julow) - Fix extension-point spacing in structures (ocaml-ppx/ocamlformat#2450, @Julow) - \* Consistent break after string constant argument (ocaml-ppx/ocamlformat#2453, @Julow) - \* Fix cinaps comment formatting to not change multiline string contents (ocaml-ppx/ocamlformat#2463, @tdelvecchio-jsc) - \* Fix the indentation of tuples in attributes and extensions (ocaml-ppx/ocamlformat#2488, @Julow) - \* Fix weird indentation and line breaks after comments (ocaml-ppx/ocamlformat#2507, ocaml-ppx/ocamlformat#2589, ocaml-ppx/ocamlformat#2606, @Julow) - \* Fix unwanted alignment in if-then-else (ocaml-ppx/ocamlformat#2511, @Julow) - Fix missing parentheses around constraint expressions with attributes (ocaml-ppx/ocamlformat#2513, @alanechang) - Fix formatting of type vars in GADT constructors (ocaml-ppx/ocamlformat#2518, @Julow) - Fix `[@ocamlformat "disable"]` in some cases (ocaml-ppx/ocamlformat#2242, ocaml-ppx/ocamlformat#2525, @EmileTrotignon) This caused a bug inside `class type` constructs and when attached to a `let ... in` - Display `a##b` instead of `a ## b` and similarly for operators that start with # (ocaml-ppx/ocamlformat#2580, @v-gb) - \* Fix arrow type indentation with `break-separators=before` (ocaml-ppx/ocamlformat#2598, @Julow) - Fix missing parentheses around a let in class expressions (ocaml-ppx/ocamlformat#2599, @Julow) - Fix formatting of paragraphs in lists in documentation (ocaml-ppx/ocamlformat#2607, @Julow) - Avoid unwanted space in references and links text in documentation (ocaml-ppx/ocamlformat#2608, @Julow) - \* Improve the indentation of attributes in patterns (ocaml-ppx/ocamlformat#2613, @Julow) - \* Avoid large indentation in patterns after `let%ext` (ocaml-ppx/ocamlformat#2615, @Julow)
….27.0) CHANGES: ### Highlight - \* Support OCaml 5.2 syntax (ocaml-ppx/ocamlformat#2519, ocaml-ppx/ocamlformat#2544, ocaml-ppx/ocamlformat#2590, ocaml-ppx/ocamlformat#2596, ocaml-ppx/ocamlformat#2621, ocaml-ppx/ocamlformat#2628, @Julow, @EmileTrotignon, @hhugo) This includes local open in types, raw identifiers, and the new representation for functions. This might change the formatting of some functions due to the formatting code being completely rewritten. - Support OCaml 5.3 syntax (ocaml-ppx/ocamlformat#2609, ocaml-ppx/ocamlformat#2610, ocaml-ppx/ocamlformat#2611, ocaml-ppx/ocamlformat#2622, ocaml-ppx/ocamlformat#2623, ocaml-ppx/ocamlformat#2562, ocaml-ppx/ocamlformat#2624, ocaml-ppx/ocamlformat#2625, ocaml-ppx/ocamlformat#2627, @Julow, @Zeta611) This adds support for effect patterns, short functor type arguments and utf8 identifiers. To format code using the new `effect` syntax, add this option to your `.ocamlformat`: ``` ocaml-version = 5.3 ``` - Documentation comments are now formatted by default (ocaml-ppx/ocamlformat#2390, @Julow) Use the option `parse-docstrings = false` to restore the previous behavior. - \* Consistent indentation of polymorphic variant arguments (ocaml-ppx/ocamlformat#2427, @Julow) Increases the indentation by one to make the formatting consistent with normal variants. For example: ``` ... (* before *) (`Msg (foo bar)) (* after *) (`Msg (foo bar)) ``` - Build on OCaml 5.3 (ocaml-ppx/ocamlformat#2603, @adamchol, @Julow) ### Added - Improve the emacs plugin (ocaml-ppx/ocamlformat#2577, ocaml-ppx/ocamlformat#2600, @gridbugs, @thibautbenjamin) Allow a custom command to be used to run ocamlformat and add compatibility with emacs ocaml tree-sitter modes. - Added option `let-binding-deindent-fun` (ocaml-ppx/ocamlformat#2521, @henrytill) to control the indentation of the `fun` in: ``` let f = fun foo -> bar ``` - Added back the flag `--disable-outside-detected-project` (ocaml-ppx/ocamlformat#2439, @gpetiot) It was removed in version 0.22. - Support newer Odoc syntax (ocaml-ppx/ocamlformat#2631, ocaml-ppx/ocamlformat#2632, ocaml-ppx/ocamlformat#2633, @Julow) ### Changed - \* Consistent formatting of comments (ocaml-ppx/ocamlformat#2371, ocaml-ppx/ocamlformat#2550, @Julow) This is mostly an internal change but some comments might be formatted differently. - \* Improve formatting of type constraints with type variables (ocaml-ppx/ocamlformat#2437, @gpetiot) For example: ``` let f : type a b c. a -> b -> c = ... ``` - \* Improve formatting of functor arguments (ocaml-ppx/ocamlformat#2505, @Julow) This also reduce the indentation of functor arguments with long signatures. - Improvements to the Janestreet profile (ocaml-ppx/ocamlformat#2445, ocaml-ppx/ocamlformat#2314, ocaml-ppx/ocamlformat#2460, ocaml-ppx/ocamlformat#2593, ocaml-ppx/ocamlformat#2612, @Julow, @tdelvecchio-jsc) - \* Undo let-bindings and methods normalizations (ocaml-ppx/ocamlformat#2523, ocaml-ppx/ocamlformat#2529, @gpetiot) This remove the rewriting of some forms of let-bindings and methods: + `let f x = (x : int)` is no longer rewritten into `let f x : int = x` + `let f (type a) (type b) ...` is no longer rewritten into `let f (type a b) ...` + `let f = fun x -> ...` is no longer rewritten into `let f x = ...` - \* The `break-colon` option is now taken into account for method type constraints (ocaml-ppx/ocamlformat#2529, @gpetiot) - \* Force a break around comments following an infix operator (fix non-stabilizing comments) (ocaml-ppx/ocamlformat#2478, @gpetiot) This adds a line break: ``` a || (* this comment is now on its own line *) b ``` ### Fixed - Fix placement of comments in some cases (ocaml-ppx/ocamlformat#2471, ocaml-ppx/ocamlformat#2503, ocaml-ppx/ocamlformat#2506, ocaml-ppx/ocamlformat#2540, ocaml-ppx/ocamlformat#2541, ocaml-ppx/ocamlformat#2592, ocaml-ppx/ocamlformat#2617, @gpetiot, @Julow) Some comments were being moved or causing OCamlformat to crash. OCamlformat refuses to format if a comment would be missing in its output, to avoid loosing code. - Fix attributes being dropped or moved (ocaml-ppx/ocamlformat#2247, ocaml-ppx/ocamlformat#2459, ocaml-ppx/ocamlformat#2551, ocaml-ppx/ocamlformat#2564, ocaml-ppx/ocamlformat#2602, @EmileTrotignon, @tdelvecchio-jsc, @Julow) OCamlformat refuses to format if the formatted code has a different meaning than the original code, for example, if an attribute is removed. We also try to avoid moving attributes even if that doesn't change the original code, for example we no longer format `open[@attr] M` as `open M [@@attr]`. - Remove trailing space inside a wrapping empty signature (ocaml-ppx/ocamlformat#2443, @Julow) - Fix extension-point spacing in structures (ocaml-ppx/ocamlformat#2450, @Julow) - \* Consistent break after string constant argument (ocaml-ppx/ocamlformat#2453, @Julow) - \* Fix cinaps comment formatting to not change multiline string contents (ocaml-ppx/ocamlformat#2463, @tdelvecchio-jsc) - \* Fix the indentation of tuples in attributes and extensions (ocaml-ppx/ocamlformat#2488, @Julow) - \* Fix weird indentation and line breaks after comments (ocaml-ppx/ocamlformat#2507, ocaml-ppx/ocamlformat#2589, ocaml-ppx/ocamlformat#2606, @Julow) - \* Fix unwanted alignment in if-then-else (ocaml-ppx/ocamlformat#2511, @Julow) - Fix missing parentheses around constraint expressions with attributes (ocaml-ppx/ocamlformat#2513, @alanechang) - Fix formatting of type vars in GADT constructors (ocaml-ppx/ocamlformat#2518, @Julow) - Fix `[@ocamlformat "disable"]` in some cases (ocaml-ppx/ocamlformat#2242, ocaml-ppx/ocamlformat#2525, @EmileTrotignon) This caused a bug inside `class type` constructs and when attached to a `let ... in` - Display `a##b` instead of `a ## b` and similarly for operators that start with # (ocaml-ppx/ocamlformat#2580, @v-gb) - \* Fix arrow type indentation with `break-separators=before` (ocaml-ppx/ocamlformat#2598, @Julow) - Fix missing parentheses around a let in class expressions (ocaml-ppx/ocamlformat#2599, @Julow) - Fix formatting of paragraphs in lists in documentation (ocaml-ppx/ocamlformat#2607, @Julow) - Avoid unwanted space in references and links text in documentation (ocaml-ppx/ocamlformat#2608, @Julow) - \* Improve the indentation of attributes in patterns (ocaml-ppx/ocamlformat#2613, @Julow) - \* Avoid large indentation in patterns after `let%ext` (ocaml-ppx/ocamlformat#2615, @Julow)
….27.0) CHANGES: ### Highlight - \* Support OCaml 5.2 syntax (ocaml-ppx/ocamlformat#2519, ocaml-ppx/ocamlformat#2544, ocaml-ppx/ocamlformat#2590, ocaml-ppx/ocamlformat#2596, ocaml-ppx/ocamlformat#2621, ocaml-ppx/ocamlformat#2628, @Julow, @EmileTrotignon, @hhugo) This includes local open in types, raw identifiers, and the new representation for functions. This might change the formatting of some functions due to the formatting code being completely rewritten. - Support OCaml 5.3 syntax (ocaml-ppx/ocamlformat#2609, ocaml-ppx/ocamlformat#2610, ocaml-ppx/ocamlformat#2611, ocaml-ppx/ocamlformat#2622, ocaml-ppx/ocamlformat#2623, ocaml-ppx/ocamlformat#2562, ocaml-ppx/ocamlformat#2624, ocaml-ppx/ocamlformat#2625, ocaml-ppx/ocamlformat#2627, @Julow, @Zeta611) This adds support for effect patterns, short functor type arguments and utf8 identifiers. To format code using the new `effect` syntax, add this option to your `.ocamlformat`: ``` ocaml-version = 5.3 ``` - Documentation comments are now formatted by default (ocaml-ppx/ocamlformat#2390, @Julow) Use the option `parse-docstrings = false` to restore the previous behavior. - \* Consistent indentation of polymorphic variant arguments (ocaml-ppx/ocamlformat#2427, @Julow) Increases the indentation by one to make the formatting consistent with normal variants. For example: ``` ... (* before *) (`Msg (foo bar)) (* after *) (`Msg (foo bar)) ``` - Build on OCaml 5.3 (ocaml-ppx/ocamlformat#2603, @adamchol, @Julow) ### Added - Improve the emacs plugin (ocaml-ppx/ocamlformat#2577, ocaml-ppx/ocamlformat#2600, @gridbugs, @thibautbenjamin) Allow a custom command to be used to run ocamlformat and add compatibility with emacs ocaml tree-sitter modes. - Added option `let-binding-deindent-fun` (ocaml-ppx/ocamlformat#2521, @henrytill) to control the indentation of the `fun` in: ``` let f = fun foo -> bar ``` - Added back the flag `--disable-outside-detected-project` (ocaml-ppx/ocamlformat#2439, @gpetiot) It was removed in version 0.22. - Support newer Odoc syntax (ocaml-ppx/ocamlformat#2631, ocaml-ppx/ocamlformat#2632, ocaml-ppx/ocamlformat#2633, @Julow) ### Changed - \* Consistent formatting of comments (ocaml-ppx/ocamlformat#2371, ocaml-ppx/ocamlformat#2550, @Julow) This is mostly an internal change but some comments might be formatted differently. - \* Improve formatting of type constraints with type variables (ocaml-ppx/ocamlformat#2437, @gpetiot) For example: ``` let f : type a b c. a -> b -> c = ... ``` - \* Improve formatting of functor arguments (ocaml-ppx/ocamlformat#2505, @Julow) This also reduce the indentation of functor arguments with long signatures. - Improvements to the Janestreet profile (ocaml-ppx/ocamlformat#2445, ocaml-ppx/ocamlformat#2314, ocaml-ppx/ocamlformat#2460, ocaml-ppx/ocamlformat#2593, ocaml-ppx/ocamlformat#2612, @Julow, @tdelvecchio-jsc) - \* Undo let-bindings and methods normalizations (ocaml-ppx/ocamlformat#2523, ocaml-ppx/ocamlformat#2529, @gpetiot) This remove the rewriting of some forms of let-bindings and methods: + `let f x = (x : int)` is no longer rewritten into `let f x : int = x` + `let f (type a) (type b) ...` is no longer rewritten into `let f (type a b) ...` + `let f = fun x -> ...` is no longer rewritten into `let f x = ...` - \* The `break-colon` option is now taken into account for method type constraints (ocaml-ppx/ocamlformat#2529, @gpetiot) - \* Force a break around comments following an infix operator (fix non-stabilizing comments) (ocaml-ppx/ocamlformat#2478, @gpetiot) This adds a line break: ``` a || (* this comment is now on its own line *) b ``` ### Fixed - Fix placement of comments in some cases (ocaml-ppx/ocamlformat#2471, ocaml-ppx/ocamlformat#2503, ocaml-ppx/ocamlformat#2506, ocaml-ppx/ocamlformat#2540, ocaml-ppx/ocamlformat#2541, ocaml-ppx/ocamlformat#2592, ocaml-ppx/ocamlformat#2617, @gpetiot, @Julow) Some comments were being moved or causing OCamlformat to crash. OCamlformat refuses to format if a comment would be missing in its output, to avoid loosing code. - Fix attributes being dropped or moved (ocaml-ppx/ocamlformat#2247, ocaml-ppx/ocamlformat#2459, ocaml-ppx/ocamlformat#2551, ocaml-ppx/ocamlformat#2564, ocaml-ppx/ocamlformat#2602, @EmileTrotignon, @tdelvecchio-jsc, @Julow) OCamlformat refuses to format if the formatted code has a different meaning than the original code, for example, if an attribute is removed. We also try to avoid moving attributes even if that doesn't change the original code, for example we no longer format `open[@attr] M` as `open M [@@attr]`. - Remove trailing space inside a wrapping empty signature (ocaml-ppx/ocamlformat#2443, @Julow) - Fix extension-point spacing in structures (ocaml-ppx/ocamlformat#2450, @Julow) - \* Consistent break after string constant argument (ocaml-ppx/ocamlformat#2453, @Julow) - \* Fix cinaps comment formatting to not change multiline string contents (ocaml-ppx/ocamlformat#2463, @tdelvecchio-jsc) - \* Fix the indentation of tuples in attributes and extensions (ocaml-ppx/ocamlformat#2488, @Julow) - \* Fix weird indentation and line breaks after comments (ocaml-ppx/ocamlformat#2507, ocaml-ppx/ocamlformat#2589, ocaml-ppx/ocamlformat#2606, @Julow) - \* Fix unwanted alignment in if-then-else (ocaml-ppx/ocamlformat#2511, @Julow) - Fix missing parentheses around constraint expressions with attributes (ocaml-ppx/ocamlformat#2513, @alanechang) - Fix formatting of type vars in GADT constructors (ocaml-ppx/ocamlformat#2518, @Julow) - Fix `[@ocamlformat "disable"]` in some cases (ocaml-ppx/ocamlformat#2242, ocaml-ppx/ocamlformat#2525, @EmileTrotignon) This caused a bug inside `class type` constructs and when attached to a `let ... in` - Display `a##b` instead of `a ## b` and similarly for operators that start with # (ocaml-ppx/ocamlformat#2580, @v-gb) - \* Fix arrow type indentation with `break-separators=before` (ocaml-ppx/ocamlformat#2598, @Julow) - Fix missing parentheses around a let in class expressions (ocaml-ppx/ocamlformat#2599, @Julow) - Fix formatting of paragraphs in lists in documentation (ocaml-ppx/ocamlformat#2607, @Julow) - Avoid unwanted space in references and links text in documentation (ocaml-ppx/ocamlformat#2608, @Julow) - \* Improve the indentation of attributes in patterns (ocaml-ppx/ocamlformat#2613, @Julow) - \* Avoid large indentation in patterns after `let%ext` (ocaml-ppx/ocamlformat#2615, @Julow)
….27.0) CHANGES: ### Highlight - \* Support OCaml 5.2 syntax (ocaml-ppx/ocamlformat#2519, ocaml-ppx/ocamlformat#2544, ocaml-ppx/ocamlformat#2590, ocaml-ppx/ocamlformat#2596, ocaml-ppx/ocamlformat#2621, ocaml-ppx/ocamlformat#2628, @Julow, @EmileTrotignon, @hhugo) This includes local open in types, raw identifiers, and the new representation for functions. This might change the formatting of some functions due to the formatting code being completely rewritten. - Support OCaml 5.3 syntax (ocaml-ppx/ocamlformat#2609, ocaml-ppx/ocamlformat#2610, ocaml-ppx/ocamlformat#2611, ocaml-ppx/ocamlformat#2622, ocaml-ppx/ocamlformat#2623, ocaml-ppx/ocamlformat#2562, ocaml-ppx/ocamlformat#2624, ocaml-ppx/ocamlformat#2625, ocaml-ppx/ocamlformat#2627, @Julow, @Zeta611) This adds support for effect patterns, short functor type arguments and utf8 identifiers. To format code using the new `effect` syntax, add this option to your `.ocamlformat`: ``` ocaml-version = 5.3 ``` - Documentation comments are now formatted by default (ocaml-ppx/ocamlformat#2390, @Julow) Use the option `parse-docstrings = false` to restore the previous behavior. - \* Consistent indentation of polymorphic variant arguments (ocaml-ppx/ocamlformat#2427, @Julow) Increases the indentation by one to make the formatting consistent with normal variants. For example: ``` ... (* before *) (`Msg (foo bar)) (* after *) (`Msg (foo bar)) ``` - Build on OCaml 5.3 (ocaml-ppx/ocamlformat#2603, @adamchol, @Julow) ### Added - Improve the emacs plugin (ocaml-ppx/ocamlformat#2577, ocaml-ppx/ocamlformat#2600, @gridbugs, @thibautbenjamin) Allow a custom command to be used to run ocamlformat and add compatibility with emacs ocaml tree-sitter modes. - Added option `let-binding-deindent-fun` (ocaml-ppx/ocamlformat#2521, @henrytill) to control the indentation of the `fun` in: ``` let f = fun foo -> bar ``` - Added back the flag `--disable-outside-detected-project` (ocaml-ppx/ocamlformat#2439, @gpetiot) It was removed in version 0.22. - Support newer Odoc syntax (ocaml-ppx/ocamlformat#2631, ocaml-ppx/ocamlformat#2632, ocaml-ppx/ocamlformat#2633, @Julow) ### Changed - \* Consistent formatting of comments (ocaml-ppx/ocamlformat#2371, ocaml-ppx/ocamlformat#2550, @Julow) This is mostly an internal change but some comments might be formatted differently. - \* Improve formatting of type constraints with type variables (ocaml-ppx/ocamlformat#2437, @gpetiot) For example: ``` let f : type a b c. a -> b -> c = ... ``` - \* Improve formatting of functor arguments (ocaml-ppx/ocamlformat#2505, @Julow) This also reduce the indentation of functor arguments with long signatures. - Improvements to the Janestreet profile (ocaml-ppx/ocamlformat#2445, ocaml-ppx/ocamlformat#2314, ocaml-ppx/ocamlformat#2460, ocaml-ppx/ocamlformat#2593, ocaml-ppx/ocamlformat#2612, @Julow, @tdelvecchio-jsc) - \* Undo let-bindings and methods normalizations (ocaml-ppx/ocamlformat#2523, ocaml-ppx/ocamlformat#2529, @gpetiot) This remove the rewriting of some forms of let-bindings and methods: + `let f x = (x : int)` is no longer rewritten into `let f x : int = x` + `let f (type a) (type b) ...` is no longer rewritten into `let f (type a b) ...` + `let f = fun x -> ...` is no longer rewritten into `let f x = ...` - \* The `break-colon` option is now taken into account for method type constraints (ocaml-ppx/ocamlformat#2529, @gpetiot) - \* Force a break around comments following an infix operator (fix non-stabilizing comments) (ocaml-ppx/ocamlformat#2478, @gpetiot) This adds a line break: ``` a || (* this comment is now on its own line *) b ``` ### Fixed - Fix placement of comments in some cases (ocaml-ppx/ocamlformat#2471, ocaml-ppx/ocamlformat#2503, ocaml-ppx/ocamlformat#2506, ocaml-ppx/ocamlformat#2540, ocaml-ppx/ocamlformat#2541, ocaml-ppx/ocamlformat#2592, ocaml-ppx/ocamlformat#2617, @gpetiot, @Julow) Some comments were being moved or causing OCamlformat to crash. OCamlformat refuses to format if a comment would be missing in its output, to avoid loosing code. - Fix attributes being dropped or moved (ocaml-ppx/ocamlformat#2247, ocaml-ppx/ocamlformat#2459, ocaml-ppx/ocamlformat#2551, ocaml-ppx/ocamlformat#2564, ocaml-ppx/ocamlformat#2602, @EmileTrotignon, @tdelvecchio-jsc, @Julow) OCamlformat refuses to format if the formatted code has a different meaning than the original code, for example, if an attribute is removed. We also try to avoid moving attributes even if that doesn't change the original code, for example we no longer format `open[@attr] M` as `open M [@@attr]`. - Remove trailing space inside a wrapping empty signature (ocaml-ppx/ocamlformat#2443, @Julow) - Fix extension-point spacing in structures (ocaml-ppx/ocamlformat#2450, @Julow) - \* Consistent break after string constant argument (ocaml-ppx/ocamlformat#2453, @Julow) - \* Fix cinaps comment formatting to not change multiline string contents (ocaml-ppx/ocamlformat#2463, @tdelvecchio-jsc) - \* Fix the indentation of tuples in attributes and extensions (ocaml-ppx/ocamlformat#2488, @Julow) - \* Fix weird indentation and line breaks after comments (ocaml-ppx/ocamlformat#2507, ocaml-ppx/ocamlformat#2589, ocaml-ppx/ocamlformat#2606, @Julow) - \* Fix unwanted alignment in if-then-else (ocaml-ppx/ocamlformat#2511, @Julow) - Fix missing parentheses around constraint expressions with attributes (ocaml-ppx/ocamlformat#2513, @alanechang) - Fix formatting of type vars in GADT constructors (ocaml-ppx/ocamlformat#2518, @Julow) - Fix `[@ocamlformat "disable"]` in some cases (ocaml-ppx/ocamlformat#2242, ocaml-ppx/ocamlformat#2525, @EmileTrotignon) This caused a bug inside `class type` constructs and when attached to a `let ... in` - Display `a##b` instead of `a ## b` and similarly for operators that start with # (ocaml-ppx/ocamlformat#2580, @v-gb) - \* Fix arrow type indentation with `break-separators=before` (ocaml-ppx/ocamlformat#2598, @Julow) - Fix missing parentheses around a let in class expressions (ocaml-ppx/ocamlformat#2599, @Julow) - Fix formatting of paragraphs in lists in documentation (ocaml-ppx/ocamlformat#2607, @Julow) - Avoid unwanted space in references and links text in documentation (ocaml-ppx/ocamlformat#2608, @Julow) - \* Improve the indentation of attributes in patterns (ocaml-ppx/ocamlformat#2613, @Julow) - \* Avoid large indentation in patterns after `let%ext` (ocaml-ppx/ocamlformat#2615, @Julow)
This implements issue #2109, and will be useful for reworking parentheses.
The implementation is a bit naive, as far as I know it is fine, but it almost looks too good to be true.
Maybe the
~pre
argument needs to be changed, I would like someone to get a look into it, its beyond my understanding as of now.