diff options
author | Nathan Whitaker <17734409+nathanwhit@users.noreply.github.com> | 2024-05-09 07:17:31 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-05-09 14:17:31 +0000 |
commit | dc29986ae591425f4a653a7155d41d75fbf7931a (patch) | |
tree | 92240f4204098c8b4be720032b6421043efd9377 /cli/lsp/resolver.rs | |
parent | 263b6b971db60135e655914e7e33b8c26290a421 (diff) |
fix(lsp): move sloppy import resolution from loader to resolver (#23751)
Moves sloppy import resolution from the loader to the resolver.
Also adds some test helper functions to make the lsp tests less verbose
---------
Co-authored-by: David Sherret <dsherret@gmail.com>
Diffstat (limited to 'cli/lsp/resolver.rs')
-rw-r--r-- | cli/lsp/resolver.rs | 82 |
1 files changed, 77 insertions, 5 deletions
diff --git a/cli/lsp/resolver.rs b/cli/lsp/resolver.rs index ebe254b9d..f336c6b03 100644 --- a/cli/lsp/resolver.rs +++ b/cli/lsp/resolver.rs @@ -21,6 +21,8 @@ use crate::npm::ManagedCliNpmResolver; use crate::resolver::CliGraphResolver; use crate::resolver::CliGraphResolverOptions; use crate::resolver::CliNodeResolver; +use crate::resolver::SloppyImportsFsEntry; +use crate::resolver::SloppyImportsResolver; use crate::util::progress_bar::ProgressBar; use crate::util::progress_bar::ProgressBarStyle; use deno_cache_dir::HttpCache; @@ -60,6 +62,7 @@ pub struct LspResolver { redirect_resolver: Option<Arc<RedirectResolver>>, graph_imports: Arc<IndexMap<ModuleSpecifier, GraphImport>>, config: Arc<Config>, + unstable_sloppy_imports: bool, } impl Default for LspResolver { @@ -73,6 +76,7 @@ impl Default for LspResolver { redirect_resolver: None, graph_imports: Default::default(), config: Default::default(), + unstable_sloppy_imports: false, } } } @@ -140,6 +144,10 @@ impl LspResolver { npm_config_hash, redirect_resolver, graph_imports, + unstable_sloppy_imports: config_data + .and_then(|d| d.config_file.as_ref()) + .map(|cf| cf.has_unstable("sloppy-imports")) + .unwrap_or(false), config: Arc::new(config.clone()), }) } @@ -162,6 +170,7 @@ impl LspResolver { redirect_resolver: self.redirect_resolver.clone(), graph_imports: self.graph_imports.clone(), config: self.config.clone(), + unstable_sloppy_imports: self.unstable_sloppy_imports, }) } @@ -181,8 +190,11 @@ impl LspResolver { Ok(()) } - pub fn as_graph_resolver(&self) -> &dyn Resolver { - self.graph_resolver.as_ref() + pub fn as_graph_resolver(&self) -> LspGraphResolver { + LspGraphResolver { + inner: &self.graph_resolver, + unstable_sloppy_imports: self.unstable_sloppy_imports, + } } pub fn as_graph_npm_resolver(&self) -> &dyn NpmResolver { @@ -307,6 +319,68 @@ impl LspResolver { } } +#[derive(Debug)] +pub struct LspGraphResolver<'a> { + inner: &'a CliGraphResolver, + unstable_sloppy_imports: bool, +} + +impl<'a> Resolver for LspGraphResolver<'a> { + fn default_jsx_import_source(&self) -> Option<String> { + self.inner.default_jsx_import_source() + } + + fn default_jsx_import_source_types(&self) -> Option<String> { + self.inner.default_jsx_import_source_types() + } + + fn jsx_import_source_module(&self) -> &str { + self.inner.jsx_import_source_module() + } + + fn resolve( + &self, + specifier_text: &str, + referrer_range: &deno_graph::Range, + mode: deno_graph::source::ResolutionMode, + ) -> Result<deno_ast::ModuleSpecifier, deno_graph::source::ResolveError> { + let specifier = self.inner.resolve(specifier_text, referrer_range, mode)?; + if self.unstable_sloppy_imports && specifier.scheme() == "file" { + Ok( + SloppyImportsResolver::resolve_with_stat_sync( + &specifier, + mode, + |path| { + path.metadata().ok().and_then(|m| { + if m.is_file() { + Some(SloppyImportsFsEntry::File) + } else if m.is_dir() { + Some(SloppyImportsFsEntry::Dir) + } else { + None + } + }) + }, + ) + .into_specifier() + .into_owned(), + ) + } else { + Ok(specifier) + } + } + + fn resolve_types( + &self, + specifier: &deno_ast::ModuleSpecifier, + ) -> Result< + Option<(deno_ast::ModuleSpecifier, Option<deno_graph::Range>)>, + deno_graph::source::ResolveError, + > { + self.inner.resolve_types(specifier) + } +} + async fn create_npm_resolver( config_data: &ConfigData, global_cache_path: Option<&Path>, @@ -399,9 +473,7 @@ fn create_graph_resolver( bare_node_builtins_enabled: config_file .map(|cf| cf.has_unstable("bare-node-builtins")) .unwrap_or(false), - // Don't set this for the LSP because instead we'll use the OpenDocumentsLoader - // because it's much easier and we get diagnostics/quick fixes about a redirected - // specifier for free. + // not used in the LSP as the LspGraphResolver handles this sloppy_imports_resolver: None, })) } |