Skip to content

Commit 28b5ecb

Browse files
jonludlampanglesd
authored andcommitted
More semi resolving of references
1 parent d031eed commit 28b5ecb

File tree

2 files changed

+89
-47
lines changed

2 files changed

+89
-47
lines changed

src/xref2/errors.ml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,8 @@ module Tools_error = struct
121121
[ `Not_found | `Is_directory | `Wrong_kind of path_kind list * path_kind ]
122122
* Reference.tag_hierarchy
123123
* string list
124-
| `Parent of parent_lookup_error ]
124+
| `Parent of parent_lookup_error
125+
| `Lookup_by_id of Identifier.t ]
125126

126127
type any =
127128
[ simple_type_lookup_error
@@ -252,6 +253,8 @@ module Tools_error = struct
252253
)
253254
| `Path_error (err, tag, path) -> pp_path_error fmt err tag path
254255
| `Parent e -> pp fmt (e :> any)
256+
| `Lookup_by_id id -> Format.fprintf fmt "Couldn't find identifier %s"
257+
(String.concat "." (Identifier.fullname id))
255258
end
256259

257260
type kind = [ `OpaqueModule | `Root of string ]

src/xref2/ref_tools.ml

Lines changed: 85 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -181,8 +181,26 @@ let type_lookup_to_class_signature_lookup =
181181
|> of_option ~error:(`Parent (`Parent_type `OpaqueClass))
182182
>>= resolved p'
183183

184-
module M = struct
185-
(** Module *)
184+
module rec M
185+
: sig
186+
type t = module_lookup_result
187+
188+
val of_component : Env.t -> Component.Module.t -> Cpath.Resolved.module_ -> Resolved.Module.t -> t
189+
190+
val in_signature : Env.t -> signature_lookup_result ->
191+
ModuleName.t ->
192+
(t, Errors.Tools_error.reference_lookup_error) result
193+
194+
val of_element : Env.t -> Component.Element.module_ -> t
195+
196+
val in_env : Env.t -> string -> (t, Errors.Tools_error.reference_lookup_error) result
197+
198+
val in_env_by_id : Env.t -> Identifier.Module.t -> (t, Errors.Tools_error.reference_lookup_error) result
199+
end
200+
201+
=
202+
203+
struct (** Module *)
186204

187205
type t = module_lookup_result
188206

@@ -225,56 +243,37 @@ module M = struct
225243
(`Parent
226244
(`Parent_module (`Lookup_failure_root (ModuleName.make_std name))))
227245

228-
let rec in_env_by_id env id =
246+
let rec in_env_by_id env (id : Identifier.Module.t) =
229247
match Env.lookup_by_id Env.s_module id env with
230248
| Some e -> Ok (of_element env e)
231249
| None -> match id.iv with
232-
| `Module (p, name) ->
250+
| `Module ({ Identifier.iv = #Identifier.Module.t_pv; _} as p, name) ->
233251
in_env_by_id env p >>=
234252
module_lookup_to_signature_lookup env >>=
235253
fun x -> in_signature env x name
236-
| _ -> Error
237-
(`Parent
238-
(`Parent_module (`Lookup_failure_root (ModuleName.make_std (Identifier.name id)))))
239-
end
240-
241-
module Path = struct
242-
(* let first_seg (`Root (s, _) | `Slash (_, s)) = s *)
243-
244-
let mk_lookup_error (tag, path) = Error (`Path_error (`Not_found, tag, path))
245-
246-
let handle_lookup_error p = function
247-
| Ok _ as ok -> ok
248-
| Error `Not_found -> mk_lookup_error p
254+
| `Module ({ Identifier.iv = #Identifier.ModuleType.t_pv; _} as p, name) ->
255+
MT.in_env_by_id env p >>=
256+
module_type_lookup_to_signature_lookup env >>=
257+
fun x -> in_signature env x name
258+
| `Module ({ Identifier.iv = `Result _; _}, _)
259+
| `Parameter (_, _)
260+
| `Root _ -> Error (`Lookup_by_id (id :> Identifier.t))
261+
end and
262+
263+
MT : sig
264+
type t = module_type_lookup_result
249265

250-
let page_in_env env p : page_lookup_result ref_result =
251-
Env.lookup_page_by_path p env |> handle_lookup_error p >>= fun p ->
252-
Ok (`Identifier p.name, p)
266+
val of_element : Env.t -> Component.Element.module_type -> t
253267

