diff options
Diffstat (limited to 'cli/lsp/diagnostics.rs')
-rw-r--r-- | cli/lsp/diagnostics.rs | 123 |
1 files changed, 75 insertions, 48 deletions
diff --git a/cli/lsp/diagnostics.rs b/cli/lsp/diagnostics.rs index ea781abde..9b9035ac5 100644 --- a/cli/lsp/diagnostics.rs +++ b/cli/lsp/diagnostics.rs @@ -1,13 +1,16 @@ // Copyright 2018-2021 the Deno authors. All rights reserved. MIT license. use super::analysis; +use super::documents::DocumentCache; use super::language_server; +use super::sources::Sources; use super::tsc; use crate::diagnostics; use crate::media_type::MediaType; use crate::tokio_util::create_basic_runtime; +use analysis::ResolvedDependency; use deno_core::error::anyhow; use deno_core::error::AnyError; use deno_core::resolve_url; @@ -392,6 +395,64 @@ async fn generate_ts_diagnostics( Ok(diagnostics_vec) } +fn diagnose_dependency( + diagnostics: &mut Vec<lsp::Diagnostic>, + documents: &DocumentCache, + sources: &Sources, + maybe_dependency: &Option<ResolvedDependency>, + maybe_range: &Option<lsp::Range>, +) { + if let (Some(dep), Some(range)) = (maybe_dependency, *maybe_range) { + match dep { + analysis::ResolvedDependency::Err(err) => { + diagnostics.push(lsp::Diagnostic { + range, + severity: Some(lsp::DiagnosticSeverity::Error), + code: Some(err.as_code()), + code_description: None, + source: Some("deno".to_string()), + message: err.to_string(), + related_information: None, + tags: None, + data: None, + }) + } + analysis::ResolvedDependency::Resolved(specifier) => { + if !(documents.contains_key(&specifier) + || sources.contains_key(&specifier)) + { + let (code, message) = match specifier.scheme() { + "file" => (Some(lsp::NumberOrString::String("no-local".to_string())), format!("Unable to load a local module: \"{}\".\n Please check the file path.", specifier)), + "data" => (Some(lsp::NumberOrString::String("no-cache-data".to_string())), "Uncached data URL.".to_string()), + "blob" => (Some(lsp::NumberOrString::String("no-cache-blob".to_string())), "Uncached blob URL.".to_string()), + _ => (Some(lsp::NumberOrString::String("no-cache".to_string())), format!("Uncached or missing remote URL: \"{}\".", specifier)), + }; + diagnostics.push(lsp::Diagnostic { + range, + severity: Some(lsp::DiagnosticSeverity::Error), + code, + source: Some("deno".to_string()), + message, + data: Some(json!({ "specifier": specifier })), + ..Default::default() + }); + } else if sources.contains_key(&specifier) { + if let Some(message) = sources.get_maybe_warning(&specifier) { + diagnostics.push(lsp::Diagnostic { + range, + severity: Some(lsp::DiagnosticSeverity::Warning), + code: Some(lsp::NumberOrString::String("deno-warn".to_string())), + source: Some("deno".to_string()), + message, + ..Default::default() + }) + } + } + } + } + } +} + /// Generate diagnostics for dependencies of a module, attempting to resolve /// dependencies on the local file system or in the DENO_DIR cache. async fn generate_deps_diagnostics( @@ -417,54 +478,20 @@ async fn generate_deps_diagnostics( let mut diagnostics = Vec::new(); if let Some(dependencies) = documents.dependencies(specifier) { for (_, dependency) in dependencies { - // TODO(@kitsonk) add diagnostics for maybe_type dependencies - if let (Some(code), Some(range)) = - (dependency.maybe_code, dependency.maybe_code_specifier_range) - { - match code { - analysis::ResolvedDependency::Err(err) => diagnostics.push(lsp::Diagnostic { - range, - severity: Some(lsp::DiagnosticSeverity::Error), - code: Some(err.as_code()), - code_description: None, - source: Some("deno".to_string()), - message: err.to_string(), - related_information: None, - tags: None, - data: None, - }), - analysis::ResolvedDependency::Resolved(specifier) => { - if !(documents.contains_key(&specifier) || sources.contains_key(&specifier)) { - let (code, message) = match specifier.scheme() { - "file" => (Some(lsp::NumberOrString::String("no-local".to_string())), format!("Unable to load a local module: \"{}\".\n Please check the file path.", specifier)), - "data" => (Some(lsp::NumberOrString::String("no-cache-data".to_string())), "Uncached data URL.".to_string()), - "blob" => (Some(lsp::NumberOrString::String("no-cache-blob".to_string())), "Uncached blob URL.".to_string()), - _ => (Some(lsp::NumberOrString::String("no-cache".to_string())), format!("Uncached or missing remote URL: \"{}\".", specifier)), - }; - diagnostics.push(lsp::Diagnostic { - range, - severity: Some(lsp::DiagnosticSeverity::Error), - code, - source: Some("deno".to_string()), - message, - data: Some(json!({ "specifier": specifier })), - ..Default::default() - }); - } else if sources.contains_key(&specifier) { - if let Some(message) = sources.get_maybe_warning(&specifier) { - diagnostics.push(lsp::Diagnostic { - range, - severity: Some(lsp::DiagnosticSeverity::Warning), - code: Some(lsp::NumberOrString::String("deno-warn".to_string())), - source: Some("deno".to_string()), - message, - ..Default::default() - }) - } - } - }, - } - } + diagnose_dependency( + &mut diagnostics, + &documents, + &sources, + &dependency.maybe_code, + &dependency.maybe_code_specifier_range, + ); + diagnose_dependency( + &mut diagnostics, + &documents, + &sources, + &dependency.maybe_type, + &dependency.maybe_type_specifier_range, + ); } } diagnostics_vec.push((specifier.clone(), version, diagnostics)); |