diff options
author | Nayeem Rahman <nayeemrmn99@gmail.com> | 2024-05-08 06:34:42 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-05-08 06:34:42 +0100 |
commit | 5e6c72d39fc6bf809a71e4074e7d6f516d18486a (patch) | |
tree | ab0c15c01c4b73acf0ef49fa3a572f7c700709f8 /cli/lsp/language_server.rs | |
parent | 5379bb0289faaf39df9d3ce8e02c1d2f631e2696 (diff) |
refactor(lsp): cleanup partially locking methods (#23723)
Diffstat (limited to 'cli/lsp/language_server.rs')
-rw-r--r-- | cli/lsp/language_server.rs | 244 |
1 files changed, 111 insertions, 133 deletions
diff --git a/cli/lsp/language_server.rs b/cli/lsp/language_server.rs index f7b509a1c..67eaca74e 100644 --- a/cli/lsp/language_server.rs +++ b/cli/lsp/language_server.rs @@ -747,12 +747,6 @@ impl Inner { } { - if let Some(options) = params.initialization_options { - self.config.set_workspace_settings( - WorkspaceSettings::from_initialization_options(options), - vec![], - ); - } let mut workspace_folders = vec![]; if let Some(folders) = params.workspace_folders { workspace_folders = folders @@ -784,9 +778,16 @@ impl Inner { } } self.config.set_workspace_folders(workspace_folders); + if let Some(options) = params.initialization_options { + self.config.set_workspace_settings( + WorkspaceSettings::from_initialization_options(options), + vec![], + ); + } self.config.update_capabilities(¶ms.capabilities); } + self.diagnostics_server.start(); if let Err(e) = self .ts_server .start(self.config.internal_inspect().to_address()) @@ -1023,12 +1024,14 @@ impl Inner { Ok(()) } - fn did_open( - &mut self, - specifier: &ModuleSpecifier, - params: DidOpenTextDocumentParams, - ) -> Arc<Document> { + async fn did_open(&mut self, params: DidOpenTextDocumentParams) { let mark = self.performance.mark_with_args("lsp.did_open", ¶ms); + if params.text_document.uri.scheme() == "deno" { + // we can ignore virtual text documents opening, as they don't need to + // be tracked in memory, as they are static assets that won't change + // already managed by the language service + return; + } let language_id = params .text_document @@ -1045,6 +1048,9 @@ impl Inner { params.text_document.uri ); } + let specifier = self + .url_map + .normalize_url(¶ms.text_document.uri, LspUrlKind::File); let document = self.documents.open( specifier.clone(), params.text_document.version, @@ -1052,9 +1058,13 @@ impl Inner { params.text_document.text.into(), ); self.project_changed([(document.specifier(), ChangeKind::Opened)], false); - + if document.is_diagnosable() { + self.refresh_npm_specifiers().await; + self.diagnostics_server.invalidate(&[specifier]); + self.send_diagnostics_update(); + self.send_testing_update(); + } self.performance.measure(mark); - document } async fn did_change(&mut self, params: DidChangeTextDocumentParams) { @@ -1084,6 +1094,34 @@ impl Inner { self.performance.measure(mark); } + fn did_save(&mut self, params: DidSaveTextDocumentParams) { + let _mark = self.performance.measure_scope("lsp.did_save"); + let specifier = self + .url_map + .normalize_url(¶ms.text_document.uri, LspUrlKind::File); + self.documents.save(&specifier); + if !self + .config + .workspace_settings_for_specifier(&specifier) + .cache_on_save + || !self.config.specifier_enabled(&specifier) + || !self.diagnostics_state.has_no_cache_diagnostics(&specifier) + { + return; + } + match specifier_to_file_path(&specifier) { + Ok(path) if is_importable_ext(&path) => {} + _ => return, + } + self.task_queue.queue_task(Box::new(|ls: LanguageServer| { + spawn(async move { + if let Err(err) = ls.cache(vec![], specifier.clone(), false).await { + lsp_warn!("Failed to cache \"{}\" on save: {:#}", &specifier, err); + } + }); + })); + } + async fn refresh_npm_specifiers(&mut self) { let package_reqs = self.documents.npm_package_reqs(); let resolver = self.resolver.clone(); @@ -1118,37 +1156,6 @@ impl Inner { self.performance.measure(mark); } - async fn did_change_configuration( - &mut self, - params: DidChangeConfigurationParams, - ) { - if !self.config.client_capabilities.workspace_configuration { - let config = params.settings.as_object().map(|settings| { - let deno = - serde_json::to_value(settings.get(SETTINGS_SECTION)).unwrap(); - let javascript = - serde_json::to_value(settings.get("javascript")).unwrap(); - let typescript = - serde_json::to_value(settings.get("typescript")).unwrap(); - WorkspaceSettings::from_raw_settings(deno, javascript, typescript) - }); - if let Some(settings) = config { - self.config.set_workspace_settings(settings, vec![]); - } - }; - - self.update_debug_flag(); - self.update_global_cache().await; - self.refresh_workspace_files(); - self.refresh_config_tree().await; - self.update_cache(); - self.refresh_resolver().await; - self.refresh_documents_config().await; - self.diagnostics_server.invalidate_all(); - self.send_diagnostics_update(); - self.send_testing_update(); - } - async fn did_change_watched_files( &mut self, params: DidChangeWatchedFilesParams, @@ -1233,32 +1240,6 @@ impl Inner { self.performance.measure(mark); } - fn did_change_workspace_folders( - &mut self, - params: DidChangeWorkspaceFoldersParams, - ) { - let mut workspace_folders = params - .event - .added - .into_iter() - .map(|folder| { - ( - self.url_map.normalize_url(&folder.uri, LspUrlKind::Folder), - folder, - ) - }) - .collect::<Vec<(ModuleSpecifier, WorkspaceFolder)>>(); - for (specifier, folder) in &self.config.workspace_folders { - if !params.event.removed.is_empty() - && params.event.removed.iter().any(|f| f.uri == folder.uri) - { - continue; - } - workspace_folders.push((specifier.clone(), folder.clone())); - } - self.config.set_workspace_folders(workspace_folders); - } - async fn document_symbol( &self, params: DocumentSymbolParams, @@ -2866,9 +2847,7 @@ impl tower_lsp::LanguageServer for LanguageServer { &self, params: InitializeParams, ) -> LspResult<InitializeResult> { - let mut language_server = self.0.write().await; - language_server.diagnostics_server.start(); - language_server.initialize(params).await + self.0.write().await.initialize(params).await } async fn initialized(&self, _: InitializedParams) { @@ -3007,24 +2986,7 @@ impl tower_lsp::LanguageServer for LanguageServer { } async fn did_open(&self, params: DidOpenTextDocumentParams) { - if params.text_document.uri.scheme() == "deno" { - // we can ignore virtual text documents opening, as they don't need to - // be tracked in memory, as they are static assets that won't change - // already managed by the language service - return; - } - - let mut inner = self.0.write().await; - let specifier = inner - .url_map - .normalize_url(¶ms.text_document.uri, LspUrlKind::File); - let document = inner.did_open(&specifier, params); - if document.is_diagnosable() { - inner.refresh_npm_specifiers().await; - inner.diagnostics_server.invalidate(&[specifier]); - inner.send_diagnostics_update(); - inner.send_testing_update(); - } + self.0.write().await.did_open(params).await; } async fn did_change(&self, params: DidChangeTextDocumentParams) { @@ -3032,29 +2994,7 @@ impl tower_lsp::LanguageServer for LanguageServer { } async fn did_save(&self, params: DidSaveTextDocumentParams) { - let uri = ¶ms.text_document.uri; - let specifier = { - let mut inner = self.0.write().await; - let specifier = inner.url_map.normalize_url(uri, LspUrlKind::File); - inner.documents.save(&specifier); - if !inner - .config - .workspace_settings_for_specifier(&specifier) - .cache_on_save - || !inner.config.specifier_enabled(&specifier) - || !inner.diagnostics_state.has_no_cache_diagnostics(&specifier) - { - return; - } - match specifier_to_file_path(&specifier) { - Ok(path) if is_importable_ext(&path) => {} - _ => return, - } - specifier - }; - if let Err(err) = self.cache(vec![], specifier.clone(), false).await { - lsp_warn!("Failed to cache \"{}\" on save: {:#}", &specifier, err); - } + self.0.write().await.did_save(params); } async fn did_close(&self, params: DidCloseTextDocumentParams) { @@ -3071,11 +3011,32 @@ impl tower_lsp::LanguageServer for LanguageServer { .performance .mark_with_args("lsp.did_change_configuration", ¶ms) }; - self.refresh_configuration().await; - let mut inner = self.0.write().await; - inner.did_change_configuration(params).await; + if !inner.config.client_capabilities.workspace_configuration { + let config = params.settings.as_object().map(|settings| { + let deno = + serde_json::to_value(settings.get(SETTINGS_SECTION)).unwrap(); + let javascript = + serde_json::to_value(settings.get("javascript")).unwrap(); + let typescript = + serde_json::to_value(settings.get("typescript")).unwrap(); + WorkspaceSettings::from_raw_settings(deno, javascript, typescript) + }); + if let Some(settings) = config { + inner.config.set_workspace_settings(settings, vec![]); + } + }; + inner.update_debug_flag(); + inner.update_global_cache().await; + inner.refresh_workspace_files(); + inner.refresh_config_tree().await; + inner.update_cache(); + inner.refresh_resolver().await; + inner.refresh_documents_config().await; + inner.diagnostics_server.invalidate_all(); + inner.send_diagnostics_update(); + inner.send_testing_update(); inner.performance.measure(mark); } @@ -3090,26 +3051,43 @@ impl tower_lsp::LanguageServer for LanguageServer { &self, params: DidChangeWorkspaceFoldersParams, ) { - let (performance, mark) = { - let mut ls = self.0.write().await; - let mark = ls + let mark = { + let mut inner = self.0.write().await; + let mark = inner .performance .mark_with_args("lsp.did_change_workspace_folders", ¶ms); - ls.did_change_workspace_folders(params); - (ls.performance.clone(), mark) + let mut workspace_folders = params + .event + .added + .into_iter() + .map(|folder| { + ( + inner.url_map.normalize_url(&folder.uri, LspUrlKind::Folder), + folder, + ) + }) + .collect::<Vec<(ModuleSpecifier, WorkspaceFolder)>>(); + for (specifier, folder) in &inner.config.workspace_folders { + if !params.event.removed.is_empty() + && params.event.removed.iter().any(|f| f.uri == folder.uri) + { + continue; + } + workspace_folders.push((specifier.clone(), folder.clone())); + } + inner.config.set_workspace_folders(workspace_folders); + mark }; - self.refresh_configuration().await; - { - let mut ls = self.0.write().await; - ls.refresh_workspace_files(); - ls.refresh_config_tree().await; - ls.refresh_resolver().await; - ls.refresh_documents_config().await; - ls.diagnostics_server.invalidate_all(); - ls.send_diagnostics_update(); - } - performance.measure(mark); + let mut inner = self.0.write().await; + inner.refresh_workspace_files(); + inner.refresh_config_tree().await; + inner.refresh_resolver().await; + inner.refresh_documents_config().await; + inner.diagnostics_server.invalidate_all(); + inner.send_diagnostics_update(); + inner.send_testing_update(); + inner.performance.measure(mark); } async fn document_symbol( |