diff options
Diffstat (limited to 'cli/lsp')
| -rw-r--r-- | cli/lsp/analysis.rs | 7 | ||||
| -rw-r--r-- | cli/lsp/diagnostics.rs | 19 | ||||
| -rw-r--r-- | cli/lsp/documents.rs | 52 | ||||
| -rw-r--r-- | cli/lsp/language_server.rs | 15 | ||||
| -rw-r--r-- | cli/lsp/tsc.rs | 12 |
5 files changed, 58 insertions, 47 deletions
diff --git a/cli/lsp/analysis.rs b/cli/lsp/analysis.rs index 7a0c11212..1b11deca8 100644 --- a/cli/lsp/analysis.rs +++ b/cli/lsp/analysis.rs @@ -199,9 +199,8 @@ impl<'a> TsResponseImportMapper<'a> { } if self.npm_resolver.in_npm_package(specifier) { - if let Ok(Some(pkg_id)) = self - .npm_resolver - .resolve_package_id_from_specifier(specifier) + if let Ok(Some(pkg_id)) = + self.npm_resolver.resolve_pkg_id_from_specifier(specifier) { let pkg_reqs = self.npm_resolution.resolve_pkg_reqs_from_pkg_id(&pkg_id); @@ -254,7 +253,7 @@ impl<'a> TsResponseImportMapper<'a> { let specifier_path = specifier.to_file_path().ok()?; let root_folder = self .npm_resolver - .resolve_package_folder_from_specifier(specifier) + .resolve_pkg_folder_from_specifier(specifier) .ok() .flatten()?; let package_json_path = root_folder.join("package.json"); diff --git a/cli/lsp/diagnostics.rs b/cli/lsp/diagnostics.rs index 43ae35f54..183901fb0 100644 --- a/cli/lsp/diagnostics.rs +++ b/cli/lsp/diagnostics.rs @@ -800,8 +800,8 @@ fn generate_lint_diagnostics( } // ignore any npm package files - if let Some(node_resolver) = &snapshot.maybe_node_resolver { - if node_resolver.in_npm_package(document.specifier()) { + if let Some(npm) = &snapshot.npm { + if npm.node_resolver.in_npm_package(document.specifier()) { continue; } } @@ -1237,10 +1237,10 @@ fn diagnose_resolution( } else if let Ok(pkg_ref) = NpmPackageReqReference::from_specifier(specifier) { - if let Some(npm_resolver) = &snapshot.maybe_npm_resolver { + if let Some(npm) = &snapshot.npm { // show diagnostics for npm package references that aren't cached let req = pkg_ref.into_inner().req; - if !npm_resolver.is_pkg_req_folder_cached(&req) { + if !npm.npm_resolver.is_pkg_req_folder_cached(&req) { diagnostics .push(DenoDiagnostic::NoCacheNpm(req, specifier.clone())); } @@ -1250,10 +1250,10 @@ fn diagnose_resolution( if !deno_node::is_builtin_node_module(module_name) { diagnostics .push(DenoDiagnostic::InvalidNodeSpecifier(specifier.clone())); - } else if let Some(npm_resolver) = &snapshot.maybe_npm_resolver { + } else if let Some(npm) = &snapshot.npm { // check that a @types/node package exists in the resolver let types_node_req = PackageReq::from_str("@types/node").unwrap(); - if !npm_resolver.is_pkg_req_folder_cached(&types_node_req) { + if !npm.npm_resolver.is_pkg_req_folder_cached(&types_node_req) { diagnostics.push(DenoDiagnostic::NoCacheNpm( types_node_req, ModuleSpecifier::parse("npm:@types/node").unwrap(), @@ -1291,8 +1291,8 @@ fn diagnose_dependency( dependency_key: &str, dependency: &deno_graph::Dependency, ) { - if let Some(npm_resolver) = &snapshot.maybe_npm_resolver { - if npm_resolver.in_npm_package(referrer) { + if let Some(npm) = &snapshot.npm { + if npm.npm_resolver.in_npm_package(referrer) { return; // ignore, surface typescript errors instead } } @@ -1461,8 +1461,7 @@ mod tests { GlobalHttpCache::new(location.to_path_buf(), RealDenoCacheEnv), )), config: Default::default(), - maybe_node_resolver: None, - maybe_npm_resolver: None, + npm: None, } } 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() + }), ) }) } diff --git a/cli/lsp/language_server.rs b/cli/lsp/language_server.rs index d9db2edbf..38d07fb52 100644 --- a/cli/lsp/language_server.rs +++ b/cli/lsp/language_server.rs @@ -158,6 +158,12 @@ impl LspNpmConfigHash { #[derive(Debug, Clone)] pub struct LanguageServer(Arc<tokio::sync::RwLock<Inner>>); +#[derive(Debug)] +pub struct StateNpmSnapshot { + pub node_resolver: Arc<NodeResolver>, + pub npm_resolver: Arc<CliNpmResolver>, +} + /// Snapshot of the state used by TSC. #[derive(Debug)] pub struct StateSnapshot { @@ -166,8 +172,7 @@ pub struct StateSnapshot { pub config: Arc<ConfigSnapshot>, pub documents: Documents, pub maybe_import_map: Option<Arc<ImportMap>>, - pub maybe_node_resolver: Option<Arc<NodeResolver>>, - pub maybe_npm_resolver: Option<Arc<CliNpmResolver>>, + pub npm: Option<StateNpmSnapshot>, } #[derive(Debug)] @@ -819,8 +824,10 @@ impl Inner { config: self.config.snapshot(), documents: self.documents.clone(), maybe_import_map: self.maybe_import_map.clone(), - maybe_node_resolver: Some(node_resolver), - maybe_npm_resolver: Some(npm_resolver), + npm: Some(StateNpmSnapshot { + node_resolver, + npm_resolver, + }), }) } diff --git a/cli/lsp/tsc.rs b/cli/lsp/tsc.rs index 9a33ff5f9..cf809408b 100644 --- a/cli/lsp/tsc.rs +++ b/cli/lsp/tsc.rs @@ -3293,9 +3293,9 @@ fn op_is_node_file(state: &mut OpState, #[string] path: String) -> bool { match ModuleSpecifier::parse(&path) { Ok(specifier) => state .state_snapshot - .maybe_npm_resolver + .npm .as_ref() - .map(|r| r.in_npm_package(&specifier)) + .map(|n| n.npm_resolver.in_npm_package(&specifier)) .unwrap_or(false), Err(_) => false, } @@ -3341,7 +3341,7 @@ fn op_resolve( let resolved = state.state_snapshot.documents.resolve( args.specifiers, &referrer_doc, - state.state_snapshot.maybe_node_resolver.as_ref(), + state.state_snapshot.npm.as_ref(), ); Ok( resolved @@ -3477,8 +3477,7 @@ deno_core::extension!(deno_tsc, config: Default::default(), documents: Documents::new(options.cache.clone()), maybe_import_map: None, - maybe_node_resolver: None, - maybe_npm_resolver: None, + npm: None, }), options.performance, )); @@ -4304,8 +4303,7 @@ mod tests { cache_metadata: CacheMetadata::new(cache), config: Default::default(), maybe_import_map: None, - maybe_node_resolver: None, - maybe_npm_resolver: None, + npm: None, } } |
