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
type t = { pps : Pps.t } [@@deriving sexp_of]
let create ?pps () =
{ pps =
(match pps with
| Some pps -> pps
| None -> Pps.create ~args:[])
}
;;
let field_name = "lint"
let read ~sexps_rewriter ~field =
let args = Dunolinter.Sexp_handler.get_args ~field_name ~sexps_rewriter ~field in
match args with
| [ (List (Atom "pps" :: _) as field) ] ->
let pps = Pps.read ~sexps_rewriter ~field in
{ pps }
| _ ->
let loc = Sexps_rewriter.loc sexps_rewriter field in
Err.raise
~loc
Pp.O.
[ Pp.text "Unexpected "
++ Pp_tty.kwd (module String) "lint"
++ Pp.text " field value."
]
;;
let write (t : t) = Sexp.List [ Atom field_name; Pps.write t.pps ]
let rewrite t ~sexps_rewriter ~field =
let args = Dunolinter.Sexp_handler.get_args ~field_name ~sexps_rewriter ~field in
match args with
| [ (List (Atom "pps" :: _) as field) ] -> Pps.rewrite t.pps ~sexps_rewriter ~field
| _ ->
let loc = Sexps_rewriter.loc sexps_rewriter field in
Err.raise
~loc
Pp.O.
[ Pp.text "Unexpected "
++ Pp_tty.kwd (module String) "lint"
++ Pp.text " field value."
]
;;
type predicate = Dune.Lint.Predicate.t
let eval t ~predicate =
match (predicate : predicate) with
| `pps condition ->
Dunolint.Trilang.eval condition ~f:(fun predicate -> Pps.eval t.pps ~predicate)
;;
let enforce =
Dunolinter.Linter.enforce
(module Dune.Lint.Predicate)
~eval
~enforce:(fun t predicate ->
match predicate with
| Not (`pps _) -> Eval
| T (`pps condition) ->
Pps.enforce t.pps ~condition;
Ok)
;;