Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions test/encoding/properly-ignored-by-checks-and-traversal/dune
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
(executable
(name id_driver)
(modules id_driver)
(libraries ppxlib))

(executable
(name traversal_driver)
(modules traversal_driver)
(libraries ppxlib))

(cram
(package ppxlib)
(enabled_if
(>= %{ocaml_version} 5.4))
(deps id_driver.exe traversal_driver.exe))
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
let () = Ppxlib.Driver.standalone ()
33 changes: 33 additions & 0 deletions test/encoding/properly-ignored-by-checks-and-traversal/run.t
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
Encodings generated by migrations should not be treated as regular nodes in a few
specific places.

Let's consider the following bit of code:

$ cat > test.ml << EOF
> let x = (~a:1, ~b:2)
> let y = [%some_ext 4]
> EOF

Once migrated to our AST, this will contain two extension points, the
`[%some_ext 4]` from the source code, and the encoded labeled tuple.

The former should trigger the extension check while the latter should not:

$ ./id_driver.exe -check -check-on-extensions test.ml
[%%ocaml.error "Extension `some_ext' was not translated"]
let x =
[%ppxlib.migration.pexp_labeled_tuple_5_4
(((`Some `a), 1), ((`Some `b), 2))]
let y = [%some_ext 4]


The following driver has a global transformation registered that turns all
integer litterals `i` into the litteral `i+1`.
By default traversal classes should not recurse into encodings' payload:

$ ./traversal_driver.exe test.ml
let x =
[%ppxlib.migration.pexp_labeled_tuple_5_4
(((`Some `a), 2), ((`Some `b), 3))]
let y = [%some_ext 5]

Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
open Ppxlib

let plus_one_str str =
let i = int_of_string str in
string_of_int (i + 1)

let t =
object
inherit Ast_traverse.map as super

method! expression_desc ed =
match ed with
| Pexp_constant (Pconst_integer (s, None)) ->
Pexp_constant (Pconst_integer (plus_one_str s, None))
| _ -> super#expression_desc ed
end

let impl str = t#structure str

let () =
Driver.register_transformation ~impl "ppx_plus_one";
Driver.standalone ()
Loading