@@ -7,44 +7,33 @@ let check_constructors (constructors : Types.constructor_declaration list) check
7
7
check c.cd_args (Ast_untagged_variants. process_tag_type c.cd_attributes))
8
8
constructors
9
9
10
- let can_coerce_to_string (constructors : Types.constructor_declaration list ) =
11
- check_constructors constructors (fun args payload ->
12
- match (args, payload) with
13
- | Cstr_tuple [] , (None | Some (String _ )) -> true
14
- | _ -> false )
15
-
16
- let can_coerce_to_int (constructors : Types.constructor_declaration list ) =
17
- check_constructors constructors (fun args payload ->
18
- match (args, payload) with
19
- | Cstr_tuple [] , Some (Int _ ) -> true
20
- | _ -> false )
21
-
22
- let can_coerce_to_float (constructors : Types.constructor_declaration list ) =
23
- check_constructors constructors (fun args payload ->
24
- match (args, payload) with
25
- | Cstr_tuple [] , Some (Float _ ) -> true
26
- | _ -> false )
27
-
10
+ (* Right now we only allow coercing to primitives string/int/float *)
28
11
let can_coerce_path (path : Path.t ) =
29
12
Path. same path Predef. path_string
30
13
|| Path. same path Predef. path_int
31
14
|| Path. same path Predef. path_float
32
15
33
16
let can_coerce_variant ~(path : Path.t )
34
17
(constructors : Types.constructor_declaration list ) =
35
- if Path. same path Predef. path_string && can_coerce_to_string constructors then
36
- true
37
- else if Path. same path Predef. path_int && can_coerce_to_int constructors then
38
- true
39
- else if Path. same path Predef. path_float && can_coerce_to_float constructors
40
- then true
41
- else false
18
+ constructors
19
+ |> List. for_all (fun (c : Types.constructor_declaration ) ->
20
+ let args = c.cd_args in
21
+ let payload = Ast_untagged_variants. process_tag_type c.cd_attributes in
22
+ match args with
23
+ | Cstr_tuple [] -> (
24
+ match payload with
25
+ | None | Some (String _ ) -> Path. same path Predef. path_string
26
+ | Some (Int _ ) -> Path. same path Predef. path_int
27
+ | Some (Float _ ) -> Path. same path Predef. path_float
28
+ | Some (Null | Undefined | Bool _ | Untagged _ ) -> false )
29
+ | _ -> false )
42
30
43
31
let can_try_coerce_variant_to_primitive
44
32
((_ , p , typedecl ) : Path. t * Path. t * Types. type_declaration ) =
45
33
match typedecl with
46
34
| {type_kind = Type_variant constructors; type_params = [] }
47
35
when Path. name p <> " bool" ->
36
+ (* bool is represented as a variant internally, so we need to account for that *)
48
37
Some constructors
49
38
| _ -> None
50
39
0 commit comments