summaryrefslogtreecommitdiff
path: root/cli/lsp/resolver.rs
diff options
context:
space:
mode:
authorNathan Whitaker <17734409+nathanwhit@users.noreply.github.com>2024-05-09 07:17:31 -0700
committerGitHub <noreply@github.com>2024-05-09 14:17:31 +0000
commitdc29986ae591425f4a653a7155d41d75fbf7931a (patch)
tree92240f4204098c8b4be720032b6421043efd9377 /cli/lsp/resolver.rs
parent263b6b971db60135e655914e7e33b8c26290a421 (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.rs82
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,
}))
}