diff --git a/crates/pgt_configuration/src/lib.rs b/crates/pgt_configuration/src/lib.rs index f262450d..59cb8a7c 100644 --- a/crates/pgt_configuration/src/lib.rs +++ b/crates/pgt_configuration/src/lib.rs @@ -22,6 +22,7 @@ pub use analyser::{ RulePlainConfiguration, RuleSelector, RuleWithFixOptions, RuleWithOptions, Rules, partial_linter_configuration, }; +use biome_deserialize::Merge; use biome_deserialize_macros::{Merge, Partial}; use bpaf::Bpaf; use database::{ @@ -115,6 +116,11 @@ impl PartialConfiguration { }), } } + + pub fn merge(&mut self, other: Self) -> Self { + self.merge_with(other); + self.clone() + } } pub struct ConfigurationPayload { diff --git a/crates/pgt_lsp/src/server.rs b/crates/pgt_lsp/src/server.rs index 9bf9b9c2..4c05c0e4 100644 --- a/crates/pgt_lsp/src/server.rs +++ b/crates/pgt_lsp/src/server.rs @@ -132,7 +132,7 @@ impl LanguageServer for LSPServer { ConfigName::pgt_jsonc() ); - futures::join!(self.session.load_workspace_settings()); + futures::join!(self.session.load_workspace_settings(None)); let msg = format!("Server initialized with PID: {}", std::process::id()); self.session @@ -152,8 +152,10 @@ impl LanguageServer for LSPServer { } #[tracing::instrument(level = "info", skip_all)] - async fn did_change_configuration(&self, _params: DidChangeConfigurationParams) { - self.session.load_workspace_settings().await; + async fn did_change_configuration(&self, params: DidChangeConfigurationParams) { + self.session + .load_workspace_settings(serde_json::from_value(params.settings).ok()) + .await; self.setup_capabilities().await; self.session.update_all_diagnostics().await; } @@ -174,7 +176,7 @@ impl LanguageServer for LSPServer { if ConfigName::file_names() .contains(&&*watched_file.display().to_string()) { - self.session.load_workspace_settings().await; + self.session.load_workspace_settings(None).await; self.setup_capabilities().await; // self.session.update_all_diagnostics().await; // for now we are only interested to the configuration file, diff --git a/crates/pgt_lsp/src/session.rs b/crates/pgt_lsp/src/session.rs index 64adf16a..3c03b466 100644 --- a/crates/pgt_lsp/src/session.rs +++ b/crates/pgt_lsp/src/session.rs @@ -6,7 +6,7 @@ use anyhow::Result; use futures::StreamExt; use futures::stream::FuturesUnordered; use pgt_analyse::RuleCategoriesBuilder; -use pgt_configuration::ConfigurationPathHint; +use pgt_configuration::{ConfigurationPathHint, PartialConfiguration}; use pgt_diagnostics::{DiagnosticExt, Error}; use pgt_fs::{FileSystem, PgTPath}; use pgt_workspace::Workspace; @@ -386,11 +386,11 @@ impl Session { /// This function attempts to read the `postgrestools.jsonc` configuration file from /// the root URI and update the workspace settings accordingly #[tracing::instrument(level = "trace", skip(self))] - pub(crate) async fn load_workspace_settings(&self) { + pub(crate) async fn load_workspace_settings(&self, params: Option) { // Providing a custom configuration path will not allow to support workspaces if let Some(config_path) = &self.config_path { let base_path = ConfigurationPathHint::FromUser(config_path.clone()); - let status = self.load_pgt_configuration_file(base_path).await; + let status = self.load_pgt_configuration_file(base_path, params).await; self.set_configuration_status(status); } else if let Some(folders) = self.get_workspace_folders() { info!("Detected workspace folder."); @@ -401,9 +401,10 @@ impl Session { match base_path { Ok(base_path) => { let status = self - .load_pgt_configuration_file(ConfigurationPathHint::FromWorkspace( - base_path, - )) + .load_pgt_configuration_file( + ConfigurationPathHint::FromWorkspace(base_path), + params.clone(), + ) .await; self.set_configuration_status(status); } @@ -420,7 +421,7 @@ impl Session { None => ConfigurationPathHint::default(), Some(path) => ConfigurationPathHint::FromLsp(path), }; - let status = self.load_pgt_configuration_file(base_path).await; + let status = self.load_pgt_configuration_file(base_path, params).await; self.set_configuration_status(status); } } @@ -428,6 +429,7 @@ impl Session { async fn load_pgt_configuration_file( &self, base_path: ConfigurationPathHint, + extra_config: Option, ) -> ConfigurationStatus { match load_configuration(&self.fs, base_path.clone()) { Ok(loaded_configuration) => { @@ -446,7 +448,10 @@ impl Session { Ok((vcs_base_path, gitignore_matches)) => { let result = self.workspace.update_settings(UpdateSettingsParams { workspace_directory: self.fs.working_directory(), - configuration: fs_configuration, + configuration: match extra_config { + Some(config) => fs_configuration.clone().merge(config), + None => fs_configuration, + }, vcs_base_path, gitignore_matches, skip_db: false, diff --git a/crates/pgt_workspace/src/workspace/server.rs b/crates/pgt_workspace/src/workspace/server.rs index 8dcbfb1d..ccbca926 100644 --- a/crates/pgt_workspace/src/workspace/server.rs +++ b/crates/pgt_workspace/src/workspace/server.rs @@ -165,6 +165,7 @@ impl Workspace for WorkspaceServer { )?; tracing::info!("Updated settings in workspace"); + tracing::debug!("Updated settings are {:#?}", self.settings()); if !params.skip_db { self.connection