From 6fdc457a5e4878c34f32a1fb091ef8180919255b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ulysse=20G=C3=A9rard?= Date: Fri, 10 Nov 2023 16:00:54 +0100 Subject: [PATCH] locate: fallback after failing to load the uid_to_loc table (or if there is no appropriate entre in the table) --- src/analysis/locate.ml | 75 ++++++++----------- tests/test-dirs/document/issue1513.t | 4 +- .../locate/non-local/ignore-kept-locs.t/run.t | 13 ++-- 3 files changed, 42 insertions(+), 50 deletions(-) diff --git a/src/analysis/locate.ml b/src/analysis/locate.ml index a90e54b8bd..a5518bc693 100644 --- a/src/analysis/locate.ml +++ b/src/analysis/locate.ml @@ -359,14 +359,15 @@ let uid_of_path ~config ~env ~ml_or_mli ~decl_uid path namespace = ~namespace:Shape.Sig_component_kind.Module env (Pident id) end) in - match ml_or_mli with - | `MLI -> - let uid = scrape_alias ~fallback_uid:decl_uid ~env ~namespace path in - log ~title:"uid_of_path" "Declaration uid: %a" - Logger.fmt (fun fmt -> Shape.Uid.print fmt decl_uid); - log ~title:"uid_of_path" "Alias scrapped: %a" + let unalias fallback_uid = + let uid = scrape_alias ~fallback_uid ~env ~namespace path in + log ~title:"uid_of_path" "Unaliasing uid: %a -> %a" + Logger.fmt (fun fmt -> Shape.Uid.print fmt fallback_uid) Logger.fmt (fun fmt -> Shape.Uid.print fmt uid); uid + in + match ml_or_mli with + | `MLI -> unalias decl_uid | `ML -> let shape = Env.shape_of_path ~namespace env path in log ~title:"shape_of_path" "initial: %a" @@ -377,9 +378,8 @@ let uid_of_path ~config ~env ~ml_or_mli ~decl_uid path namespace = match r.uid with | Some uid -> uid | None -> - log ~title:"shape_of_path" "no uid; fallback to Declaration uid: %a" - Logger.fmt (fun fmt -> Shape.Uid.print fmt decl_uid); - decl_uid + log ~title:"shape_of_path" "No uid found; fallbacking to declaration uid"; + unalias decl_uid let from_uid ~config ~ml_or_mli uid loc path = let loc_of_comp_unit comp_unit = @@ -392,56 +392,45 @@ let from_uid ~config ~ml_or_mli uid loc path = in let title = "from_uid" in match uid with - | Shape.Uid.Item { comp_unit; _ } as uid -> + | Shape.Uid.Item { comp_unit; _ } -> let locopt = - if Env.get_unit_name () = comp_unit then begin - log ~title "We look for %a in the current compilation unit." + let log_and_return msg = log ~title msg; None in + let uid_to_loc_tbl = + if Env.get_unit_name () = comp_unit then begin + log ~title "We look for %a in the current compilation unit." + Logger.fmt (fun fmt -> Shape.Uid.print fmt uid); + Some (Env.get_uid_to_loc_tbl ()) + end else begin + log ~title "Loading the cmt for unit %S" comp_unit; + match load_cmt ~config comp_unit ml_or_mli with + | Ok (_pos_fname, cmt) -> Some cmt.cmt_uid_to_loc + | Error () -> log_and_return "Failed to load the cmt file." + end + in + Option.bind uid_to_loc_tbl ~f:(fun tbl -> + log ~title "Looking for %a in the uid_to_loc table" Logger.fmt (fun fmt -> Shape.Uid.print fmt uid); - let tbl = Env.get_uid_to_loc_tbl () in match Shape.Uid.Tbl.find_opt tbl uid with | Some loc -> log ~title "Found location: %a" Logger.fmt (fun fmt -> Location.print_loc fmt loc); Some (uid, loc) - | None -> - log ~title - "Uid not found in the local table.\ - Fallbacking to the node's location: %a" - Logger.fmt (fun fmt -> Location.print_loc fmt loc); - Some (uid, loc) - end else begin - log ~title "Loading the shapes for unit %S" comp_unit; - match load_cmt ~config comp_unit ml_or_mli with - | Ok (_pos_fname, cmt) -> - log ~title "Shapes successfully loaded, looking for %a" - Logger.fmt (fun fmt -> Shape.Uid.print fmt uid); - begin match Shape.Uid.Tbl.find_opt cmt.cmt_uid_to_loc uid with - | Some loc -> - log ~title "Found location: %a" - Logger.fmt (fun fmt -> Location.print_loc fmt loc); - Some (uid, loc) - | None -> - log ~title "Uid not found in the cmt table. \ - Fallbacking to the node's location: %a" - Logger.fmt (fun fmt -> Location.print_loc fmt loc); - Some (uid, loc) - end - | _ -> - log ~title "Failed to load the shapes"; - None - end + | None -> log_and_return "Uid not found in the table.") in begin match locopt with | Some (uid, loc) -> `Found (Some uid, loc) - | None -> `Not_found (Path.name path, None) + | None -> + log ~title "Fallbacking to lookup location: %a" + Logger.fmt (fun fmt -> Location.print_loc fmt loc); + `Found (Some uid, loc) end - | Compilation_unit comp_unit as uid -> + | Compilation_unit comp_unit -> begin log ~title "Got the uid of a compilation unit: %a" Logger.fmt (fun fmt -> Shape.Uid.print fmt uid); match loc_of_comp_unit comp_unit with | Some loc -> `Found (Some uid, loc) - | _ -> log ~title "Failed to load the shapes"; + | _ -> log ~title "Failed to load the CU's cmt"; `Not_found (Path.name path, None) end | Predef _ | Internal -> assert false diff --git a/tests/test-dirs/document/issue1513.t b/tests/test-dirs/document/issue1513.t index b9e18604f9..245bfed984 100644 --- a/tests/test-dirs/document/issue1513.t +++ b/tests/test-dirs/document/issue1513.t @@ -20,8 +20,8 @@ FIXME: We should not rely on "fallbacking". This requires a compiler change. $ $MERLIN single document -position 1:13 \ > -log-file - -log-section locate \ > -filename main.ml &1 | - > grep "Uid not found in the cmt table" - Uid not found in the cmt table. Fallbacking to the node's location: File "naux.ml", line 2, characters 2-5 + > grep "Uid not found in the table." + Uid not found in the table. FIXME: expected "B Comment" $ $MERLIN single document -position 2:13 \ diff --git a/tests/test-dirs/locate/non-local/ignore-kept-locs.t/run.t b/tests/test-dirs/locate/non-local/ignore-kept-locs.t/run.t index 218681b389..3a0fc89d37 100644 --- a/tests/test-dirs/locate/non-local/ignore-kept-locs.t/run.t +++ b/tests/test-dirs/locate/non-local/ignore-kept-locs.t/run.t @@ -20,8 +20,8 @@ available: } $ grep -A1 from_uid log | grep -v from_uid | sed '/^--$/d' - Loading the shapes for unit "A" - Shapes successfully loaded, looking for A.0 + Loading the cmt for unit "A" + Looking for A.0 in the uid_to_loc table Found location: File "a.ml", line 1, characters 4-9 $ rm log @@ -41,8 +41,8 @@ available: } $ grep -A1 from_uid log | grep -v from_uid | sed '/^--$/d' - Loading the shapes for unit "A" - Shapes successfully loaded, looking for A.0 + Loading the cmt for unit "A" + Looking for A.0 in the uid_to_loc table Found location: File "a.ml", line 1, characters 4-9 $ rm log @@ -66,6 +66,9 @@ In the absence of cmt though, fallbacking to the cmi loc makes sense: } $ grep -A1 from_uid log | grep -v from_uid - No UID found, fallbacking to lookup location. + Loading the cmt for unit "A" + -- + Failed to load the cmt file. + Fallbacking to lookup location: File "a.ml", line 1, characters 4-9 $ rm log