diff options
Diffstat (limited to 'cli/lsp/diagnostics.rs')
-rw-r--r-- | cli/lsp/diagnostics.rs | 85 |
1 files changed, 52 insertions, 33 deletions
diff --git a/cli/lsp/diagnostics.rs b/cli/lsp/diagnostics.rs index fdbf8b27b..f14d80cd8 100644 --- a/cli/lsp/diagnostics.rs +++ b/cli/lsp/diagnostics.rs @@ -303,20 +303,20 @@ async fn generate_lint_diagnostics( snapshot: &language_server::StateSnapshot, collection: Arc<Mutex<DiagnosticCollection>>, ) -> Result<DiagnosticVec, AnyError> { - let documents = snapshot.documents.clone(); + let documents = snapshot.documents.documents(true, true); let workspace_settings = snapshot.config.settings.workspace.clone(); let maybe_lint_config = snapshot.maybe_lint_config.clone(); tokio::task::spawn(async move { let mut diagnostics_vec = Vec::new(); if workspace_settings.lint { - for specifier in documents.specifiers(true, true) { - let version = documents.lsp_version(&specifier); + for document in documents { + let version = document.maybe_lsp_version(); let current_version = collection .lock() .await - .get_version(&specifier, &DiagnosticSource::DenoLint); + .get_version(document.specifier(), &DiagnosticSource::DenoLint); if version != current_version { - let diagnostics = match documents.parsed_source(&specifier) { + let diagnostics = match document.maybe_parsed_source() { Some(Ok(parsed_source)) => { if let Ok(references) = analysis::get_lint_references( &parsed_source, @@ -332,11 +332,15 @@ async fn generate_lint_diagnostics( } Some(Err(_)) => Vec::new(), None => { - error!("Missing file contents for: {}", specifier); + error!("Missing file contents for: {}", document.specifier()); Vec::new() } }; - diagnostics_vec.push((specifier.clone(), version, diagnostics)); + diagnostics_vec.push(( + document.specifier().clone(), + version, + diagnostics, + )); } } } @@ -356,14 +360,14 @@ async fn generate_ts_diagnostics( let collection = collection.lock().await; snapshot .documents - .specifiers(true, true) + .documents(true, true) .iter() - .filter_map(|s| { - let version = snapshot.documents.lsp_version(s); + .filter_map(|d| { + let version = d.maybe_lsp_version(); let current_version = - collection.get_version(s, &DiagnosticSource::TypeScript); + collection.get_version(d.specifier(), &DiagnosticSource::TypeScript); if version != current_version { - Some(s.clone()) + Some(d.specifier().clone()) } else { None } @@ -376,7 +380,11 @@ async fn generate_ts_diagnostics( ts_server.request(snapshot.clone(), req).await?; for (specifier_str, ts_diagnostics) in ts_diagnostics_map { let specifier = resolve_url(&specifier_str)?; - let version = snapshot.documents.lsp_version(&specifier); + let version = snapshot + .documents + .get(&specifier) + .map(|d| d.maybe_lsp_version()) + .flatten(); diagnostics_vec.push(( specifier, version, @@ -421,7 +429,18 @@ fn diagnose_dependency( ) { match resolved { Some(Ok((specifier, range))) => { - if !documents.contains_specifier(specifier) { + if let Some(doc) = documents.get(specifier) { + if let Some(message) = doc.maybe_warning() { + diagnostics.push(lsp::Diagnostic { + range: documents::to_lsp_range(range), + severity: Some(lsp::DiagnosticSeverity::Warning), + code: Some(lsp::NumberOrString::String("deno-warn".to_string())), + source: Some("deno".to_string()), + message, + ..Default::default() + }) + } + } else { 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()), @@ -437,15 +456,6 @@ fn diagnose_dependency( data: Some(json!({ "specifier": specifier })), ..Default::default() }); - } else if let Some(message) = documents.maybe_warning(specifier) { - diagnostics.push(lsp::Diagnostic { - range: documents::to_lsp_range(range), - severity: Some(lsp::DiagnosticSeverity::Warning), - code: Some(lsp::NumberOrString::String("deno-warn".to_string())), - source: Some("deno".to_string()), - message, - ..Default::default() - }) } } Some(Err(err)) => diagnostics.push(lsp::Diagnostic { @@ -471,18 +481,18 @@ async fn generate_deps_diagnostics( tokio::task::spawn(async move { let mut diagnostics_vec = Vec::new(); - for specifier in documents.specifiers(true, true) { - if !config.specifier_enabled(&specifier) { + for document in documents.documents(true, true) { + if !config.specifier_enabled(document.specifier()) { continue; } - let version = documents.lsp_version(&specifier); + let version = document.maybe_lsp_version(); let current_version = collection .lock() .await - .get_version(&specifier, &DiagnosticSource::Deno); + .get_version(document.specifier(), &DiagnosticSource::Deno); if version != current_version { let mut diagnostics = Vec::new(); - if let Some(dependencies) = documents.dependencies(&specifier) { + if let Some(dependencies) = document.dependencies() { for (_, dependency) in dependencies { diagnose_dependency( &mut diagnostics, @@ -496,7 +506,11 @@ async fn generate_deps_diagnostics( ); } } - diagnostics_vec.push((specifier.clone(), version, diagnostics)); + diagnostics_vec.push(( + document.specifier().clone(), + version, + diagnostics, + )); } } @@ -533,9 +547,14 @@ async fn publish_diagnostics( diagnostics .extend(collection.get(&specifier, DiagnosticSource::Deno).cloned()); } - let uri = specifier.clone(); - let version = snapshot.documents.lsp_version(&specifier); - client.publish_diagnostics(uri, diagnostics, version).await; + let version = snapshot + .documents + .get(&specifier) + .map(|d| d.maybe_lsp_version()) + .flatten(); + client + .publish_diagnostics(specifier.clone(), diagnostics, version) + .await; } } } @@ -678,7 +697,7 @@ mod tests { let (snapshot, collection, _) = setup(&[( "file:///a.ts", r#"import * as b from "./b.ts"; - + let a = "a"; console.log(a); "#, |