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
# 3 "src/loader/local_jmp.ml"
open Odoc_model.Lang.Source_info
let pos_of_loc loc = (loc.Location.loc_start.pos_cnum, loc.loc_end.pos_cnum)
let ( let= ) m f = match m with Some x -> f x | None -> ()
module Local_analysis = struct
let expr poses expr =
match expr with
| { Typedtree.exp_desc = Texp_ident (Pident id, _, _); exp_loc; _ }
when not exp_loc.loc_ghost ->
let anchor = Ident.unique_name id in
poses := (Occurence { anchor }, pos_of_loc exp_loc) :: !poses
| _ -> ()
let pat poses (type a) : a Typedtree.general_pattern -> unit = function
| {
pat_desc = Tpat_var (id, _stringloc) | Tpat_alias (_, id, _stringloc);
pat_loc;
_;
}
when not pat_loc.loc_ghost ->
let uniq = Ident.unique_name id in
poses := (Def uniq, pos_of_loc pat_loc) :: !poses
| _ -> ()
end
module Global_analysis = struct
let anchor_of_uid uid =
match Uid.unpack_uid (Uid.of_shape_uid uid) with
| Some (_, Some id) -> Some (Uid.anchor_of_id id)
| _ -> None
(** Generate the anchors that will be pointed to by [lookup_def]. *)
let init poses uid_to_loc =
Shape.Uid.Tbl.iter
(fun uid t ->
let= s = anchor_of_uid uid in
poses := (Def s, pos_of_loc t) :: !poses)
uid_to_loc
let expr poses uid_to_loc expr =
match expr with
| { Typedtree.exp_desc = Texp_ident (_, _, value_description); exp_loc; _ }
->
let= _ = Shape.Uid.Tbl.find_opt uid_to_loc value_description.val_uid in
let= anchor = anchor_of_uid value_description.val_uid in
poses := (Occurence { anchor }, pos_of_loc exp_loc) :: !poses
| _ -> ()
end
let of_cmt (cmt : Cmt_format.cmt_infos) =
let ttree = cmt.cmt_annots in
match ttree with
| Cmt_format.Implementation structure ->
let uid_to_loc = cmt.cmt_uid_to_loc in
let poses = ref [] in
Global_analysis.init poses uid_to_loc;
let expr iterator expr =
Local_analysis.expr poses expr;
Global_analysis.expr poses uid_to_loc expr;
Tast_iterator.default_iterator.expr iterator expr
in
let pat iterator pat =
Local_analysis.pat poses pat;
Tast_iterator.default_iterator.pat iterator pat
in
let iterator = { Tast_iterator.default_iterator with expr; pat } in
iterator.structure iterator structure;
!poses
| _ -> []