254-
let asset_in_env env p : asset_lookup_result ref_result =
255-
Env.lookup_asset_by_path p env |> handle_lookup_error p >>= fun p ->
256-
Ok (`Identifier p.name)
268+
val of_component : Env.t -> Component.ModuleType.t -> Cpath.Resolved.module_type -> Resolved.ModuleType.t -> t
257269

258-
let module_in_env env p : module_lookup_result ref_result =
259-
Env.lookup_unit_by_path p env |> handle_lookup_error p >>= fun m ->
260-
Ok (M.of_element env m)
270+
val in_signature : Env.t -> signature_lookup_result -> ModuleTypeName.t -> (t, Errors.Tools_error.reference_lookup_error) result
271+
272+
val in_env : Env.t -> string -> (t, Errors.Tools_error.reference_lookup_error) result
261273

262-
let any_in_env env p : any_path_lookup_result ref_result =
263-
(* TODO: Resolve modules *)
264-
let page_result = page_in_env env p in
265-
let module_result = module_in_env env p in
266-
match (page_result, module_result) with
267-
| Ok page, Error _ -> Ok (`P page)
268-
| Error _, Ok m ->
269-
module_lookup_to_signature_lookup env m >>= fun s -> Ok (`S s)
270-
| Ok page, Ok _ ->
271-
let name = List.last (snd p) in
272-
ambiguous_generic_ref_warning name [ "module"; "page" ];
273-
Ok (`P page)
274-
| Error _, Error _ -> mk_lookup_error p
275-
end
274+
val in_env_by_id : Env.t -> Identifier.ModuleType.t -> (t, Errors.Tools_error.reference_lookup_error) result
276275

277-
module MT = struct
276+
end = struct
278277
(** Module type *)
279278

280279
type t = module_type_lookup_result
@@ -304,20 +303,60 @@ module MT = struct
304303
env_lookup_by_name Env.s_module_type name env >>= fun e ->
305304
Ok (of_element env e)
306305

307-
let in_env_by_id env id =
306+
let rec in_env_by_id env id =
308307
match Env.lookup_by_id Env.s_module_type id env with
309308
| Some e -> Ok (of_element env e)
310309
| None -> match id.iv with
311-
| `ModuleType (p, name) ->
310+
| `ModuleType ({ Identifier.iv = #Identifier.Module.t_pv; _} as p, name) ->
312311
M.in_env_by_id env p >>=
313312
module_lookup_to_signature_lookup env >>=
314313
fun x -> in_signature env x name
315-
| _ -> Error
316-
(`Parent
317-
(`Parent_module (`Lookup_failure_root (ModuleName.make_std (Identifier.name id)))))
314+
| `ModuleType ({ Identifier.iv = #Identifier.ModuleType.t_pv; _} as p, name) ->
315+
in_env_by_id env p >>=
316+
module_type_lookup_to_signature_lookup env >>=
317+
fun x -> in_signature env x name
318+
| `ModuleType ({ Identifier.iv = `Result _; _}, _) ->
319+
Error (`Lookup_by_id (id :> Identifier.t))
318320

319321
end
320322

323+
module Path = struct
324+
(* let first_seg (`Root (s, _) | `Slash (_, s)) = s *)
325+
326+
let mk_lookup_error (tag, path) = Error (`Path_error (`Not_found, tag, path))
327+
328+
let handle_lookup_error p = function
329+
| Ok _ as ok -> ok
330+
| Error `Not_found -> mk_lookup_error p
331+
332+
let page_in_env env p : page_lookup_result ref_result =
333+
Env.lookup_page_by_path p env |> handle_lookup_error p >>= fun p ->
334+
Ok (`Identifier p.name, p)
335+
336+
let asset_in_env env p : asset_lookup_result ref_result =
337+
Env.lookup_asset_by_path p env |> handle_lookup_error p >>= fun p ->
338+
Ok (`Identifier p.name)
339+
340+
let module_in_env env p : module_lookup_result ref_result =
341+
Env.lookup_unit_by_path p env |> handle_lookup_error p >>= fun m ->
342+
Ok (M.of_element env m)
343+
344+
let any_in_env env p : any_path_lookup_result ref_result =
345+
(* TODO: Resolve modules *)
346+
let page_result = page_in_env env p in
347+
let module_result = module_in_env env p in
348+
match (page_result, module_result) with
349+
| Ok page, Error _ -> Ok (`P page)
350+
| Error _, Ok m ->
351+
module_lookup_to_signature_lookup env m >>= fun s -> Ok (`S s)
352+
| Ok page, Ok _ ->
353+
let name = List.last (snd p) in
354+
ambiguous_generic_ref_warning name [ "module"; "page" ];
355+
Ok (`P page)
356+
| Error _, Error _ -> mk_lookup_error p
357+
end
358+
359+
321360
module CL = struct
322361
(** Class *)
323362

0 commit comments

Comments
 (0)