0.37.0
------

### 5.4 Support

- Add initial OCaml 5.4 support (#570, @patricoferris, @NathanReb)

### Other Changes

- Add `Longident.to/of_compiler` to astlib to simplify maintenance
  of ppx-es that interacts with other parts of the compiler-libs such
  as the type checker. (#603, @NathanReb)

- Fix a bug where some infix operators such as `mod` would be printed as
  raw identifiers by our `Pprintast`. (#601, @NathanReb)

- Fix 5.2 -> 5.3 migration of constants. Those used to always have a `none`
  location which can lead to unhelpful error messages.
  (#569, @NathanReb)

- Add a new context-free rule type that replaces AST nodes that have the registered
  attributes attached to them. (#574, @Skepfyr)

- Allow users to derive code from module bindings and module declarations
  (#576, @patricoferris)

- Expose `Ppxlib.Location.Error.t = Astlib.Location.Error.t` (#593, @ceastlund)

- Add `@@@ppxlib.inline.end`, deprecate `@@@deriving.end`. (#594, @ceastlund)

- Clean the AST of any ppxlib migration attributes whenever printing using
  Pretty_print mode and the use_compiler_pp flag. (#598, @patricoferris)

- Add custom printer support to `pp_ast` functions via the `?printer` config
  parameter. (#526, @pedrobslisboa)

0.36.2
------

- Make Ast_builder's default `value_binding` constructor generate the proper
  `pvb_constraint` from the pattern and expression arguments.
  (#589, @NathanReb)
- Fix pprintast to output correct syntax from `Ppat_constraint (pat, Ptyp_poly ...)`
  nodes until they are completely dropped. (#588, @NathanReb)

0.36.1 (2025-07-10)
-------------------

- Fix ppxlib driver's AST to source printer. Our copy of pprintast was not
  properly updated which resulted in incorrect printing of value bindings'
  constraints (#585, @NathanReb)

0.36.0 (2025-03-03)
-------------------

- Change `Location.none` to match the compiler's `Location.none` as of OCaml
  4.08. This fixes a bug in `loc_of_attribute` (#540, @ncik-roberts, @patricoferris)

- Bump ppxlib's AST to 5.2.0 (#514, @patricoferris)

- Add the `[@@@expand_inline]` transformation and support for floating attribute context
  free transformations. (#560, @jaymody)

- Add a `-raise-embedded-errors` flag to the driver. Setting this flag raises the first
  `ocaml.error` embedded in the final AST.

- Export `Ast_pattern.fail`. (#563, @ceastlund)

- Make `Ast_traverse.sexp_of` more concise, and add a test. (#561, @ceastlund)

0.35.0 (2025-02-03)
-------------------

- Allow use of effect syntax in preprocessed files without causing migration
  failures. (#552, @hhugo, @NathanReb)

- Remove support for compilers older than 4.08 (#556, @NathanReb)

- Add a `--use-compiler-pp` flag to the standalone driver. This flag
 can be set when the driver outputs source code to make it use the compiler's
 `Pprintast` instead of ppxlib's.
 (#555, @NathanReb)

0.34.0 (2025-01-06)
-------------------

### 5.3 support

- Add initial OCaml 5.3 support (#487, @NathanReb, @hhugo, @nojb)

- Initialise OCaml 5.3's lexer with the `keywords` setting from `OCAMLPARAM` or
  the new `-keywords` driver's CLI option to allow the standalone ppx driver to
  process old packages using `effect` as an identifier
  (#535, @dra27, @NathanReb)

### Other changes

- Add `Pprintast.binding`, `longident` and `payload` (#542, @mattiasdrp)

- Fix `deriving_inline` round-trip check so that it works with 5.01 <-> 5.02
  migrations (#519, @NathanReb)

- Add ppxlib's AST pretty-printing utilities in `Ppxlib.Pp_ast` and
  a `ppxlib-pp-ast` executable in a new separate `ppxlib-tools` package
  (#517, #525, #537, @NathanReb)

- Change `-dparsetree` from a sexp output to a pretty printed AST, closer
  to what the compiler's `-dparsetree` is.
  (#530, @NathanReb)

- Add Parsetree documentation comments to `Ast_builder` functions (#518, @patricoferris)

- Support class type declarations in derivers with the new, optional arguments
  `{str,sig}_class_type_decl` in `Deriving.add` (#538, @patricoferris)

0.33.0 (2024-07-22)
-------------------

- Fix a bug where `Code_path.main_module_name` would not properly remove
  extensions from the filename and therefore return an invalid module name.
  (#512, @NathanReb)

- Add `-unused-type-warnings` flag to the driver to allow users to disable
  only the generation of warning 34 silencing structure items when using
  `[@@deriving ...]` on type declarations. (#511, @mbarbin, @NathanReb)

- Make `-unused-code-warnings` flag to the driver also controls the generation
  of warning 34 silencing structure items when using `[@@deriving ...]` on type
  declarations. (#510, @mbarbin, @NathanReb)

- Driver: Add `-unused-code-warnings=force` command-line flag argument. (#490, @mbarbin)

- new functions `Ast_builder.{e,p}list_tail` that take an extra tail
  expression/pattern argument parameter compared to `Ast_builder.{e,p}list`, so
  they can build ASTs like `a :: b :: c` instead of only `[ a; b ]`.
  (#498, #502, @v-gb, @NathanReb)

- Fix `Longident.parse` so it also handles indexing operators such as
  `.!()`, `.%(;..)<-`, or `Vec.(.%())` (#494, @octachron)

- Add a `special_function'` variant which directly takes a `Longident.t`
  argument to avoid the issue that `Longident.t` cover distinct syntaxic classes
  which cannot be easily parsed by a common parser (#496, @octachron).

- Keep location ranges consistent when migrating `Pexp_function` nodes from 5.2+
  to older versions (#504, @jchavarri)

- Fix `-locations-check` behaviour so it is no longer required to pass `-check`
  as well to enable location checks. (#506, @NathanReb)


0.32.1 (2024-04-23)
-------------------

- Add support for OCaml 5.2

- Insert errors from caught located exceptions in place of the code that
  should have been generated by context-free rules. (#472, @NathanReb)

0.32.0 (2024-02-05)
-------------------

- Add an optional `embed_errors` argument to `Context_free.map_top_down` that
  controls how to deal with exceptions thrown by context-free rules.
  (#468, @NathanReb)

- Fix `Longident.parse` so it properly handles unparenthesized dotted operators
  such as `+.` or `*.`. (#111, @rgrinberg, @NathanReb)

- raising an exception does no longer cancel the whole context free phase(#453, @burnleydev1)

- Sort embedded errors that are appended to the AST by location so the compiler
  reports the one closer to the beginning of the file first. (#463, @NathanReb)

- Update `Attribute.get` to ignore `loc_ghost`. (#460, @ceastlund)

- Add API to manipulate attributes that are used as flags (#408, @dianaoigo)

- Update changelog to use ISO 8061 date format: YYYY-MM-DD. (#445, @ceastlund)

- Replace `Caml` with `Stdlib`. (#427, @ceastlund)

- When a transformation raises, the last valid AST is used as input to the upcoming
  transformations. All such errors are collected and appended as
  extension nodes to the final AST (#447, @burnleydev1)

- Fix a small mistake in the man pages: Embededding errors is done by default with
  `-as-pp`, not with `-dump-ast` (#464, @pitag-ha)

- Set appropriate binary mode when writing to `stdout` especially for Windows
  compatibility. (#466, @jonahbeckford)

0.31.0 (2023-09-21)
-------------------

- Fix support for OCaml 5.1: migrated code preserves generative
  functor warnings, without creating more. Locations are better
  preserved. (#432, @pitag-ha, @panglesd)

- Driver: Add `-unused-code-warnings` command-line flag. (#444, @ceastlund)

- Add `?warning` flag to `Deriving.Generator.make`. (#440, @jacksonzou123 via @ceastlund)

- Restore the "path_arg" functionality in the V3 API (#431, @ELLIOTTCABLE)

- Expose migration/copying/etc. functions for all AST types needed by `Pprintast` (#454, @antalsz)

- Preserve quoted attributes on antiquotes in metaquot (#441, @ncik-roberts)

- Attribute namespaces: Fix semantics of reserving multi-component namespaces (#443, @ncik-roberts)

0.30.0 (2023-06-20)
-------------------

- Adopt the OCaml Code of Conduct on the repo (#426, @pitag-ha)

- Clean up misleading attribute hints when declared for proper context. (#425, @ceastlund)

- Ast_pattern now has ebool, pbool helper, and a new map.(#402, @burnleydev1)

- multiple errors are now reported in `metaquot`. (#397, @burnleydev1)

- Add `Attribute.declare_with_attr_loc` (#396, @dvulakh)

- Add "ns" and "res" as reserved namespaces(#388, @davesnx)

- Make quoter `let` binding non-recursive (#401, @sim642)

- Fix failure of 'lift_map_with_context' in traverse by compile-time
  evaluation of 'fst' and 'snd' (#390, @smuenzel)

- Driver: Bias the mapping from magic to version towards the current version,
  as it is usually the common case and it helps when magic numbers are
  ambiguous (such as on development versions) (#409, @shym)

- Remove unnecessary test dependencies towards base and stdio (#421, @kit-ty-kate)

- Update description to reflect that `ppxlib` contains more than a library
  (#422, @pitag-ha)

- Add support for OCaml 5.1, excluding OCaml `5.1.0~alpha1` (#428, @shym, @Octachron , @pitag-ha, @panglesd)
- Driver: Fix `-locations-check` option for coercions with ground  (#428, @Octachron)

0.29.1 (2023-02-14)
------------------

- Allow users to vendor `ppxlib` as-is, as well as `ppx_sexp_conv` in the same project (#386, @kit-ty-kate)

0.29.0 (2023-02-06)
------------------

- Remove `File_path` exports. (#381, @ceastlund)

- Add `Ppxlib.Expansion_helpers` with name mangling utilities from ppx_deriving (#370, @sim642)

0.28.0 (2022-10-05)
-------------------

- Make `esequence` right-associative. (#366, @ceastlund)

- Deprecate unused attributes in `Deriving.Generator` (#368, @sim642)

- Remove a pattern match on mutable state in a function argument. (#362, @ceastlund)

- Add code-path manipulation attributes. (#352, @ceastlund)

- Update context-free rules to collect expansion errors generated by ppxlib and
  propagate them to top level without failing. (#358 and #361, @ceastlund)

- Add driver benchmarks (#376, @gridbugs)

0.27.0 (2022-06-14)
-------------------

- Update expansion context to leave out value name when multiple are
  defined at once. (#351, @ceastlund)

- Add support for OCaml 5.0 (#348, @pitag-ha)

- Add `Code_path.enclosing_value` (#349, @ceastlund)

- Add `Code_path.enclosing_module` (#346, @ceastlund)

- Expand code generated by `~enclose_intf` and `~enclose_impl` (#345, @ceastlund)

- Add type annotations to code generated by metaquot (#344, @ceastlund)

- Fix typo in description field of dune-project (#343, @ceastlund)

- Fix Ast_pattern.many (#333, @nojb)

- Fix quoter and optimize identifier quoting (#327, @sim642)

- Driver, when run with `--check`: Allow `toplevel_printer` attributes (#340, @pitag-ha)

- Documentation: Add a section on reporting errors by embedding extension nodes
  in the AST (#318, @panglesd)

- Driver: In the case of ppxlib internal errors, embed those errors instead of
  raising to return a meaningful AST (#329, @panglesd)

- API: For each function that could raise a located error, add a function that
  return a `result` instead (#329, @panglesd)

0.26.0 (2022-03-21)
-------------------

- Bump ppxlib's AST to 4.14/5.00 (#320, @pitag-ha)

0.25.1 (2022-06-17)
-------------------

- Add support for OCaml 5.0 (#355, @pitag-ha)

0.25.0 (2022-03-03)
-------------------

- Added `error_extensionf` function to the `Location` module (#316, @panglesd)

- Ast patterns: add `drop` and `as` patterns (#313 by @Kakadu, review by @pitag-ha)

- Fixed a bug resulting in disscarded rewriters in the presence of
  instrumentations, as well as a wrong order of rewriting (#296, @panglesd)

- Driver: Append the last valid AST to the error in case of located exception
  when embedding errors (#315, @panglesd)

0.24.0 (2021-12-08)
-------------------

- Add support for OCaml 4.14 (#304, @kit-ty-kate)

- Expand nodes before applying derivers or other inline attributes based
  transformation, allowing better interactions between extensions and
  derivers (#279, #297, @NathanReb)

- Add support for registering ppx_import as a pseudo context-free rule (#271, @NathanReb)

- Add `input_name` to the `Expansion_context.Extension` and `Expansion_context.Deriver` modules (#284, @tatchi)

- Improve `gen_symbol` to strip previous unique suffix before adding a new one (#285, @ceastlund)

- Improve `name_type_params_in_td` to use prefixes `a`, `b`, ... instead of `v_x`. (#285, @ceastlund)

- Fix a bug in `type_is_recursive` and `really_recursive` where they would
  consider a type declaration recursive if the type appeared inside an attribute
  payload (#299, @NathanReb)


0.23.0 (2021-08-31)
-------------------

- Drop `Parser` from the API (#263, @pitag-ha)

- `Location`: add `set_filename` and `Error.get_location` (#247, @pitag-ha)

- Drop dependency on OMP2 (#187, @pitag-ha)

- Make OMP1 a conflict (#255, @kit-ty-kate)

- Drop `Syntaxerr` from the public API. Doesn't affect any user in the
  [ppx universe](https://github.com/ocaml-ppx/ppx_universe) (#244, @pitag-ha)

- Add a lower-bound constraint for Sexplib0 (#240, @pitag-ha)

- Fix bug due to which unwanted public binaries got installed when installing
  ppxlib (#223, @pitag-ha)

- Add `Keyword.is_keyword` to check if a string is an OCaml keyword
  (#227, @pitag-ha)

- Remove `Lexer.keyword_table`: use `Keyword.is_keyword` instead
  (#227, @pitag-ha)

- Remove `Lexer` from the API: it was the same as the compiler-libs
  `Lexer` (#228, @pitag-ha)

- Remove the modules `Ast_magic`, `Compiler_version`, `Js`, `Find_version`,
  `Convert`, `Extra_warnings`, `Location_error`, `Select_ast` and
  `Import_for_core` from the API: they are meant for internal use and
  aren't used by any current downstream user in the
  [ppx universe](https://github.com/ocaml-ppx/ppx_universe) (#230, @pitag-ha)

- Remove compiler specific helper functions from `Location`. They aren't used
  by any current downstream user in the
  [ppx universe](https://github.com/ocaml-ppx/ppx_universe) (#238, @pitag-ha)

- Allow "%a" when using Location.Error.createf (#239, @mlasson)

- Fix in `Location`: make `raise_errorf` exception equivalent to exception
  `Error` (#242, @pitag-ha)

- Fix in `Pprintast`: correctly pretty print local type substitutions, e.g.
  type t := ... (#261, @matthewelse)

- Add `Ast_pattern.esequence`, for matching on any number of sequenced
  expressions e.g. `do_a (); do_b (); ...`. (#264, @matthewelse)

- Expose a part of `Ast_io` in order to allow reading AST values from binary
 files (#270, @arozovyk)

0.22.2 (2021-06-23)
-------------------

- Make ppxlib compatible with 4.13 compiler (#260, @kit-ty-kate)

0.22.1 (2021-06-10)
-------------------

- Fix location in parse error reporting (#257, @pitag-ha)

0.21.1 (2021-06-09)
-------------------

- Fix location in parse error reporting (#256, @pitag-ha)

0.22.0 (2021-02-04)
-------------------

- Bump ppxlib's AST to 4.12 (#193, @NathanReb)

0.21.0 (2021-01-22)
-------------------

- Fix ppxlib.traverse declaration and make it a deriver and not a rewriter
  (#213, @NathanReb)
- Driver (important for bucklescript): handling binary AST's, accept any
  supported version as input; preserve that version (#205, @pitag-ha)

- `-as-ppx`: take into account the `-loc-filename` argument (#197, @pitag-ha)

- Add input name to expansion context (#202, @pitag-ha)

- Add Driver.V2: give access to expansion context in whole file transformation
  callbacks of `register_transformation` (#202, @pitag-ha)

- Driver: take `-cookie` argument into account, also when the input is a
  binary AST (@pitag-ha, #209)

- `run_as_ppx_rewriter`: take into account the arguments
  `-loc-filename`, `apply` and `dont-apply` (#205, @pitag-ha)

- Location.Error: add functions `raise` and `update_loc`
  (#205, @pitag-ha)

0.20.0 (2020-11-16)
-------------------

- Expose `Ppxlib.Driver.map_signature` (#194, @kit-ty-kate)

0.19.0 (2020-10-23)
-------------------

- Make ppxlib compatible with 4.12 compiler (#191, @kit-ty-kate)

0.18.0 (2020-10-06)
-------------------

- Bump ppxlib's AST to 4.11 (#180, @NathanReb)

0.17.0 (2020-09-17)
-------------------

- Add accessors for `code_path` and `tool_name` to `Expansion_context.Base`
  (#173, @jberdine)
- Add `cases` methods to traversal classes in `Ast_traverse` (#183, @pitag-ha)

0.16.0 (2020-08-18)
-------------------

- `Driver.register_transformation`: add optional parameter `~instrument`
  (#161, @pitag-ha)
- Add missing `Location.init` (#165, @pitag-ha)
- Upgrade to ocaml-migrate-parsetree.2.0.0 (#164, @ceastlund)

0.15.0 (2020-08-04)
-------------------

- Remove `base` and `stdio` dependencies (#151, @ceastlund)

- Update README and opam description (#155, @jeremiedimino)

- Fix `Driver.partition_transformation` (#156, @NathanReb)

- Implement name mangling for `ppxlib_traverse` (#159, @ceastlund)

0.14.0 (2020-07-08)
-------------------

- Bump ppxlib's AST to 4.10 (#130, @NathanReb)

- Remove omp_config from `Expansion_context` and replace it with `tool_name`
  (#149, @NathanReb)

- Change undocumented `Ppxlib.Driver.map_structure` to return a ppxlib's
  `structure` instead of a `Migrate_parsetree.Driver.some_structure`.
  (#153, @NathanReb)

0.13.0 (2020-04-15)
-------------------

- Add 'metaquot.' prefix to disambiguate metaquote extensions (#121,
  @ceastlund)

- Bump dune language to 1.11 since the cinaps extension requires at
  least Dune 1.11 (#126, @diml)

0.12.0 (2020-01-07)
-------------------

- Support for OCaml 4.10 (#109, @xclerc)

0.11.0 (2020-01-07)
-------------------

- Invariant check on locations (#107, @trefis)

0.10.0 (2019-11-21)
-------------------

- Do not produce a suprious empty correction when deriving_inline
  expands into an extension that undergoes further expansion (#86,
  @aalekseyev)

- Add `Ppxlib.Quoter`. This module allows to generate hygienic code fragments in
  the spirit of ppx_deriving. (#92, @rgrinberg)

- Allow for registering derivers on module type declarations. (#94, fix #83,
  @rgrinberg)

- Fix parsing long idenitifiers. (#98, @NathanReb)

0.9.0
-----

- Bump AST to 4.08 (#80, @xclerc)

0.8.1
-----

### Fixed

- Report errors according to the value of `OCAML_ERROR_STYLE` and
  `OCAML_COLOR` in the standalone driver (#83, @NathanReb)

0.6.0
-----

- Set `Location.input_name` to the original filename when reading a
  binary AST (#.., @diml)

0.5.0
-----

- Add an `(** @inline *)` to the include generated when silencing
  warning 32 (#58, @trefis)

- Add `Ppxlib.mk_named_sig` and `Ppxlib.is_polymorphic_variant` (#57,
  @trefis)

0.4.0
-----

- Do not report errors about dropped or uninterpreted attributes
  starting with `_` (#46, fix #40, @diml)

- Fix he `special_function` rule for dotted operators and allow
  `Longident.parse` to parse dotted operators (#44, @Octachron)

- Port to `dune` and remove use of bash (#45, @rgrinberg)

- Ignore all attribites starting with `_` (#46, @diml)

- Reserve the `reason` and `refmt` namespaces (#46, @diml)

- Reserve the `metaocaml` namespace (#50, @rgrinberg)

- Fix attribute extraction for Otag/Rtag (#51, @xclerc)

- Do not relocate files unless `-loc-filename` is passed (#55, @hhugo)

- Preserve the filename in the output (#56, @hhugo)

0.3.1
-----

- Add `Attribute.declare_with_name_loc` (#33, @diml)

- Let the tool name pass thought when used as a -ppx (#41, @diml)

- Update the AST to 4.06 (#8, @xclerc)

0.3.0
-----

- Update the AST to 4.06 (#8, @xclerc)

- Deprecate old references to type_conv in argument and rewriter names
  and add new ones mentioning deriving instead (#7, #9 @xclerc)

- Fix compatibility with `-safe-string` (#10, @hhugo)

- Restore tests (#11, @xclerc)

- Allow to set the suffix of corrected files (#15, @diml)

- Restore compatibility with OCaml 4.04.x (#16, @xclerc)

0.2.0
-----

- Make sure to import command line arguments registered with
  ocaml-migrate-parsetree (#5, @diml)

- Fix an issue where cookies set from the command line sometimes
  disappeared (#6, @diml)

0.1.0
-----

Initial release.
