diff options
Diffstat (limited to 'cli/lsp/documents.rs')
-rw-r--r-- | cli/lsp/documents.rs | 52 |
1 files changed, 30 insertions, 22 deletions
diff --git a/cli/lsp/documents.rs b/cli/lsp/documents.rs index 24d4e2a10..1c672f623 100644 --- a/cli/lsp/documents.rs +++ b/cli/lsp/documents.rs @@ -2,6 +2,7 @@ use super::cache::calculate_fs_version; use super::cache::calculate_fs_version_at_path; +use super::language_server::StateNpmSnapshot; use super::text::LineIndex; use super::tsc; use super::tsc::AssetDocument; @@ -41,7 +42,6 @@ use deno_graph::Resolution; use deno_runtime::deno_node; use deno_runtime::deno_node::NodeResolution; use deno_runtime::deno_node::NodeResolutionMode; -use deno_runtime::deno_node::NodeResolver; use deno_runtime::deno_node::PackageJson; use deno_runtime::permissions::PermissionsContainer; use deno_semver::npm::NpmPackageReqReference; @@ -1089,7 +1089,7 @@ impl Documents { &self, specifiers: Vec<String>, referrer_doc: &AssetOrDocument, - maybe_node_resolver: Option<&Arc<NodeResolver>>, + maybe_npm: Option<&StateNpmSnapshot>, ) -> Vec<Option<(ModuleSpecifier, MediaType)>> { let referrer = referrer_doc.specifier(); let dependencies = match referrer_doc { @@ -1098,11 +1098,12 @@ impl Documents { }; let mut results = Vec::new(); for specifier in specifiers { - if let Some(node_resolver) = maybe_node_resolver { - if node_resolver.in_npm_package(referrer) { + if let Some(npm) = maybe_npm { + if npm.node_resolver.in_npm_package(referrer) { // we're in an npm package, so use node resolution results.push(Some(NodeResolution::into_specifier_and_media_type( - node_resolver + npm + .node_resolver .resolve( &specifier, referrer, @@ -1126,9 +1127,9 @@ impl Documents { dependencies.as_ref().and_then(|d| d.deps.get(&specifier)) { if let Some(specifier) = dep.maybe_type.maybe_specifier() { - results.push(self.resolve_dependency(specifier, maybe_node_resolver)); + results.push(self.resolve_dependency(specifier, maybe_npm)); } else if let Some(specifier) = dep.maybe_code.maybe_specifier() { - results.push(self.resolve_dependency(specifier, maybe_node_resolver)); + results.push(self.resolve_dependency(specifier, maybe_npm)); } else { results.push(None); } @@ -1136,12 +1137,11 @@ impl Documents { .resolve_imports_dependency(&specifier) .and_then(|r| r.maybe_specifier()) { - results.push(self.resolve_dependency(specifier, maybe_node_resolver)); + results.push(self.resolve_dependency(specifier, maybe_npm)); } else if let Ok(npm_req_ref) = NpmPackageReqReference::from_str(&specifier) { - results - .push(node_resolve_npm_req_ref(npm_req_ref, maybe_node_resolver)); + results.push(node_resolve_npm_req_ref(npm_req_ref, maybe_npm)); } else { results.push(None); } @@ -1475,7 +1475,7 @@ impl Documents { fn resolve_dependency( &self, specifier: &ModuleSpecifier, - maybe_node_resolver: Option<&Arc<NodeResolver>>, + maybe_npm: Option<&StateNpmSnapshot>, ) -> Option<(ModuleSpecifier, MediaType)> { if let Some(module_name) = specifier.as_str().strip_prefix("node:") { if deno_node::is_builtin_node_module(module_name) { @@ -1487,7 +1487,7 @@ impl Documents { } if let Ok(npm_ref) = NpmPackageReqReference::from_specifier(specifier) { - return node_resolve_npm_req_ref(npm_ref, maybe_node_resolver); + return node_resolve_npm_req_ref(npm_ref, maybe_npm); } let doc = self.get(specifier)?; let maybe_module = doc.maybe_esm_module().and_then(|r| r.as_ref().ok()); @@ -1496,7 +1496,7 @@ impl Documents { if let Some(specifier) = maybe_types_dependency.and_then(|d| d.maybe_specifier()) { - self.resolve_dependency(specifier, maybe_node_resolver) + self.resolve_dependency(specifier, maybe_npm) } else { let media_type = doc.media_type(); Some((doc.specifier().clone(), media_type)) @@ -1519,18 +1519,26 @@ impl Documents { fn node_resolve_npm_req_ref( npm_req_ref: NpmPackageReqReference, - maybe_node_resolver: Option<&Arc<NodeResolver>>, + maybe_npm: Option<&StateNpmSnapshot>, ) -> Option<(ModuleSpecifier, MediaType)> { - maybe_node_resolver.map(|node_resolver| { + maybe_npm.map(|npm| { NodeResolution::into_specifier_and_media_type( - node_resolver - .resolve_npm_req_reference( - &npm_req_ref, - NodeResolutionMode::Types, - &PermissionsContainer::allow_all(), - ) + npm + .npm_resolver + .resolve_pkg_folder_from_deno_module_req(npm_req_ref.req()) .ok() - .flatten(), + .and_then(|package_folder| { + npm + .node_resolver + .resolve_npm_reference( + &package_folder, + npm_req_ref.sub_path(), + NodeResolutionMode::Types, + &PermissionsContainer::allow_all(), + ) + .ok() + .flatten() + }), ) }) } |