diff options
author | Nayeem Rahman <nayeemrmn99@gmail.com> | 2024-05-09 20:22:27 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-05-09 20:22:27 +0100 |
commit | 439b3b8db97106be44bb5fde9573632c20ed4e95 (patch) | |
tree | 22c54102ccddecaa0209d128f71fb33fc891fe4e /cli/lsp/tsc.rs | |
parent | f0e8ec01461519dddcb61f1b91b4455a354e38e6 (diff) |
refactor(lsp): unify caching into LspCache (#23746)
Diffstat (limited to 'cli/lsp/tsc.rs')
-rw-r--r-- | cli/lsp/tsc.rs | 114 |
1 files changed, 28 insertions, 86 deletions
diff --git a/cli/lsp/tsc.rs b/cli/lsp/tsc.rs index ec1eb29fa..fa35f63bd 100644 --- a/cli/lsp/tsc.rs +++ b/cli/lsp/tsc.rs @@ -22,9 +22,6 @@ use super::urls::INVALID_SPECIFIER; use crate::args::jsr_url; use crate::args::FmtOptionsConfig; -use crate::cache::HttpCache; -use crate::lsp::cache::CacheMetadata; -use crate::lsp::documents::Documents; use crate::lsp::logging::lsp_warn; use crate::tsc; use crate::tsc::ResolveArgs; @@ -220,7 +217,6 @@ fn normalize_diagnostic( pub struct TsServer { performance: Arc<Performance>, - cache: Arc<dyn HttpCache>, sender: mpsc::UnboundedSender<Request>, receiver: Mutex<Option<mpsc::UnboundedReceiver<Request>>>, specifier_map: Arc<TscSpecifierMap>, @@ -232,7 +228,6 @@ impl std::fmt::Debug for TsServer { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.debug_struct("TsServer") .field("performance", &self.performance) - .field("cache", &self.cache) .field("sender", &self.sender) .field("receiver", &self.receiver) .field("specifier_map", &self.specifier_map) @@ -331,11 +326,10 @@ impl PendingChange { } impl TsServer { - pub fn new(performance: Arc<Performance>, cache: Arc<dyn HttpCache>) -> Self { + pub fn new(performance: Arc<Performance>) -> Self { let (tx, request_rx) = mpsc::unbounded_channel::<Request>(); Self { performance, - cache, sender: tx, receiver: Mutex::new(Some(request_rx)), specifier_map: Arc::new(TscSpecifierMap::new()), @@ -363,13 +357,11 @@ impl TsServer { // on the `TsServer` struct. let receiver = self.receiver.lock().take().unwrap(); let performance = self.performance.clone(); - let cache = self.cache.clone(); let specifier_map = self.specifier_map.clone(); let _join_handle = thread::spawn(move || { run_tsc_thread( receiver, performance.clone(), - cache.clone(), specifier_map.clone(), maybe_inspector_server, ) @@ -4340,7 +4332,6 @@ impl TscRuntime { fn run_tsc_thread( mut request_rx: UnboundedReceiver<Request>, performance: Arc<Performance>, - cache: Arc<dyn HttpCache>, specifier_map: Arc<TscSpecifierMap>, maybe_inspector_server: Option<Arc<InspectorServer>>, ) { @@ -4349,7 +4340,7 @@ fn run_tsc_thread( // supplied snapshot is an isolate that contains the TypeScript language // server. let mut tsc_runtime = JsRuntime::new(RuntimeOptions { - extensions: vec![deno_tsc::init_ops(performance, cache, specifier_map)], + extensions: vec![deno_tsc::init_ops(performance, specifier_map)], startup_snapshot: Some(tsc::compiler_snapshot()), inspector: maybe_inspector_server.is_some(), ..Default::default() @@ -4422,19 +4413,11 @@ deno_core::extension!(deno_tsc, ], options = { performance: Arc<Performance>, - cache: Arc<dyn HttpCache>, specifier_map: Arc<TscSpecifierMap>, }, state = |state, options| { state.put(State::new( - Arc::new(StateSnapshot { - project_version: 0, - assets: Default::default(), - cache_metadata: CacheMetadata::new(options.cache.clone()), - config: Default::default(), - documents: Documents::new(options.cache.clone()), - resolver: Default::default(), - }), + Default::default(), options.specifier_map, options.performance, )); @@ -5078,11 +5061,9 @@ impl TscRequest { #[cfg(test)] mod tests { use super::*; - use crate::cache::GlobalHttpCache; use crate::cache::HttpCache; - use crate::cache::RealDenoCacheEnv; use crate::http_util::HeadersMap; - use crate::lsp::cache::CacheMetadata; + use crate::lsp::cache::LspCache; use crate::lsp::config::Config; use crate::lsp::config::WorkspaceSettings; use crate::lsp::documents::Documents; @@ -5090,29 +5071,14 @@ mod tests { use crate::lsp::resolver::LspResolver; use crate::lsp::text::LineIndex; use pretty_assertions::assert_eq; - use std::path::Path; use test_util::TempDir; - async fn mock_state_snapshot( - fixtures: &[(&str, &str, i32, LanguageId)], - location: &Path, + async fn setup( ts_config: Value, - ) -> 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(), - ); - } + sources: &[(&str, &str, i32, LanguageId)], + ) -> (TsServer, Arc<StateSnapshot>, LspCache) { + let temp_dir = TempDir::new(); + let cache = LspCache::new(Some(temp_dir.uri())); let mut config = Config::default(); config .tree @@ -5129,30 +5095,29 @@ mod tests { ) .await; let resolver = LspResolver::default() - .with_new_config(&config, cache.clone(), None, None) + .with_new_config(&config, &cache, None) .await; - StateSnapshot { + 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(), + ); + } + let snapshot = Arc::new(StateSnapshot { project_version: 0, documents, assets: Default::default(), - cache_metadata: CacheMetadata::new(cache), config: Arc::new(config), resolver, - } - } - - async fn setup( - temp_dir: &TempDir, - config: Value, - sources: &[(&str, &str, i32, LanguageId)], - ) -> (TsServer, Arc<StateSnapshot>, Arc<GlobalHttpCache>) { - let location = temp_dir.path().join("deps").to_path_buf(); - let cache = - Arc::new(GlobalHttpCache::new(location.clone(), RealDenoCacheEnv)); - let snapshot = - Arc::new(mock_state_snapshot(sources, &location, config).await); + }); let performance = Arc::new(Performance::default()); - let ts_server = TsServer::new(performance, cache.clone()); + let ts_server = TsServer::new(performance); ts_server.start(None).unwrap(); (ts_server, snapshot, cache) } @@ -5182,9 +5147,7 @@ mod tests { #[tokio::test] async fn test_get_diagnostics() { - let temp_dir = TempDir::new(); let (ts_server, snapshot, _) = setup( - &temp_dir, json!({ "target": "esnext", "module": "esnext", @@ -5230,9 +5193,7 @@ mod tests { #[tokio::test] async fn test_get_diagnostics_lib() { - let temp_dir = TempDir::new(); let (ts_server, snapshot, _) = setup( - &temp_dir, json!({ "target": "esnext", "module": "esnext", @@ -5258,9 +5219,7 @@ mod tests { #[tokio::test] async fn test_module_resolution() { - let temp_dir = TempDir::new(); let (ts_server, snapshot, _) = setup( - &temp_dir, json!({ "target": "esnext", "module": "esnext", @@ -5291,9 +5250,7 @@ mod tests { #[tokio::test] async fn test_bad_module_specifiers() { - let temp_dir = TempDir::new(); let (ts_server, snapshot, _) = setup( - &temp_dir, json!({ "target": "esnext", "module": "esnext", @@ -5339,9 +5296,7 @@ mod tests { #[tokio::test] async fn test_remote_modules() { - let temp_dir = TempDir::new(); let (ts_server, snapshot, _) = setup( - &temp_dir, json!({ "target": "esnext", "module": "esnext", @@ -5372,9 +5327,7 @@ mod tests { #[tokio::test] async fn test_partial_modules() { - let temp_dir = TempDir::new(); let (ts_server, snapshot, _) = setup( - &temp_dir, json!({ "target": "esnext", "module": "esnext", @@ -5441,9 +5394,7 @@ mod tests { #[tokio::test] async fn test_no_debug_failure() { - let temp_dir = TempDir::new(); let (ts_server, snapshot, _) = setup( - &temp_dir, json!({ "target": "esnext", "module": "esnext", @@ -5489,8 +5440,7 @@ mod tests { #[tokio::test] async fn test_request_assets() { - let temp_dir = TempDir::new(); - let (ts_server, snapshot, _) = setup(&temp_dir, json!({}), &[]).await; + let (ts_server, snapshot, _) = setup(json!({}), &[]).await; let assets = get_isolate_assets(&ts_server, snapshot).await; let mut asset_names = assets .iter() @@ -5522,9 +5472,7 @@ mod tests { #[tokio::test] async fn test_modify_sources() { - let temp_dir = TempDir::new(); let (ts_server, snapshot, cache) = setup( - &temp_dir, json!({ "target": "esnext", "module": "esnext", @@ -5547,6 +5495,7 @@ mod tests { let specifier_dep = resolve_url("https://deno.land/x/example/a.ts").unwrap(); cache + .global() .set( &specifier_dep, HeadersMap::default(), @@ -5581,6 +5530,7 @@ mod tests { }) ); cache + .global() .set( &specifier_dep, HeadersMap::default(), @@ -5656,9 +5606,7 @@ mod tests { character: 16, }) .unwrap(); - let temp_dir = TempDir::new(); let (ts_server, snapshot, _) = setup( - &temp_dir, json!({ "target": "esnext", "module": "esnext", @@ -5807,9 +5755,7 @@ mod tests { character: 33, }) .unwrap(); - let temp_dir = TempDir::new(); let (ts_server, snapshot, _) = setup( - &temp_dir, json!({ "target": "esnext", "module": "esnext", @@ -5916,9 +5862,7 @@ mod tests { #[tokio::test] async fn test_get_edits_for_file_rename() { - let temp_dir = TempDir::new(); let (ts_server, snapshot, _) = setup( - &temp_dir, json!({ "target": "esnext", "module": "esnext", @@ -5994,9 +5938,7 @@ mod tests { #[tokio::test] async fn resolve_unknown_dependency() { - let temp_dir = TempDir::new(); let (_, snapshot, _) = setup( - &temp_dir, json!({ "target": "esnext", "module": "esnext", |