diff options
author | Nayeem Rahman <nayeemrmn99@gmail.com> | 2023-10-24 21:27:27 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-10-24 21:27:27 +0100 |
commit | a7bd0cf7a890eff0133242d09e71b2783350fd23 (patch) | |
tree | 62ed1dfa6a29853f466e3822a16904a2a74f22c6 /test_util/src/lsp.rs | |
parent | 8f065a60e79e221a6ce7f6ce06c3022a85edb56a (diff) |
perf(lsp): cleanup workspace settings scopes (#20937)
Diffstat (limited to 'test_util/src/lsp.rs')
-rw-r--r-- | test_util/src/lsp.rs | 144 |
1 files changed, 91 insertions, 53 deletions
diff --git a/test_util/src/lsp.rs b/test_util/src/lsp.rs index 4e87503f2..352f5d365 100644 --- a/test_util/src/lsp.rs +++ b/test_util/src/lsp.rs @@ -210,7 +210,22 @@ pub struct InitializeParamsBuilder { impl InitializeParamsBuilder { #[allow(clippy::new_without_default)] - pub fn new() -> Self { + pub fn new(config: Value) -> Self { + let mut config_as_options = json!({}); + if let Some(object) = config.as_object() { + if let Some(deno) = object.get("deno") { + if let Some(deno) = deno.as_object() { + config_as_options = json!(deno.clone()); + } + } + let config_as_options = config_as_options.as_object_mut().unwrap(); + if let Some(typescript) = object.get("typescript") { + config_as_options.insert("typescript".to_string(), typescript.clone()); + } + if let Some(javascript) = object.get("javascript") { + config_as_options.insert("javascript".to_string(), javascript.clone()); + } + } Self { params: InitializeParams { process_id: None, @@ -219,38 +234,7 @@ impl InitializeParamsBuilder { version: Some("1.0.0".to_string()), }), root_uri: None, - initialization_options: Some(json!({ - "enableBuiltinCommands": true, - "enable": true, - "cache": null, - "certificateStores": null, - "codeLens": { - "implementations": true, - "references": true, - "test": true - }, - "config": null, - "importMap": null, - "lint": true, - "suggest": { - "autoImports": true, - "completeFunctionCalls": false, - "names": true, - "paths": true, - "imports": { - "hosts": {} - } - }, - "testing": { - "args": [ - "--allow-all" - ], - "enable": true - }, - "tlsCertificate": null, - "unsafelyIgnoreCertificateErrors": null, - "unstable": false - })), + initialization_options: Some(config_as_options), capabilities: ClientCapabilities { text_document: Some(TextDocumentClientCapabilities { code_action: Some(CodeActionClientCapabilities { @@ -686,21 +670,70 @@ impl LspClient { ) { self.initialize_with_config( do_build, - json!({"deno":{ - "enable": true - }}), + json!({ "deno": { + "enableBuiltinCommands": true, + "enable": true, + "cache": null, + "certificateStores": null, + "codeLens": { + "implementations": true, + "references": true, + "test": true, + }, + "config": null, + "importMap": null, + "lint": true, + "suggest": { + "autoImports": true, + "completeFunctionCalls": false, + "names": true, + "paths": true, + "imports": { + "hosts": {}, + }, + }, + "testing": { + "args": [ + "--allow-all" + ], + "enable": true, + }, + "tlsCertificate": null, + "unsafelyIgnoreCertificateErrors": null, + "unstable": false, + } }), ) } pub fn initialize_with_config( &mut self, do_build: impl Fn(&mut InitializeParamsBuilder), - config: Value, + mut config: Value, ) { - let mut builder = InitializeParamsBuilder::new(); + let mut builder = InitializeParamsBuilder::new(config.clone()); builder.set_root_uri(self.context.temp_dir().uri()); do_build(&mut builder); let params: InitializeParams = builder.build(); + // `config` must be updated to account for the builder changes. + // TODO(nayeemrmn): Remove config-related methods from builder. + if let Some(options) = ¶ms.initialization_options { + if let Some(options) = options.as_object() { + if let Some(config) = config.as_object_mut() { + let mut deno = options.clone(); + let typescript = options.get("typescript"); + let javascript = options.get("javascript"); + deno.remove("typescript"); + deno.remove("javascript"); + config.insert("deno".to_string(), json!(deno)); + if let Some(typescript) = typescript { + config.insert("typescript".to_string(), typescript.clone()); + } + if let Some(javascript) = javascript { + config.insert("javascript".to_string(), javascript.clone()); + } + } + } + } self.supports_workspace_configuration = match ¶ms.capabilities.workspace { Some(workspace) => workspace.configuration == Some(true), @@ -710,23 +743,12 @@ impl LspClient { self.write_notification("initialized", json!({})); self.config = config; if self.supports_workspace_configuration { - self.handle_configuration_request(&self.config.clone()); + self.handle_configuration_request(); } } pub fn did_open(&mut self, params: Value) -> CollectedDiagnostics { - self.did_open_with_config(params, &self.config.clone()) - } - - pub fn did_open_with_config( - &mut self, - params: Value, - config: &Value, - ) -> CollectedDiagnostics { self.did_open_raw(params); - if self.supports_workspace_configuration { - self.handle_configuration_request(config); - } self.read_diagnostics() } @@ -734,17 +756,33 @@ impl LspClient { self.write_notification("textDocument/didOpen", params); } - pub fn handle_configuration_request(&mut self, settings: &Value) { + pub fn change_configuration(&mut self, config: Value) { + self.config = config; + if self.supports_workspace_configuration { + self.write_notification( + "workspace/didChangeConfiguration", + json!({ "settings": {} }), + ); + self.handle_configuration_request(); + } else { + self.write_notification( + "workspace/didChangeConfiguration", + json!({ "settings": &self.config }), + ); + } + } + + pub fn handle_configuration_request(&mut self) { let (id, method, args) = self.read_request::<Value>(); assert_eq!(method, "workspace/configuration"); let params = args.as_ref().unwrap().as_object().unwrap(); let items = params.get("items").unwrap().as_array().unwrap(); - let settings_object = settings.as_object().unwrap(); + let config_object = self.config.as_object().unwrap(); let mut result = vec![]; for item in items { let item = item.as_object().unwrap(); let section = item.get("section").unwrap().as_str().unwrap(); - result.push(settings_object.get(section).cloned().unwrap_or_default()); + result.push(config_object.get(section).cloned().unwrap_or_default()); } self.write_response(id, result); } |