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
115
116
117
118
119
120
121
122
123
124
125
open StdLabels
type t =
[
`Integer_overflow
| `Missing_debug_event
| `Missing_cmi
| `Effect_handlers_without_effect_backend
|
`Missing_primitive
| `Missing_define
| `Missing_deps
| `Deprecated_joo_global_object
| `Overriding_primitive
| `Overriding_primitive_purity
| `Deprecated_primitive
| `Unused_js_variable
| `Free_variables_in_primitive
]
module StringTable = Hashtbl.Make (struct
type t = string
let equal = String.equal
let hash = Hashtbl.hash
end)
module Table = Hashtbl.Make (struct
type nonrec t = t
let hash = Hashtbl.hash
let equal (a : t) b = a = b
end)
let state = Table.create 0
let enable t = Table.add state t true
let disable t = Table.add state t false
let default = function
| `Integer_overflow | `Missing_debug_event | `Missing_cmi -> true
| `Effect_handlers_without_effect_backend -> true
| `Missing_primitive | `Missing_define | `Missing_deps | `Free_variables_in_primitive ->
true
| `Deprecated_joo_global_object -> true
| `Overriding_primitive | `Overriding_primitive_purity -> true
| `Deprecated_primitive -> true
| `Unused_js_variable -> false
let all =
[
`Integer_overflow
; `Missing_debug_event
; `Missing_cmi
; `Effect_handlers_without_effect_backend
;
`Missing_primitive
; `Missing_define
; `Missing_deps
; `Deprecated_joo_global_object
; `Overriding_primitive
; `Overriding_primitive_purity
; `Deprecated_primitive
; `Unused_js_variable
; `Free_variables_in_primitive
]
let name = function
| `Integer_overflow -> "integer-overflow"
| `Missing_debug_event -> "missing-debug-event"
| `Missing_cmi -> "missing-cmi"
| `Effect_handlers_without_effect_backend -> "missing-effects-backend"
| `Missing_primitive -> "missing-primitive"
| `Missing_define -> "missing-define"
| `Missing_deps -> "missing-deps"
| `Free_variables_in_primitive -> "free-variables"
| `Deprecated_joo_global_object -> "deprecated-joo-global-object"
| `Overriding_primitive -> "overriding-primitive"
| `Overriding_primitive_purity -> "overriding-primitive-purity"
| `Deprecated_primitive -> "deprecated-primitive"
| `Unused_js_variable -> "unused-js-vars"
let parse : string -> t option =
let h = StringTable.create 18 in
List.iter all ~f:(fun t ->
let name = name t in
assert (not (String.starts_with ~prefix:"no-" name));
StringTable.add h name t);
fun s -> StringTable.find_opt h s
let enabled t =
match Table.find_opt state t with
| Some b -> b
| None -> default t
let quiet = ref false
let werror = ref false
let warnings = ref 0
let warn (t : t) fmt =
Format.kasprintf
(fun s ->
if enabled t && not !quiet
then (
incr warnings;
Format.eprintf "Warning%s: %s%!" (Printf.sprintf " [%s]" (name t)) s))
fmt
let process_warnings () =
if !warnings > 0 && !werror
then (
Format.eprintf "%s: all warnings being treated as errors@." Sys.argv.(0);
exit 1)