summaryrefslogtreecommitdiff
path: root/cli/lsp/diagnostics.rs
diff options
context:
space:
mode:
authorNayeem Rahman <nayeemrmn99@gmail.com>2024-05-09 20:22:27 +0100
committerGitHub <noreply@github.com>2024-05-09 20:22:27 +0100
commit439b3b8db97106be44bb5fde9573632c20ed4e95 (patch)
tree22c54102ccddecaa0209d128f71fb33fc891fe4e /cli/lsp/diagnostics.rs
parentf0e8ec01461519dddcb61f1b91b4455a354e38e6 (diff)
refactor(lsp): unify caching into LspCache (#23746)
Diffstat (limited to 'cli/lsp/diagnostics.rs')
-rw-r--r--cli/lsp/diagnostics.rs132
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#"