diff options
Diffstat (limited to 'cli/lsp/documents.rs')
-rw-r--r-- | cli/lsp/documents.rs | 107 |
1 files changed, 67 insertions, 40 deletions
diff --git a/cli/lsp/documents.rs b/cli/lsp/documents.rs index c97555911..fa8b62306 100644 --- a/cli/lsp/documents.rs +++ b/cli/lsp/documents.rs @@ -17,6 +17,8 @@ use crate::node; use crate::node::node_resolve_npm_reference; use crate::node::NodeResolution; use crate::npm::NpmPackageResolver; +use crate::npm::NpmRegistryApi; +use crate::npm::NpmResolution; use crate::resolver::CliGraphResolver; use crate::util::path::specifier_to_file_path; use crate::util::text_encoding; @@ -36,8 +38,8 @@ use deno_graph::GraphImport; use deno_graph::Resolution; use deno_runtime::deno_node::NodeResolutionMode; use deno_runtime::permissions::PermissionsContainer; +use indexmap::IndexMap; use once_cell::sync::Lazy; -use std::collections::BTreeMap; use std::collections::HashMap; use std::collections::HashSet; use std::collections::VecDeque; @@ -242,7 +244,7 @@ impl AssetOrDocument { #[derive(Debug, Default)] struct DocumentDependencies { - deps: BTreeMap<String, deno_graph::Dependency>, + deps: IndexMap<String, deno_graph::Dependency>, maybe_types_dependency: Option<deno_graph::TypesDependency>, } @@ -255,7 +257,7 @@ impl DocumentDependencies { } } - pub fn from_module(module: &deno_graph::Module) -> Self { + pub fn from_module(module: &deno_graph::EsmModule) -> Self { Self { deps: module.dependencies.clone(), maybe_types_dependency: module.maybe_types_dependency.clone(), @@ -263,7 +265,7 @@ impl DocumentDependencies { } } -type ModuleResult = Result<deno_graph::Module, deno_graph::ModuleGraphError>; +type ModuleResult = Result<deno_graph::EsmModule, deno_graph::ModuleGraphError>; type ParsedSourceResult = Result<ParsedSource, deno_ast::Diagnostic>; #[derive(Debug)] @@ -542,9 +544,7 @@ impl Document { self.0.maybe_lsp_version } - fn maybe_module( - &self, - ) -> Option<&Result<deno_graph::Module, deno_graph::ModuleGraphError>> { + fn maybe_esm_module(&self) -> Option<&ModuleResult> { self.0.maybe_module.as_ref() } @@ -572,7 +572,7 @@ impl Document { } } - pub fn dependencies(&self) -> &BTreeMap<String, deno_graph::Dependency> { + pub fn dependencies(&self) -> &IndexMap<String, deno_graph::Dependency> { &self.0.dependencies.deps } @@ -583,7 +583,7 @@ impl Document { &self, position: &lsp::Position, ) -> Option<(String, deno_graph::Dependency, deno_graph::Range)> { - let module = self.maybe_module()?.as_ref().ok()?; + let module = self.maybe_esm_module()?.as_ref().ok()?; let position = deno_graph::Position { line: position.line as usize, character: position.character as usize, @@ -1103,19 +1103,10 @@ impl Documents { .and_then(|r| r.maybe_specifier()) { results.push(self.resolve_dependency(specifier, maybe_npm_resolver)); - } else if let Ok(npm_ref) = NpmPackageReqReference::from_str(&specifier) { - results.push(maybe_npm_resolver.map(|npm_resolver| { - NodeResolution::into_specifier_and_media_type( - node_resolve_npm_reference( - &npm_ref, - NodeResolutionMode::Types, - npm_resolver, - &mut PermissionsContainer::allow_all(), - ) - .ok() - .flatten(), - ) - })); + } else if let Ok(npm_req_ref) = + NpmPackageReqReference::from_str(&specifier) + { + results.push(node_resolve_npm_req_ref(npm_req_ref, maybe_npm_resolver)); } else { results.push(None); } @@ -1159,6 +1150,8 @@ impl Documents { &mut self, maybe_import_map: Option<Arc<import_map::ImportMap>>, maybe_config_file: Option<&ConfigFile>, + npm_registry_api: NpmRegistryApi, + npm_resolution: NpmResolution, ) { fn calculate_resolver_config_hash( maybe_import_map: Option<&import_map::ImportMap>, @@ -1182,8 +1175,14 @@ impl Documents { maybe_jsx_config.as_ref(), ); // TODO(bartlomieju): handle package.json dependencies here - self.resolver = - CliGraphResolver::new(maybe_jsx_config, maybe_import_map, None); + self.resolver = CliGraphResolver::new( + maybe_jsx_config, + maybe_import_map, + false, + npm_registry_api, + npm_resolution, + None, + ); self.imports = Arc::new( if let Some(Ok(imports)) = maybe_config_file.map(|cf| cf.to_maybe_imports()) @@ -1322,21 +1321,10 @@ impl Documents { maybe_npm_resolver: Option<&NpmPackageResolver>, ) -> Option<(ModuleSpecifier, MediaType)> { if let Ok(npm_ref) = NpmPackageReqReference::from_specifier(specifier) { - return maybe_npm_resolver.map(|npm_resolver| { - NodeResolution::into_specifier_and_media_type( - node_resolve_npm_reference( - &npm_ref, - NodeResolutionMode::Types, - npm_resolver, - &mut PermissionsContainer::allow_all(), - ) - .ok() - .flatten(), - ) - }); + return node_resolve_npm_req_ref(npm_ref, maybe_npm_resolver); } let doc = self.get(specifier)?; - let maybe_module = doc.maybe_module().and_then(|r| r.as_ref().ok()); + let maybe_module = doc.maybe_esm_module().and_then(|r| r.as_ref().ok()); let maybe_types_dependency = maybe_module .and_then(|m| m.maybe_types_dependency.as_ref().map(|d| &d.dependency)); if let Some(specifier) = @@ -1363,6 +1351,30 @@ impl Documents { } } +fn node_resolve_npm_req_ref( + npm_req_ref: NpmPackageReqReference, + maybe_npm_resolver: Option<&NpmPackageResolver>, +) -> Option<(ModuleSpecifier, MediaType)> { + maybe_npm_resolver.map(|npm_resolver| { + NodeResolution::into_specifier_and_media_type( + npm_resolver + .resolution() + .pkg_req_ref_to_nv_ref(npm_req_ref) + .ok() + .and_then(|pkg_id_ref| { + node_resolve_npm_reference( + &pkg_id_ref, + NodeResolutionMode::Types, + npm_resolver, + &mut PermissionsContainer::allow_all(), + ) + .ok() + .flatten() + }), + ) + }) +} + /// Loader that will look at the open documents. pub struct OpenDocumentsGraphLoader<'a> { pub inner_loader: &'a mut dyn deno_graph::source::Loader, @@ -1426,7 +1438,6 @@ fn analyze_module( match parsed_source_result { Ok(parsed_source) => Ok(deno_graph::parse_module_from_ast( specifier, - deno_graph::ModuleKind::Esm, maybe_headers, parsed_source, Some(resolver), @@ -1440,6 +1451,8 @@ fn analyze_module( #[cfg(test)] mod tests { + use crate::npm::NpmResolution; + use super::*; use import_map::ImportMap; use test_util::TempDir; @@ -1540,6 +1553,10 @@ console.log(b, "hello deno"); #[test] fn test_documents_refresh_dependencies_config_change() { + let npm_registry_api = NpmRegistryApi::new_uninitialized(); + let npm_resolution = + NpmResolution::new(npm_registry_api.clone(), None, None); + // it should never happen that a user of this API causes this to happen, // but we'll guard against it anyway let temp_dir = TempDir::new(); @@ -1569,7 +1586,12 @@ console.log(b, "hello deno"); .append("test".to_string(), "./file2.ts".to_string()) .unwrap(); - documents.update_config(Some(Arc::new(import_map)), None); + documents.update_config( + Some(Arc::new(import_map)), + None, + npm_registry_api.clone(), + npm_resolution.clone(), + ); // open the document let document = documents.open( @@ -1602,7 +1624,12 @@ console.log(b, "hello deno"); .append("test".to_string(), "./file3.ts".to_string()) .unwrap(); - documents.update_config(Some(Arc::new(import_map)), None); + documents.update_config( + Some(Arc::new(import_map)), + None, + npm_registry_api, + npm_resolution, + ); // check the document's dependencies let document = documents.get(&file1_specifier).unwrap(); |