Skip to content

Move PPX to 5.2 AST - #36

Merged
xguerin merged 1 commit into
xguerin:masterfrom
patricoferris:5.2-ast-bump
Aug 11, 2025
Merged

Move PPX to 5.2 AST#36
xguerin merged 1 commit into
xguerin:masterfrom
patricoferris:5.2-ast-bump

Conversation

@patricoferris

Copy link
Copy Markdown
Contributor

This PR is a patch for an upcoming release of ppxlib where the internal AST is bumped from 4.14 to 5.2. Until that is merged and released, there is no reason to merge this PR.

Note in these changes that I'm not entirely sure of the correctness of the process_expr_loc which now must do all of the parameters that may appear in the function.

To test these changes, you can use the following opam-based workflow. I've made releases of most of these patches to an opam-repository overlay.

opam switch create ppxlib-bump --repos=ppxlib=git+https://github.com/patricoferris/opam-repository#5.2-ast-bump
opam install <your-package>

The following describes the most notable changes to the AST.

Note: no update has been made of the opam file, but ppxlib will likely need a lower-bound before merging/releasing.

Functions


Currently

In the parsetree currently, functions like:

fun x y z -> ...

Are represented roughly as

Pexp_fun(x, Pexp_fun (y, Pexp_fun(z, ...)))

Functions like:

function A -> ... | B -> ...

Are represented roughly as

Pexp_function ([ case A; case B ])

Since 5.2

All of these functions now map to a single AST node Pexp_function (note, this is the same name as the old cases function). The first argument is a list of parameters meaning:

fun x y z -> ...

Now looks like:

Pexp_function([x; y; z], _constraint, body)

And the body is where we can either have more expressions (Pfunction_body _) or cases (Pfunction_cases _). That means:

function A -> ... | B -> ...

Has an empty list of parameters:

Pexp_function([], _, Pfunction_cases ([case A; case B]))

Local Module Opens for Types

Another feature added in 5.2 was the ability to locally open modules in type definitions.

module M = struct
  type t = A | B | C
end

type t = Local_open_coming of M.(t)

This has a Ptyp_open (module_identifier, core_type) AST node. Just like normal module opens this does create some syntactic ambiguity about where things come from inside the parentheses.

@xguerin

xguerin commented Nov 26, 2024

Copy link
Copy Markdown
Owner

Thank you for that. I'll take a look shortly.

@kit-ty-kate

Copy link
Copy Markdown
Contributor

@xguerin sorry to bother you. Do you have any news on that?

@xguerin

xguerin commented Aug 11, 2025

Copy link
Copy Markdown
Owner

Sorry for the delay. The PR looks good. I'll push a new release.

@xguerin xguerin changed the title Prepare for 5.2 AST bump Move PPX to 5.2 AST Aug 11, 2025
@xguerin
xguerin merged commit da1d24a into xguerin:master Aug 11, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants