File: run.t

package info (click to toggle)
ppxlib 0.37.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 4,804 kB
  • sloc: ml: 66,587; sh: 103; makefile: 40; python: 36
file content (114 lines) | stat: -rw-r--r-- 4,606 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
Most errors happening during ppxlib rewriting process are ultimately turned into
error extension nodes.

Undefined derivers are turned into error nodes

  $ echo "type t = int [@@deriving undefined]" >> undefined_deriver.ml
  $ ./deriver.exe undefined_deriver.ml
  type t = int[@@deriving undefined]
  include
    struct
      let _ = fun (_ : t) -> ()
      [%%ocaml.error
        "Ppxlib.Deriving: 'undefined' is not a supported type deriving generator"]
    end[@@ocaml.doc "@inline"][@@merlin.hide ]

Error nodes are generated when parsing of payload fails.

export_string expects only one argument, a string, and output it.
Anything else will embed an error extension node

  $ echo "let _ = [%export_string \"string\"]" > parsing_payload_extension.ml
  $ echo "let _ = [%export_string \"string\" \"other\"]" >> parsing_payload_extension.ml
  $ echo "let _ = [%export_string identifier]" >> parsing_payload_extension.ml
  $ ./extender.exe parsing_payload_extension.ml
  [%%ocaml.error "constant expected"]
  [%%ocaml.error "constant expected"]
  let _ = "string"
  let _ = [%export_string "string" "other"]
  let _ = [%export_string identifier]

  $ echo "type a = int [@@deriving a_string]" > parsing_payload_deriver.ml
  $ echo "type b = int [@@deriving a_string unexpected_args]" >> parsing_payload_deriver.ml
  $ ./deriver.exe parsing_payload_deriver.ml
  type a = int[@@deriving a_string]
  include struct let _ = fun (_ : a) -> ()
                 let _ = "derived_string" end[@@ocaml.doc "@inline"][@@merlin.hide
                                                                      ]
  type b = int[@@deriving a_string unexpected_args]
  include
    struct
      let _ = fun (_ : b) -> ()
      [%%ocaml.error
        "Ppxlib.Deriving: non-optional labelled argument or record expected"]
    end[@@ocaml.doc "@inline"][@@merlin.hide ]

Error nodes are generated when dependent derivers are not applied.

  $ echo "type a = int [@@deriving a_dependent_string]" > dependent_derivers.ml
  $ ./deriver.exe dependent_derivers.ml
  type a = int[@@deriving a_dependent_string]
  include
    struct
      let _ = fun (_ : a) -> ()
      [%%ocaml.error
        "Deriver a_string is needed for a_dependent_string, you need to add it before in the list"]
      let _ = "derived_string"
    end[@@ocaml.doc "@inline"][@@merlin.hide ]
  $ echo "type b = int [@@deriving a_dependent_string, a_string]" > dependent_derivers.ml
  $ ./deriver.exe dependent_derivers.ml
  type b = int[@@deriving (a_dependent_string, a_string)]
  include
    struct
      let _ = fun (_ : b) -> ()
      [%%ocaml.error
        "Deriver a_string is needed for a_dependent_string, you need to add it before in the list"]
      let _ = "derived_string"
      let _ = "derived_string"
    end[@@ocaml.doc "@inline"][@@merlin.hide ]
  $ echo "type b = int [@@deriving a_string, a_dependent_string]" > dependent_derivers.ml
  $ ./deriver.exe dependent_derivers.ml
  type b = int[@@deriving (a_string, a_dependent_string)]
  include
    struct
      let _ = fun (_ : b) -> ()
      let _ = "derived_string"
      let _ = "derived_string"
    end[@@ocaml.doc "@inline"][@@merlin.hide ]

Flag `-raise-embedded-errors` raises the first embedded error in the AST.

  $ echo "let () = ()" > embedded_error.ml
  $ echo "module T = struct [%%ocaml.error \"error 1\"] end" >> embedded_error.ml
  $ echo "[%%ocaml.error \"error 2\"]" >> embedded_error.ml
  $ ./extender.exe embedded_error.ml -raise-embedded-errors
  File "embedded_error.ml", line 2, characters 21-32:
  2 | module T = struct [%%ocaml.error "error 1"] end
                           ^^^^^^^^^^^
  Error: error 1
  [1]

Undeprecated `[@@@deriving.end]` runs just fine.

  $ echo "type t [@@deriving_inline a_string] [@@@deriving.end]" > embedded_error.ml
  $ ./deriver.exe embedded_error.ml -diff-cmd "diff -u --label source --label derived"
  type t[@@deriving_inline a_string]
  [@@@deriving.end ]
  --- source
  +++ derived
  @@ -1 +1,4 @@
  -type t [@@deriving_inline a_string] [@@@deriving.end]
  +type t [@@deriving_inline a_string] 
  +let _ = fun (_ : t) -> ()
  +let _ = "derived_string"
  +[@@@deriving.end]
  [1]

Deprecated `[@@@deriving.end]` produces an error.

  $ echo "type t [@@deriving_inline a_string] [@@@deriving.end]" > embedded_error.ml
  $ ./deriver.exe embedded_error.ml -allow-deriving-end false
  [%%ocaml.error
    "ppxlib: [@@@deriving.end] is deprecated, please use [@@@ppxlib.inline.end]. If you need the deprecated attribute temporarily, pass [-allow-deriving-end] to the ppx driver)."]
  type t[@@deriving_inline a_string]
  [@@@deriving.end ]