From 7fd5cc21837792cf10ddf9d04ee677556ef62227 Mon Sep 17 00:00:00 2001 From: Will Ruggiano Date: Fri, 4 Apr 2025 20:16:25 -0700 Subject: [PATCH 1/3] feat: allow configuration through workspace/didChangeConfiguration --- crates/pgt_configuration/src/lib.rs | 6 ++++++ crates/pgt_lsp/src/server.rs | 10 ++++++---- crates/pgt_lsp/src/session.rs | 21 ++++++++++++-------- crates/pgt_workspace/src/workspace/server.rs | 1 + 4 files changed, 26 insertions(+), 12 deletions(-) diff --git a/crates/pgt_configuration/src/lib.rs b/crates/pgt_configuration/src/lib.rs index fcf0b5c6..fe9722e0 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::{ @@ -116,6 +117,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 db17dfd1..aaffcaf5 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, }); diff --git a/crates/pgt_workspace/src/workspace/server.rs b/crates/pgt_workspace/src/workspace/server.rs index 3c14f352..5a7bfc44 100644 --- a/crates/pgt_workspace/src/workspace/server.rs +++ b/crates/pgt_workspace/src/workspace/server.rs @@ -167,6 +167,7 @@ impl Workspace for WorkspaceServer { )?; tracing::info!("Updated settings in workspace"); + tracing::debug!("Updated settings are {:#?}", self.settings()); self.connection .write() From 77792ea23e9cd737ceb1da3d09c650fd14da98e2 Mon Sep 17 00:00:00 2001 From: Will Ruggiano Date: Tue, 22 Apr 2025 22:34:49 -0700 Subject: [PATCH 2/3] fixup! feat: allow configuration through workspace/didChangeConfiguration --- crates/pgt_configuration/src/lib.rs | 6 ------ crates/pgt_lsp/src/session.rs | 24 +++++++++++++++--------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/crates/pgt_configuration/src/lib.rs b/crates/pgt_configuration/src/lib.rs index fe9722e0..fcf0b5c6 100644 --- a/crates/pgt_configuration/src/lib.rs +++ b/crates/pgt_configuration/src/lib.rs @@ -22,7 +22,6 @@ 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::{ @@ -117,11 +116,6 @@ 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/session.rs b/crates/pgt_lsp/src/session.rs index aaffcaf5..7ccf2bab 100644 --- a/crates/pgt_lsp/src/session.rs +++ b/crates/pgt_lsp/src/session.rs @@ -3,6 +3,7 @@ use crate::diagnostics::LspError; use crate::documents::Document; use crate::utils; use anyhow::Result; +use biome_deserialize::Merge; use futures::StreamExt; use futures::stream::FuturesUnordered; use pgt_analyse::RuleCategoriesBuilder; @@ -386,11 +387,13 @@ 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, params: Option) { + pub(crate) async fn load_workspace_settings(&self, extra_config: 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, params).await; + let status = self + .load_pgt_configuration_file(base_path, extra_config) + .await; self.set_configuration_status(status); } else if let Some(folders) = self.get_workspace_folders() { info!("Detected workspace folder."); @@ -403,7 +406,7 @@ impl Session { let status = self .load_pgt_configuration_file( ConfigurationPathHint::FromWorkspace(base_path), - params.clone(), + extra_config.clone(), ) .await; self.set_configuration_status(status); @@ -421,7 +424,9 @@ impl Session { None => ConfigurationPathHint::default(), Some(path) => ConfigurationPathHint::FromLsp(path), }; - let status = self.load_pgt_configuration_file(base_path, params).await; + let status = self + .load_pgt_configuration_file(base_path, extra_config) + .await; self.set_configuration_status(status); } } @@ -434,13 +439,17 @@ impl Session { match load_configuration(&self.fs, base_path.clone()) { Ok(loaded_configuration) => { let LoadedConfiguration { - configuration: fs_configuration, + configuration: mut fs_configuration, directory_path: configuration_path, .. } = loaded_configuration; info!("Configuration loaded successfully from disk."); info!("Update workspace settings."); + if let Some(ws_configuration) = extra_config { + fs_configuration.merge_with(ws_configuration); + } + let result = fs_configuration .retrieve_gitignore_matches(&self.fs, configuration_path.as_deref()); @@ -448,10 +457,7 @@ impl Session { Ok((vcs_base_path, gitignore_matches)) => { let result = self.workspace.update_settings(UpdateSettingsParams { workspace_directory: self.fs.working_directory(), - configuration: match extra_config { - Some(config) => fs_configuration.clone().merge(config), - None => fs_configuration, - }, + configuration: fs_configuration, vcs_base_path, gitignore_matches, }); From 550049efd981bdee3cb71dd68725cb86f8185429 Mon Sep 17 00:00:00 2001 From: Will Ruggiano Date: Fri, 25 Apr 2025 14:03:58 -0700 Subject: [PATCH 3/3] fixup! feat: allow configuration through workspace/didChangeConfiguration --- biome.jsonc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/biome.jsonc b/biome.jsonc index 36b60d9b..582bee9b 100644 --- a/biome.jsonc +++ b/biome.jsonc @@ -1,5 +1,5 @@ { - "$schema": "https://biomejs.dev/schemas/1.9.4/schema.json", + "$schema": "./node_modules/@biomejs/biome/configuration_schema.json", "vcs": { "enabled": false, "clientKind": "git", @@ -8,7 +8,7 @@ "files": { "ignoreUnknown": false, "ignore": [], - "include": ["packages/**/*"] + "include": ["/packages/**/*"] }, "formatter": { "enabled": true,