summaryrefslogtreecommitdiff
path: root/cli/lsp/diagnostics.rs
diff options
context:
space:
mode:
Diffstat (limited to 'cli/lsp/diagnostics.rs')
-rw-r--r--cli/lsp/diagnostics.rs123
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));