diff options
Diffstat (limited to 'cli/lsp')
-rw-r--r-- | cli/lsp/diagnostics.rs | 33 | ||||
-rw-r--r-- | cli/lsp/documents.rs | 85 | ||||
-rw-r--r-- | cli/lsp/language_server.rs | 14 |
3 files changed, 68 insertions, 64 deletions
diff --git a/cli/lsp/diagnostics.rs b/cli/lsp/diagnostics.rs index 0a6f33126..85bd2d76e 100644 --- a/cli/lsp/diagnostics.rs +++ b/cli/lsp/diagnostics.rs @@ -27,8 +27,8 @@ use deno_core::serde::Deserialize; use deno_core::serde_json; use deno_core::serde_json::json; use deno_core::ModuleSpecifier; +use deno_graph::Resolution; use deno_graph::ResolutionError; -use deno_graph::Resolved; use deno_graph::SpecifierError; use deno_lint::rules::LintRule; use deno_runtime::tokio_util::create_basic_runtime; @@ -852,18 +852,17 @@ impl DenoDiagnostic { } } -fn diagnose_resolved( +fn diagnose_resolution( diagnostics: &mut Vec<lsp::Diagnostic>, snapshot: &language_server::StateSnapshot, - resolved: &deno_graph::Resolved, + resolution: &Resolution, is_dynamic: bool, maybe_assert_type: Option<&str>, ) { - match resolved { - Resolved::Ok { - specifier, range, .. - } => { - let range = documents::to_lsp_range(range); + match resolution { + Resolution::Ok(resolved) => { + let specifier = &resolved.specifier; + let range = documents::to_lsp_range(&resolved.range); // If the module is a remote module and has a `X-Deno-Warning` header, we // want a warning diagnostic with that message. if let Some(metadata) = snapshot.cache_metadata.get(specifier) { @@ -959,8 +958,8 @@ fn diagnose_resolved( } // The specifier resolution resulted in an error, so we want to issue a // diagnostic for that. - Resolved::Err(err) => diagnostics.push( - DenoDiagnostic::ResolutionError(err.clone()) + Resolution::Err(err) => diagnostics.push( + DenoDiagnostic::ResolutionError(*err.clone()) .to_lsp_diagnostic(&documents::to_lsp_range(err.range())), ), _ => (), @@ -984,31 +983,28 @@ fn diagnose_dependency( } if let Some(import_map) = &snapshot.maybe_import_map { - if let Resolved::Ok { - specifier, range, .. - } = &dependency.maybe_code - { - if let Some(to) = import_map.lookup(specifier, referrer) { + if let Resolution::Ok(resolved) = &dependency.maybe_code { + if let Some(to) = import_map.lookup(&resolved.specifier, referrer) { if dependency_key != to { diagnostics.push( DenoDiagnostic::ImportMapRemap { from: dependency_key.to_string(), to, } - .to_lsp_diagnostic(&documents::to_lsp_range(range)), + .to_lsp_diagnostic(&documents::to_lsp_range(&resolved.range)), ); } } } } - diagnose_resolved( + diagnose_resolution( diagnostics, snapshot, &dependency.maybe_code, dependency.is_dynamic, dependency.maybe_assert_type.as_deref(), ); - diagnose_resolved( + diagnose_resolution( diagnostics, snapshot, &dependency.maybe_type, @@ -1064,6 +1060,7 @@ mod tests { use crate::lsp::documents::Documents; use crate::lsp::documents::LanguageId; use crate::lsp::language_server::StateSnapshot; + use pretty_assertions::assert_eq; use std::path::Path; use std::path::PathBuf; use std::sync::Arc; diff --git a/cli/lsp/documents.rs b/cli/lsp/documents.rs index c32efe89c..329fc554b 100644 --- a/cli/lsp/documents.rs +++ b/cli/lsp/documents.rs @@ -33,7 +33,7 @@ use deno_core::parking_lot::Mutex; use deno_core::url; use deno_core::ModuleSpecifier; use deno_graph::GraphImport; -use deno_graph::Resolved; +use deno_graph::Resolution; use deno_runtime::deno_node::NodeResolutionMode; use deno_runtime::permissions::PermissionsContainer; use once_cell::sync::Lazy; @@ -243,7 +243,7 @@ impl AssetOrDocument { #[derive(Debug, Default)] struct DocumentDependencies { deps: BTreeMap<String, deno_graph::Dependency>, - maybe_types_dependency: Option<(String, Resolved)>, + maybe_types_dependency: Option<deno_graph::TypesDependency>, } impl DocumentDependencies { @@ -508,13 +508,12 @@ impl Document { self.0.maybe_lsp_version.is_some() } - pub fn maybe_types_dependency(&self) -> deno_graph::Resolved { - if let Some((_, maybe_dep)) = - self.0.dependencies.maybe_types_dependency.as_ref() + pub fn maybe_types_dependency(&self) -> Resolution { + if let Some(types_dep) = self.0.dependencies.maybe_types_dependency.as_ref() { - maybe_dep.clone() + types_dep.dependency.clone() } else { - deno_graph::Resolved::None + Resolution::None } } @@ -597,20 +596,23 @@ impl Document { } } -pub fn to_hover_text(result: &Resolved) -> String { +pub fn to_hover_text(result: &Resolution) -> String { match result { - Resolved::Ok { specifier, .. } => match specifier.scheme() { - "data" => "_(a data url)_".to_string(), - "blob" => "_(a blob url)_".to_string(), - _ => format!( - "{}​{}", - &specifier[..url::Position::AfterScheme], - &specifier[url::Position::AfterScheme..], - ) - .replace('@', "​@"), - }, - Resolved::Err(_) => "_[errored]_".to_string(), - Resolved::None => "_[missing]_".to_string(), + Resolution::Ok(resolved) => { + let specifier = &resolved.specifier; + match specifier.scheme() { + "data" => "_(a data url)_".to_string(), + "blob" => "_(a blob url)_".to_string(), + _ => format!( + "{}​{}", + &specifier[..url::Position::AfterScheme], + &specifier[url::Position::AfterScheme..], + ) + .replace('@', "​@"), + } + } + Resolution::Err(_) => "_[errored]_".to_string(), + Resolution::None => "_[missing]_".to_string(), } } @@ -1094,15 +1096,16 @@ impl Documents { } else if let Some(dep) = dependencies.as_ref().and_then(|d| d.deps.get(&specifier)) { - if let Resolved::Ok { specifier, .. } = &dep.maybe_type { + if let Some(specifier) = dep.maybe_type.maybe_specifier() { results.push(self.resolve_dependency(specifier, maybe_npm_resolver)); - } else if let Resolved::Ok { specifier, .. } = &dep.maybe_code { + } else if let Some(specifier) = dep.maybe_code.maybe_specifier() { results.push(self.resolve_dependency(specifier, maybe_npm_resolver)); } else { results.push(None); } - } else if let Some(Resolved::Ok { specifier, .. }) = - self.resolve_imports_dependency(&specifier) + } else if let Some(specifier) = self + .resolve_imports_dependency(&specifier) + .and_then(|r| r.maybe_specifier()) { results.push(self.resolve_dependency(specifier, maybe_npm_resolver)); } else if let Ok(npm_ref) = NpmPackageReference::from_str(&specifier) { @@ -1186,18 +1189,18 @@ impl Documents { self.maybe_resolver = CliResolver::maybe_new(maybe_jsx_config, maybe_import_map); self.imports = Arc::new( - if let Some(Ok(Some(imports))) = + if let Some(Ok(imports)) = maybe_config_file.map(|cf| cf.to_maybe_imports()) { imports .into_iter() - .map(|(referrer, dependencies)| { + .map(|import| { let graph_import = GraphImport::new( - referrer.clone(), - dependencies, + &import.referrer, + import.imports, self.get_maybe_resolver(), ); - (referrer, graph_import) + (import.referrer, graph_import) }) .collect() } else { @@ -1274,10 +1277,8 @@ impl Documents { self.add(dep, specifier); } } - if let Resolved::Ok { specifier: dep, .. } = - doc.maybe_types_dependency() - { - self.add(&dep, specifier); + if let Some(dep) = doc.maybe_types_dependency().maybe_specifier() { + self.add(dep, specifier); } } } @@ -1345,13 +1346,12 @@ impl Documents { } let doc = self.get(specifier)?; let maybe_module = doc.maybe_module().and_then(|r| r.as_ref().ok()); - let maybe_types_dependency = maybe_module.and_then(|m| { - m.maybe_types_dependency - .as_ref() - .map(|(_, resolved)| resolved.clone()) - }); - if let Some(Resolved::Ok { specifier, .. }) = maybe_types_dependency { - self.resolve_dependency(&specifier, maybe_npm_resolver) + let maybe_types_dependency = maybe_module + .and_then(|m| m.maybe_types_dependency.as_ref().map(|d| &d.dependency)); + if let Some(specifier) = + maybe_types_dependency.and_then(|d| d.maybe_specifier()) + { + self.resolve_dependency(specifier, maybe_npm_resolver) } else { let media_type = doc.media_type(); Some((specifier.clone(), media_type)) @@ -1361,10 +1361,7 @@ impl Documents { /// Iterate through any "imported" modules, checking to see if a dependency /// is available. This is used to provide "global" imports like the JSX import /// source. - fn resolve_imports_dependency( - &self, - specifier: &str, - ) -> Option<&deno_graph::Resolved> { + fn resolve_imports_dependency(&self, specifier: &str) -> Option<&Resolution> { for graph_imports in self.imports.values() { let maybe_dep = graph_imports.dependencies.get(specifier); if maybe_dep.is_some() { diff --git a/cli/lsp/language_server.rs b/cli/lsp/language_server.rs index 13eb61412..f4045a19e 100644 --- a/cli/lsp/language_server.rs +++ b/cli/lsp/language_server.rs @@ -173,8 +173,18 @@ impl LanguageServer { inner_loader: &mut inner_loader, open_docs: &open_docs, }; - let graph = ps.create_graph_with_loader(roots, &mut loader).await?; - graph_valid(&graph, true, false)?; + let graph = ps + .create_graph_with_loader(roots.clone(), &mut loader) + .await?; + graph_valid( + &graph, + &roots, + deno_graph::WalkOptions { + follow_dynamic: false, + follow_type_only: true, + check_js: false, + }, + )?; Ok(()) } |