From e4b97ea51a6a8aab92b1cf43de578ef7eb65415d Mon Sep 17 00:00:00 2001 From: Spotandjake <40705786+spotandjake@users.noreply.github.com> Date: Mon, 4 Mar 2024 00:02:26 -0500 Subject: [PATCH] fix(lsp): Prevent lsp crash when module cannot be found (#2003) --- compiler/src/language_server/hover.re | 32 ++++++++++++++-------- compiler/src/language_server/sourcetree.re | 8 +----- 2 files changed, 22 insertions(+), 18 deletions(-) diff --git a/compiler/src/language_server/hover.re b/compiler/src/language_server/hover.re index a94126a45f..6bd33c0036 100644 --- a/compiler/src/language_server/hover.re +++ b/compiler/src/language_server/hover.re @@ -126,11 +126,17 @@ let declaration_lens = (ident: Ident.t, decl: Types.type_declaration) => { }; let include_lens = (env: Env.t, path: Path.t) => { - let module_decl = Env.find_module(path, None, env); - markdown_join( - grain_code_block("module " ++ Path.name(path)), - module_lens(module_decl), - ); + let header = grain_code_block("module " ++ Path.name(path)); + let decl = Env.find_module(path, None, env); + let module_decl = + switch (Modules.get_provides(decl)) { + | [_, ..._] => Some(module_lens(decl)) + | [] => None + }; + switch (module_decl) { + | Some(mod_sig) => markdown_join(header, mod_sig) + | None => header + }; }; let exception_declaration_lens = @@ -184,12 +190,16 @@ let process = ) | [Module({decl, loc}), ..._] => send_hover(~id, ~range=Utils.loc_to_range(loc), module_lens(decl)) - | [Include({env, path, loc}), ..._] => - send_hover( - ~id, - ~range=Utils.loc_to_range(loc), - include_lens(env, path), - ) + | [Include({path, loc}), ..._] => + let hover_lens = + try(Some(include_lens(program.env, path))) { + | Not_found => None + }; + switch (hover_lens) { + | Some(lens) => send_hover(~id, ~range=Utils.loc_to_range(loc), lens) + | None => send_no_result(~id) + }; + | _ => send_no_result(~id) }; }; diff --git a/compiler/src/language_server/sourcetree.re b/compiler/src/language_server/sourcetree.re index 408f6104e2..a4f523c17c 100644 --- a/compiler/src/language_server/sourcetree.re +++ b/compiler/src/language_server/sourcetree.re @@ -170,7 +170,6 @@ module type Sourcetree = { definition: option(Location.t), }) | Include({ - env: Env.t, path: Path.t, loc: Location.t, }); @@ -260,7 +259,6 @@ module Sourcetree: Sourcetree = { definition: option(Location.t), }) | Include({ - env: Env.t, path: Path.t, loc: Location.t, }); @@ -534,11 +532,7 @@ module Sourcetree: Sourcetree = { [ ( loc_to_interval(stmt.ttop_loc), - Include({ - env: stmt.ttop_env, - path: inc.tinc_path, - loc: stmt.ttop_loc, - }), + Include({path: inc.tinc_path, loc: stmt.ttop_loc}), ), ...segments^, ]