Source file library__modes.ml
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
module Ordered_set = struct
type t = Dune.Compilation_mode.t Dunolinter.Ordered_set.t [@@deriving sexp_of]
end
type t = { mutable modes : Ordered_set.t } [@@deriving sexp_of]
let field_name = "modes"
module Handler =
Dunolinter.Sexp_handler.Make_sexpable_ordered_set
(struct
let field_name = field_name
end)
(Dune.Compilation_mode)
let create ~modes = { modes }
let modes t = t.modes
let set_modes t ~modes = t.modes <- modes
let read ~sexps_rewriter ~field =
let modes = Handler.read ~sexps_rewriter ~field in
{ modes = Dunolinter.Ordered_set.canonical_sort (module Dune.Compilation_mode) modes }
;;
let write t = Handler.write t.modes
let rewrite t ~sexps_rewriter ~field = Handler.rewrite t.modes ~sexps_rewriter ~field
type predicate = Dune.Library.Modes.Predicate.t
let has_mode t ~mode =
match
Dunolinter.Ordered_set.mem
(module Dune.Compilation_mode)
t.modes
mode
~evaluator:Dunolinter.Ordered_set.Evaluator.static
with
| Known true -> true
| Known false | Unknown -> false
;;
let eval t ~predicate =
match (predicate : predicate) with
| `mem modes | `has_modes modes ->
Dunolint.Trilang.const (List.for_all modes ~f:(fun mode -> has_mode t ~mode))
| `has_mode mode -> Dunolint.Trilang.const (has_mode t ~mode)
;;
let insert_mode t ~mode =
match
Dunolinter.Ordered_set.mem
(module Dune.Compilation_mode)
t.modes
mode
~evaluator:Dunolinter.Ordered_set.Evaluator.static
with
| Known true -> ()
| Known false | Unknown ->
t.modes <- Dunolinter.Ordered_set.insert (module Dune.Compilation_mode) t.modes mode
;;
let remove_mode t ~mode =
match
Dunolinter.Ordered_set.mem
(module Dune.Compilation_mode)
t.modes
mode
~evaluator:Dunolinter.Ordered_set.Evaluator.static
with
| Known false -> ()
| Known true | Unknown ->
t.modes <- Dunolinter.Ordered_set.remove (module Dune.Compilation_mode) t.modes mode
;;
let enforce =
Dunolinter.Linter.enforce
(module Dune.Library.Modes.Predicate)
~eval
~enforce:(fun t predicate ->
match predicate with
| T (`mem modes) | T (`has_modes modes) ->
List.iter modes ~f:(fun mode -> insert_mode t ~mode);
Ok
| T (`has_mode mode) ->
insert_mode t ~mode;
Ok
| Not (`mem modes) | Not (`has_modes modes) ->
List.iter modes ~f:(fun mode -> remove_mode t ~mode);
Ok
| Not (`has_mode mode) ->
remove_mode t ~mode;
Ok)
;;