Skip to content

Commit 4c03cf3

Browse files
Julowjonludlam
authored andcommitted
Refactor Ident_env.extract_signature_type_items
This separates the item extraction from the handling of visibility and of the 'hidden' flag.
1 parent 289ff72 commit 4c03cf3

File tree

1 file changed

+69
-37
lines changed

1 file changed

+69
-37
lines changed

src/loader/ident_env.cppo.ml

Lines changed: 69 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -83,10 +83,34 @@ type items =
8383
| `Include of item list
8484
]
8585

86+
let extract_visibility =
87+
let open Compat in
88+
function
89+
| Sig_type (_, _, _, vis)
90+
| Sig_module (_, _, _, _, vis)
91+
| Sig_modtype (_, _, vis)
92+
| Sig_value (_, _, vis)
93+
| Sig_class (_, _, _, vis)
94+
| Sig_class_type (_, _, _, vis)
95+
| Sig_typext (_, _, _, vis) ->
96+
vis
97+
8698
let rec extract_signature_type_items vis items =
8799
let open Compat in
88-
match items with
89-
| Sig_type(id, td, _, vis') :: rest when vis=vis' ->
100+
match items with
101+
| item :: rest ->
102+
let vis' = extract_visibility item in
103+
if vis = vis' then
104+
let hidden = vis' = Hidden in
105+
extract_signature_type_items_extract vis ~hidden item rest
106+
else
107+
extract_signature_type_items_skip vis item rest
108+
| [] -> []
109+
110+
and extract_signature_type_items_extract vis ~hidden item rest =
111+
let open Compat in
112+
match item, rest with
113+
| Sig_type(id, td, _, _), _ ->
90114
if Btype.is_row_name (Ident.name id)
91115
then extract_signature_type_items vis rest
92116
else
@@ -104,56 +128,64 @@ let rec extract_signature_type_items vis items =
104128
#endif
105129
List.map (fun c -> `Constructor (c.Types.cd_id, id, Some c.cd_loc)) cstrs
106130
| Type_open -> [] in
107-
`Type (id, vis'=Hidden, None) :: constrs @ extract_signature_type_items vis rest
131+
`Type (id, hidden, None) :: constrs @ extract_signature_type_items vis rest
132+
133+
| Sig_module(id, _, _, _, _), _ ->
134+
`Module (id, hidden, None) :: extract_signature_type_items vis rest
108135

109-
| Sig_module(id, _, _, _, vis') :: rest when vis=vis' ->
110-
`Module (id, vis'=Hidden, None) :: extract_signature_type_items vis rest
136+
| Sig_modtype(id, _, _), _ ->
137+
`ModuleType (id, hidden, None) :: extract_signature_type_items vis rest
111138

112-
| Sig_modtype(id, _, vis') :: rest when vis=vis' ->
113-
`ModuleType (id, vis'=Hidden, None) :: extract_signature_type_items vis rest
114-
115-
| Sig_value(id, _, vis') :: rest when vis=vis' ->
116-
`Value (id, vis'=Hidden, None) :: extract_signature_type_items vis rest
139+
| Sig_value(id, _, _), _ ->
140+
`Value (id, hidden, None) :: extract_signature_type_items vis rest
117141
#if OCAML_VERSION < (5,1,0)
118-
| Sig_class(id, _, _, vis') :: Sig_class_type(ty_id, _, _, _)
119-
:: Sig_type(obj_id, _, _, _) :: Sig_type(cl_id, _, _, _) :: rest when vis=vis' ->
120-
`Class (id, ty_id, obj_id, Some cl_id, vis'=Hidden, None) :: extract_signature_type_items vis rest
142+
| Sig_class(id, _, _, _),
143+
Sig_class_type(ty_id, _, _, _)
144+
:: Sig_type(obj_id, _, _, _)
145+
:: Sig_type(cl_id, _, _, _) :: _ ->
146+
`Class (id, ty_id, obj_id, Some cl_id, hidden, None)
147+
:: extract_signature_type_items vis rest
121148

122-
| Sig_class_type(id, _, _, vis') :: Sig_type(obj_id, _, _, _)
123-
:: Sig_type(cl_id, _, _, _) :: rest when vis=vis' ->
124-
`ClassType (id, obj_id, Some cl_id, vis'=Hidden, None) :: extract_signature_type_items vis rest
149+
| Sig_class_type(id, _, _, _),
150+
Sig_type(obj_id, _, _, _) :: Sig_type(cl_id, _, _, _) :: _ ->
151+
`ClassType (id, obj_id, Some cl_id, hidden, None)
152+
:: extract_signature_type_items vis rest
125153
#else
126-
| Sig_class(id, _, _, vis') :: Sig_class_type(ty_id, _, _, _)
127-
:: Sig_type(obj_id, _, _, _) :: rest when vis=vis' ->
128-
`Class (id, ty_id, obj_id, None, vis'=Hidden, None) :: extract_signature_type_items vis rest
154+
| Sig_class(id, _, _, _),
155+
Sig_class_type(ty_id, _, _, _) :: Sig_type(obj_id, _, _, _) :: _ ->
156+
`Class (id, ty_id, obj_id, None, hidden, None)
157+
:: extract_signature_type_items vis rest
129158

130-
| Sig_class_type(id, _, _, vis') :: Sig_type(obj_id, _, _, _) :: rest when vis=vis' ->
131-
`ClassType (id, obj_id, None, vis'=Hidden, None) :: extract_signature_type_items vis rest
159+
| Sig_class_type(id, _, _, _), Sig_type(obj_id, _, _, _) :: _ ->
160+
`ClassType (id, obj_id, None, hidden, None)
161+
:: extract_signature_type_items vis rest
132162
#endif
133163

134-
| Sig_typext (id, constr, Text_exception, vis') :: rest when vis=vis' ->
164+
| Sig_typext (id, constr, Text_exception, _), _ ->
135165
`Exception (id, Some constr.ext_loc)
136166
:: extract_signature_type_items vis rest
137167

138-
| Sig_typext (id, constr, _, vis') :: rest when vis=vis'->
168+
| Sig_typext (id, constr, _, _), _ ->
139169
`Extension (id, Some constr.ext_loc)
140170
:: extract_signature_type_items vis rest
141171

142-
| Sig_class_type(_, _, _, _) :: Sig_type(_, _, _, _)
143-
:: Sig_type(_, _, _, _) :: rest
144-
| Sig_class(_, _, _, _) :: Sig_class_type(_, _, _, _)
145-
:: Sig_type(_, _, _, _) :: Sig_type(_, _, _, _) :: rest
146-
| Sig_typext (_,_,_,_) :: rest
147-
| Sig_modtype(_, _, _) :: rest
148-
| Sig_module(_, _, _, _, _) :: rest
149-
| Sig_type(_, _, _, _) :: rest
150-
| Sig_value (_, _, _) :: rest ->
151-
extract_signature_type_items vis rest
172+
| Sig_class _, _
173+
| Sig_class_type _, _ -> assert false
152174

153-
| Sig_class _ :: _
154-
| Sig_class_type _ :: _ -> assert false
155-
156-
| [] -> []
175+
and extract_signature_type_items_skip vis item rest =
176+
let open Compat in
177+
match item, rest with
178+
| Sig_class_type _, Sig_type _ :: Sig_type _ :: rest
179+
| Sig_class _, Sig_class_type _ :: Sig_type _ :: Sig_type _ :: rest
180+
| Sig_typext _, rest
181+
| Sig_modtype _, rest
182+
| Sig_module _, rest
183+
| Sig_type _, rest
184+
| Sig_value _, rest ->
185+
extract_signature_type_items vis rest
186+
187+
| Sig_class _, _
188+
| Sig_class_type _, _ -> assert false
157189

158190
#if OCAML_VERSION >= (4,8,0)
159191

0 commit comments

Comments
 (0)