diff --git a/test/encoding/properly-ignored-by-checks-and-traversal/dune b/test/encoding/properly-ignored-by-checks-and-traversal/dune new file mode 100644 index 00000000..94f60b43 --- /dev/null +++ b/test/encoding/properly-ignored-by-checks-and-traversal/dune @@ -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)) diff --git a/test/encoding/properly-ignored-by-checks-and-traversal/id_driver.ml b/test/encoding/properly-ignored-by-checks-and-traversal/id_driver.ml new file mode 100644 index 00000000..e3cba404 --- /dev/null +++ b/test/encoding/properly-ignored-by-checks-and-traversal/id_driver.ml @@ -0,0 +1 @@ +let () = Ppxlib.Driver.standalone () diff --git a/test/encoding/properly-ignored-by-checks-and-traversal/run.t b/test/encoding/properly-ignored-by-checks-and-traversal/run.t new file mode 100644 index 00000000..251a560c --- /dev/null +++ b/test/encoding/properly-ignored-by-checks-and-traversal/run.t @@ -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] + diff --git a/test/encoding/properly-ignored-by-checks-and-traversal/traversal_driver.ml b/test/encoding/properly-ignored-by-checks-and-traversal/traversal_driver.ml new file mode 100644 index 00000000..c398422a --- /dev/null +++ b/test/encoding/properly-ignored-by-checks-and-traversal/traversal_driver.ml @@ -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 ()