@@ -936,6 +936,17 @@ let map_binding ~config ~empty_loc ~pstr_loc ~file_name ~rec_flag binding =
936
936
new_binding )
937
937
else (None , binding, None )
938
938
939
+ let rec collect_prop_types types ({ptyp_loc; ptyp_desc} as full_type ) =
940
+ match ptyp_desc with
941
+ | Ptyp_arrow {arg; ret = {ptyp_desc = Ptyp_arrow _} as rest}
942
+ when is_labelled arg.lbl || is_optional arg.lbl ->
943
+ collect_prop_types ((arg.lbl, arg.attrs, ptyp_loc, arg.typ) :: types) rest
944
+ | Ptyp_arrow {arg = {lbl = Nolabel } ; ret} -> collect_prop_types types ret
945
+ | Ptyp_arrow {arg; ret = return_value}
946
+ when is_labelled arg.lbl || is_optional arg.lbl ->
947
+ (return_value, (arg.lbl, arg.attrs, return_value.ptyp_loc, arg.typ) :: types)
948
+ | _ -> (full_type, types)
949
+
939
950
let transform_structure_item ~config item =
940
951
match item with
941
952
(* external *)
@@ -968,19 +979,7 @@ let transform_structure_item ~config item =
968
979
|> Option. map Jsx_common. typ_vars_of_core_type
969
980
|> Option. value ~default: []
970
981
in
971
- let rec get_prop_types types ({ptyp_loc; ptyp_desc} as full_type ) =
972
- match ptyp_desc with
973
- | Ptyp_arrow {arg; ret = {ptyp_desc = Ptyp_arrow _} as typ2}
974
- when is_labelled arg.lbl || is_optional arg.lbl ->
975
- get_prop_types ((arg.lbl, arg.attrs, ptyp_loc, arg.typ) :: types) typ2
976
- | Ptyp_arrow {arg = {lbl = Nolabel } ; ret} -> get_prop_types types ret
977
- | Ptyp_arrow {arg; ret = return_value}
978
- when is_labelled arg.lbl || is_optional arg.lbl ->
979
- ( return_value,
980
- (arg.lbl, arg.attrs, return_value.ptyp_loc, arg.typ) :: types )
981
- | _ -> (full_type, types)
982
- in
983
- let _, prop_types = get_prop_types [] pval_type in
982
+ let _, prop_types = collect_prop_types [] pval_type in
984
983
let named_type_list = List. fold_left arg_to_concrete_type [] prop_types in
985
984
let ret_props_type =
986
985
Typ. constr ~loc: pstr_loc
@@ -1069,30 +1068,7 @@ let transform_signature_item ~config item =
1069
1068
|> Option. map Jsx_common. typ_vars_of_core_type
1070
1069
|> Option. value ~default: []
1071
1070
in
1072
- let rec get_prop_types types ({ptyp_loc; ptyp_desc} as full_type ) =
1073
- match ptyp_desc with
1074
- | Ptyp_arrow {arg; ret = {ptyp_desc = Ptyp_arrow _} as rest}
1075
- when is_optional arg.lbl || is_labelled arg.lbl ->
1076
- get_prop_types ((arg.lbl, arg.attrs, ptyp_loc, arg.typ) :: types) rest
1077
- | Ptyp_arrow
1078
- {
1079
- arg =
1080
- {
1081
- lbl = Nolabel ;
1082
- typ = {ptyp_desc = Ptyp_constr ({txt = Lident " unit" }, _)};
1083
- };
1084
- ret = rest;
1085
- } ->
1086
- get_prop_types types rest
1087
- | Ptyp_arrow {arg = {lbl = Nolabel } ; ret = rest } ->
1088
- get_prop_types types rest
1089
- | Ptyp_arrow {arg; ret = return_value}
1090
- when is_optional arg.lbl || is_labelled arg.lbl ->
1091
- ( return_value,
1092
- (arg.lbl, arg.attrs, return_value.ptyp_loc, arg.typ) :: types )
1093
- | _ -> (full_type, types)
1094
- in
1095
- let _, prop_types = get_prop_types [] pval_type in
1071
+ let _, prop_types = collect_prop_types [] pval_type in
1096
1072
let named_type_list = List. fold_left arg_to_concrete_type [] prop_types in
1097
1073
let ret_props_type =
1098
1074
Typ. constr
0 commit comments