diff --git a/lib/compiler/Driver.ml b/lib/compiler/Driver.ml index e0e25b7..16c8406 100644 --- a/lib/compiler/Driver.ml +++ b/lib/compiler/Driver.ml @@ -89,6 +89,17 @@ let run_until_done ?(bail = true) a s : State.t = in go a s +let ensure_loaded ~(forest : State.t) (uri : URI.t) : State.t = + if Option.is_some forest.={uri} then forest + else + let env = State.env forest in + let _errors, dirs = + Eio_util.paths_of_dirs ~env (State.config forest).trees + in + match Dir_scanner.find_tree dirs uri with + | None -> forest + | Some path -> run_until_done ~bail:false (Load_tree path) forest + let batch_run ?(progress = Phases.no_progress) ~env ~(config : Config.t) ~dev () = let report action = diff --git a/lib/language_server/Definitions.ml b/lib/language_server/Definitions.ml index 302bbdb..8fd714c 100644 --- a/lib/language_server/Definitions.ml +++ b/lib/language_server/Definitions.ml @@ -23,8 +23,10 @@ let compute (params : L.DefinitionParams.t) = let@ {value = str; _} = Option.bind @@ Analysis.addr_at ~position:params.position nodes in - let uri = URI.named_uri ~base str in - let lsp_uri = Option.bind forest.={uri} Tree.lsp_uri in + let target_uri = URI.named_uri ~base str in + let forest = Driver.ensure_loaded ~forest target_uri in + Lsp_state.modify (fun state -> {state with forest}); + let lsp_uri = Option.bind forest.={target_uri} Tree.lsp_uri in let range = L.Range.create ~start:{character = 1; line = 0} ~end_:{character = 1; line = 0}