diff options
author | Nayeem Rahman <nayeemrmn99@gmail.com> | 2024-10-07 18:20:45 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-10-07 18:20:45 +0100 |
commit | 053894b9e0899757f156b8cd956fd467e0e11a63 (patch) | |
tree | 87e2753abfd57994c1e94f3525e3f8168945efba /cli/lsp | |
parent | 719b8dcfde074e2347f0305bd2dec170fd9c4b04 (diff) |
fix(lsp): exclude missing import quick fixes with bad resolutions (#26025)
Diffstat (limited to 'cli/lsp')
-rw-r--r-- | cli/lsp/analysis.rs | 48 | ||||
-rw-r--r-- | cli/lsp/language_server.rs | 1 |
2 files changed, 38 insertions, 11 deletions
diff --git a/cli/lsp/analysis.rs b/cli/lsp/analysis.rs index d189ab253..4890221d9 100644 --- a/cli/lsp/analysis.rs +++ b/cli/lsp/analysis.rs @@ -228,6 +228,7 @@ pub struct TsResponseImportMapper<'a> { documents: &'a Documents, maybe_import_map: Option<&'a ImportMap>, resolver: &'a LspResolver, + file_referrer: ModuleSpecifier, } impl<'a> TsResponseImportMapper<'a> { @@ -235,11 +236,13 @@ impl<'a> TsResponseImportMapper<'a> { documents: &'a Documents, maybe_import_map: Option<&'a ImportMap>, resolver: &'a LspResolver, + file_referrer: &ModuleSpecifier, ) -> Self { Self { documents, maybe_import_map, resolver, + file_referrer: file_referrer.clone(), } } @@ -260,8 +263,6 @@ impl<'a> TsResponseImportMapper<'a> { } } - let file_referrer = self.documents.get_file_referrer(referrer); - if let Some(jsr_path) = specifier.as_str().strip_prefix(jsr_url().as_str()) { let mut segments = jsr_path.split('/'); @@ -276,7 +277,7 @@ impl<'a> TsResponseImportMapper<'a> { let export = self.resolver.jsr_lookup_export_for_path( &nv, &path, - file_referrer.as_deref(), + Some(&self.file_referrer), )?; let sub_path = (export != ".").then_some(export); let mut req = None; @@ -302,7 +303,7 @@ impl<'a> TsResponseImportMapper<'a> { req = req.or_else(|| { self .resolver - .jsr_lookup_req_for_nv(&nv, file_referrer.as_deref()) + .jsr_lookup_req_for_nv(&nv, Some(&self.file_referrer)) }); let spec_str = if let Some(req) = req { let req_ref = PackageReqReference { req, sub_path }; @@ -332,7 +333,7 @@ impl<'a> TsResponseImportMapper<'a> { if let Some(npm_resolver) = self .resolver - .maybe_managed_npm_resolver(file_referrer.as_deref()) + .maybe_managed_npm_resolver(Some(&self.file_referrer)) { if npm_resolver.in_npm_package(specifier) { if let Ok(Some(pkg_id)) = @@ -468,6 +469,26 @@ impl<'a> TsResponseImportMapper<'a> { } None } + + pub fn is_valid_import( + &self, + specifier_text: &str, + referrer: &ModuleSpecifier, + ) -> bool { + self + .resolver + .as_graph_resolver(Some(&self.file_referrer)) + .resolve( + specifier_text, + &deno_graph::Range { + specifier: referrer.clone(), + start: deno_graph::Position::zeroed(), + end: deno_graph::Position::zeroed(), + }, + deno_graph::source::ResolutionMode::Types, + ) + .is_ok() + } } fn try_reverse_map_package_json_exports( @@ -580,7 +601,7 @@ fn fix_ts_import_action( referrer: &ModuleSpecifier, action: &tsc::CodeFixAction, import_mapper: &TsResponseImportMapper, -) -> Result<tsc::CodeFixAction, AnyError> { +) -> Result<Option<tsc::CodeFixAction>, AnyError> { if matches!( action.fix_name.as_str(), "import" | "fixMissingFunctionDeclaration" @@ -623,19 +644,21 @@ fn fix_ts_import_action( }) .collect(); - return Ok(tsc::CodeFixAction { + return Ok(Some(tsc::CodeFixAction { description, changes, commands: None, fix_name: action.fix_name.clone(), fix_id: None, fix_all_description: None, - }); + })); + } else if !import_mapper.is_valid_import(specifier, referrer) { + return Ok(None); } } } - Ok(action.clone()) + Ok(Some(action.clone())) } /// Determines if two TypeScript diagnostic codes are effectively equivalent. @@ -976,11 +999,14 @@ impl CodeActionCollection { "The action returned from TypeScript is unsupported.", )); } - let action = fix_ts_import_action( + let Some(action) = fix_ts_import_action( specifier, action, &language_server.get_ts_response_import_mapper(specifier), - )?; + )? + else { + return Ok(()); + }; let edit = ts_changes_to_edit(&action.changes, language_server)?; let code_action = lsp::CodeAction { title: action.description.clone(), diff --git a/cli/lsp/language_server.rs b/cli/lsp/language_server.rs index 90a2579f4..8269dc851 100644 --- a/cli/lsp/language_server.rs +++ b/cli/lsp/language_server.rs @@ -1918,6 +1918,7 @@ impl Inner { // as the import map is an implementation detail .and_then(|d| d.resolver.maybe_import_map()), self.resolver.as_ref(), + file_referrer, ) } |