diff options
Diffstat (limited to 'cli/lsp/diagnostics.rs')
-rw-r--r-- | cli/lsp/diagnostics.rs | 132 |
1 files changed, 52 insertions, 80 deletions
diff --git a/cli/lsp/diagnostics.rs b/cli/lsp/diagnostics.rs index ebd6338cd..edaf30e83 100644 --- a/cli/lsp/diagnostics.rs +++ b/cli/lsp/diagnostics.rs @@ -1,7 +1,6 @@ // Copyright 2018-2024 the Deno authors. All rights reserved. MIT license. use super::analysis; -use super::cache; use super::client::Client; use super::config::Config; use super::documents; @@ -1328,17 +1327,18 @@ fn diagnose_resolution( match resolution { Resolution::Ok(resolved) => { let specifier = &resolved.specifier; - // 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) { - if let Some(message) = - metadata.get(&cache::MetadataKey::Warning).cloned() - { - diagnostics.push(DenoDiagnostic::DenoWarn(message)); + let managed_npm_resolver = snapshot.resolver.maybe_managed_npm_resolver(); + for (_, headers) in snapshot.resolver.redirect_chain_headers(specifier) { + if let Some(message) = headers.get("x-deno-warning") { + diagnostics.push(DenoDiagnostic::DenoWarn(message.clone())); } } - let managed_npm_resolver = snapshot.resolver.maybe_managed_npm_resolver(); if let Some(doc) = snapshot.documents.get(specifier) { + if let Some(headers) = doc.maybe_headers() { + if let Some(message) = headers.get("x-deno-warning") { + diagnostics.push(DenoDiagnostic::DenoWarn(message.clone())); + } + } if let Some(diagnostic) = check_redirect_diagnostic(specifier, &doc) { diagnostics.push(diagnostic); } @@ -1563,9 +1563,9 @@ fn generate_deno_diagnostics( #[cfg(test)] mod tests { + use super::*; - use crate::cache::GlobalHttpCache; - use crate::cache::RealDenoCacheEnv; + use crate::lsp::cache::LspCache; use crate::lsp::config::Config; use crate::lsp::config::Settings; use crate::lsp::config::WorkspaceSettings; @@ -1575,57 +1575,9 @@ mod tests { use crate::lsp::resolver::LspResolver; use deno_config::ConfigFile; use pretty_assertions::assert_eq; - use std::path::Path; - use std::path::PathBuf; use std::sync::Arc; use test_util::TempDir; - async fn mock_state_snapshot( - fixtures: &[(&str, &str, i32, LanguageId)], - location: &Path, - maybe_import_map: Option<(&str, &str)>, - ) -> StateSnapshot { - let cache = Arc::new(GlobalHttpCache::new( - location.to_path_buf(), - RealDenoCacheEnv, - )); - let mut documents = Documents::new(cache.clone()); - for (specifier, source, version, language_id) in fixtures { - let specifier = - resolve_url(specifier).expect("failed to create specifier"); - documents.open( - specifier.clone(), - *version, - *language_id, - (*source).into(), - ); - } - let mut config = Config::new_with_roots([resolve_url("file:///").unwrap()]); - if let Some((base_url, json_string)) = maybe_import_map { - let base_url = resolve_url(base_url).unwrap(); - let config_file = ConfigFile::new( - json_string, - base_url, - &deno_config::ParseOptions::default(), - ) - .unwrap(); - config.tree.inject_config_file(config_file).await; - } - let resolver = LspResolver::default() - .with_new_config(&config, cache, None, None) - .await; - StateSnapshot { - project_version: 0, - documents, - assets: Default::default(), - cache_metadata: cache::CacheMetadata::new(Arc::new( - GlobalHttpCache::new(location.to_path_buf(), RealDenoCacheEnv), - )), - config: Arc::new(config), - resolver, - } - } - fn mock_config() -> Config { let root_uri = resolve_url("file:///").unwrap(); Config { @@ -1649,21 +1601,49 @@ mod tests { } async fn setup( - temp_dir: &TempDir, sources: &[(&str, &str, i32, LanguageId)], maybe_import_map: Option<(&str, &str)>, - ) -> (StateSnapshot, PathBuf) { - let location = temp_dir.path().join("deps").to_path_buf(); - let state_snapshot = - mock_state_snapshot(sources, &location, maybe_import_map).await; - (state_snapshot, location) + ) -> StateSnapshot { + let temp_dir = TempDir::new(); + let cache = LspCache::new(Some(temp_dir.uri())); + let mut config = Config::new_with_roots([resolve_url("file:///").unwrap()]); + if let Some((base_url, json_string)) = maybe_import_map { + let base_url = resolve_url(base_url).unwrap(); + let config_file = ConfigFile::new( + json_string, + base_url, + &deno_config::ParseOptions::default(), + ) + .unwrap(); + config.tree.inject_config_file(config_file).await; + } + let resolver = LspResolver::default() + .with_new_config(&config, &cache, None) + .await; + let mut documents = Documents::default(); + documents.update_config(&config, &resolver, &cache, &Default::default()); + for (specifier, source, version, language_id) in sources { + let specifier = + resolve_url(specifier).expect("failed to create specifier"); + documents.open( + specifier.clone(), + *version, + *language_id, + (*source).into(), + ); + } + StateSnapshot { + project_version: 0, + documents, + assets: Default::default(), + config: Arc::new(config), + resolver, + } } #[tokio::test] async fn test_enabled_then_disabled_specifier() { - let temp_dir = TempDir::new(); - let (snapshot, cache_location) = setup( - &temp_dir, + let snapshot = setup( &[( "file:///a.ts", r#"import * as b from "./b.ts"; @@ -1677,9 +1657,7 @@ let c: number = "a"; ) .await; let snapshot = Arc::new(snapshot); - let cache = - Arc::new(GlobalHttpCache::new(cache_location, RealDenoCacheEnv)); - let ts_server = TsServer::new(Default::default(), cache); + let ts_server = TsServer::new(Default::default()); ts_server.start(None).unwrap(); // test enabled @@ -1757,9 +1735,7 @@ let c: number = "a"; #[tokio::test] async fn test_deno_diagnostics_with_import_map() { - let temp_dir = TempDir::new(); - let (snapshot, _) = setup( - &temp_dir, + let snapshot = setup( &[ ( "file:///std/assert/mod.ts", @@ -1895,9 +1871,7 @@ let c: number = "a"; #[tokio::test] async fn duplicate_diagnostics_for_duplicate_imports() { - let temp_dir = TempDir::new(); - let (snapshot, _) = setup( - &temp_dir, + let snapshot = setup( &[( "file:///a.ts", r#" @@ -1973,9 +1947,7 @@ let c: number = "a"; #[tokio::test] async fn unable_to_load_a_local_module() { - let temp_dir = TempDir::new(); - let (snapshot, _) = setup( - &temp_dir, + let snapshot = setup( &[( "file:///a.ts", r#" |